C90 (gcc), 46 Bytes
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
Die Eingabe erfolgt über Befehlszeilenargumente (eine Ganzzahl pro Argument) und die Ausgabe über Exit-Code .
Probieren Sie es online!
Wie es funktioniert
r ist eine globale Variable. Sein Typ ist standardmäßig int und als globaler Wert standardmäßig 0 .
Das Funktionsargument c ist ebenfalls standardmäßig int . Es wird die ganze Zahl n + 1 für Arrays von n Booleschen Werten enthalten. Das erste Argument von main ist immer der Pfad der ausführbaren Datei.
Das Funktionsargument v wird als deklariert int**
. Der tatsächliche Typ von v ist char**
, aber da wir nur das niedrigstwertige Bit jedes Arguments untersuchen, um die Zeichen 0 (Codepunkt 48 ) und 1 (Codepunkt 49 ) voneinander zu unterscheiden, ist dies für Little-Endian nicht von Bedeutung maschinen.
Die while-Schleife dekrementiert c und vergleicht es mit 0 . Sobald c 0 erreicht , brechen wir aus der Schleife aus. Dies wird nur benötigt, wenn das Array keine 0 enthält .
Solange 0<--c
kehrt 1 , wir die Takes c th Befehlszeilenargument ( v[c]
) und dessen erstes Zeichen durch Extrahieren mit dereferenzieren den Zeiger ( *
). Wir nehmen die bitweise UND -Verknüpfung der Booleschen 0<--c
und den Codepunkt des Zeichens (und drei Müll Bytes , die ihm folgen), so dass der Zustand zurückkehren 0 einmal 0 angetroffen wird, aus der Schleife zu brechen.
In dem verbleibenden Fall, während die Befehlszeilenargumente sind 1 , r++
inkrementiert r von 1 , wodurch die Anzahl der Zählung nachlauf 1 ‚s.
Schließlich c=r
speichert den berechneten Wert von R in c . Mit den Standardeinstellungen optimiert und entfernt der Compiler die Zuordnung. es erzeugt tatsächlich die movl %eax, -4(%rbp)
Anweisung. Da ret
der Wert des EAX-Registers zurückgegeben wird, wird die gewünschte Ausgabe generiert.
Beachten Sie, dass dieser Code nicht mit C99 funktioniert, das 0 von main zurückgibt, wenn das Ende von main erreicht ist.
01100
?