C90 (gcc), 46 bytes
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
La entrada es a través de argumentos de línea de comandos (un número entero por argumento), la salida a través del código de salida .
Pruébalo en línea!
Cómo funciona
r es una variable global. Su tipo predeterminado es int y, al ser global, su valor predeterminado es 0 .
El argumento de la función c por defecto también es int . Retendrá el número entero n + 1 para matrices de n booleanos; El primer argumento de main es siempre la ruta del ejecutable.
El argumento de la función v se declara como int**
. El tipo real de v será char**
, pero dado que solo examinaremos el bit menos significativo de cada argumento para distinguir los caracteres 0 (punto de código 48 ) y 1 (punto de código 49 ), esto no importará en little-endian maquinas.
El ciclo while disminuye c y lo compara con 0 . Una vez que c alcanza 0 , saldremos del bucle. Esto es necesario solo si la matriz no contiene 0 's.
Siempre que 0<--c
devuelva 1 , tomamos el argumento de línea de comando c th ( v[c]
) y extraemos su primer carácter desreferenciando el puntero ( *
). Tomamos el AND bit a bit del Booleano 0<--c
y el punto de código del carácter (y los tres bytes de basura que lo siguen), por lo que la condición devolverá 0 una vez que se encuentre un 0 , rompiendo el bucle.
En el caso restante, mientras que los argumentos de la línea de comando son 1 , r++
incrementa r en 1 , contando así el número de 1 's posteriores .
Finalmente, c=r
almacena el valor calculado de r en c . Con la configuración predeterminada, el compilador optimiza y elimina la asignación; En realidad genera la movl %eax, -4(%rbp)
instrucción. Como ret
devuelve el valor del registro EAX, esto genera la salida deseada.
Tenga en cuenta que este código no funciona con C99, que devuelve 0 desde main si se alcanza el final de main .
01100
?