C90 (gcc), 46 byte
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
L'input avviene tramite argomenti della riga di comando (un numero intero per argomento), output tramite il codice di uscita .
Provalo online!
Come funziona
r è una variabile globale. Il suo tipo di default è int e, essendo globale, il suo valore predefinito è 0 .
Anche l'argomento funzione c viene impostato su int . Conterrà l'intero n + 1 per le matrici di n booleani; il primo argomento di main è sempre il percorso dell'eseguibile.
L'argomento della funzione v è dichiarato come int**
. Il tipo effettivo di v sarà char**
, ma poiché esamineremo solo il bit meno significativo di ogni argomento per distinguere i caratteri 0 (punto di codice 48 ) e 1 (punto di codice 49 ), questo non importerà su little-endian macchinari.
Il ciclo while decrementa c e lo confronta con 0 . Una volta che c raggiunge 0 , usciremo dal ciclo. Ciò è necessario solo se l'array non contiene 0 .
Finché 0<--c
i rendimenti 1 , si prende la c ° argomento della riga di comando ( v[c]
) ed estrarre il suo primo personaggio con dereferenziando il puntatore ( *
). Prendiamo il bit bit AND del booleano 0<--c
e il punto di codice del carattere (e tre byte di immondizia che lo seguono), quindi la condizione restituirà 0 una volta che si incontra uno 0 , uscendo dal ciclo.
Nel resto del caso, mentre gli argomenti della riga di comando sono 1 , r++
incrementa r di 1 , contando così il numero di 1 finali .
Infine, c=r
memorizza il valore calcolato di r in c . Con le impostazioni predefinite, il compilatore ottimizza e rimuove l'assegnazione; in realtà genera l' movl %eax, -4(%rbp)
istruzione. Poiché ret
restituisce il valore del registro EAX, questo genera l'output desiderato.
Si noti che questo codice non funziona con C99, che restituisce 0 da main se viene raggiunta la fine di main .
01100
.