C90 (gcc), 46 bytes
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
A entrada é via argumentos da linha de comando (um número inteiro por argumento), a saída é via código de saída .
Experimente online!
Como funciona
r é uma variável global. Seu tipo padrão é int e, sendo global, o valor padrão é 0 .
O argumento da função c também padroniza int . Ele manterá o número inteiro n + 1 para matrizes de n booleanos; o primeiro argumento de main é sempre o caminho do executável.
O argumento da função v é declarado como int**
. O tipo real de v será char**
, mas como examinaremos apenas o bit menos significativo de cada argumento para diferenciar os caracteres 0 (ponto de código 48 ) e 1 (ponto de código 49 ), isso não será importante para os pequenos endianistas. máquinas
O loop while diminui c e o compara a 0 . Uma vez que c atinge 0 , vamos sair do loop. Isso é necessário apenas se a matriz não contiver 0 .
Enquanto 0<--c
retorna 1 , que leva o c th argumento de linha de comando ( v[c]
) e extrair seu primeiro personagem com dereferenciando o ponteiro ( *
). Tomamos o AND bit a bit do Booleano 0<--c
e o ponto de código do caractere (e três bytes de lixo que o seguem), portanto a condição retornará 0 assim que um 0 for encontrado, interrompendo o loop.
No outro caso, enquanto os argumentos de linha de comando são 1 , r++
incrementa r por 1 , tendo assim em conta o número de arrasto 1 's.
Por fim, c=r
armazena o valor calculado de r em c . Com as configurações padrão, o compilador otimiza e remove a atribuição; na verdade gera a movl %eax, -4(%rbp)
instrução. Como ret
retorna o valor do registro EAX, isso gera a saída desejada.
Observe que esse código não funciona com C99, que retorna 0 do main se o final do main for atingido.
01100
?