C90 (gcc), 46 bayt
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
Giriş, komut satırı argümanları (her argüman başına bir tamsayı), çıkış kodu ile çıkar .
Çevrimiçi deneyin!
Nasıl çalışır
r global bir değişkendir. Türü varsayılan olarak int ve genel olarak, varsayılan olarak 0'dır .
C işlev argümanı , int olarak da öntanımlıdır . N Boolean dizileri için n + 1 tamsayısını tutacaktır ; ana ilk argümanı her zaman çalıştırılabilir yoludur.
İşlev argümanı v , olarak bildirildi int**
. Gerçek v tipi olacaktır char**
, ancak 0 (kod noktası 48 ) ve 1 (kod noktası 49 ) karakterlerini birbirinden ayırmak için her argümanın en az anlamlı bitini inceleyeceğimiz için , bu küçük-endian dillerinde önemli olmaz makineleri.
While döngüsü c'yi azaltır ve 0 ile karşılaştırır . Bir kez c ulaşır 0 , biz döngünün dışında kırarım. Bu sadece dizi 0 içermiyorsa gereklidir .
Sürece 0<--c
döner 1 , biz alır c inci komut satırı bağımsız ( v[c]
) ve işaretçiyi kaldırma tarafından ile ilk karakteri özü ( *
). Biz ikilik VE Boolean almak 0<--c
koşulu dönecektir böylece, ve karakter (ve onu takip üç çöp baytlık) kod noktası 0 bir kez 0 karşılaşıldığında döngünün dışında kırarak,.
Komut satırı bağımsız buna karşın kalan durumda, 1 , r++
artırır r ile 1 böylece arka sayısının sayılması, 1 's.
Son olarak, c=r
hesaplanan değeri depolayan r içinde c . Varsayılan ayarlarla, derleyici atamayı optimize eder ve kaldırır; aslında movl %eax, -4(%rbp)
talimatı oluşturur . Yana ret
EAX kaydının döner değeri, bu arzu edilen bir çıktı üretir.
Bu kod unutmayın değil döndüren C99, çalışmak 0 dan ana sonuna eğer ana ulaşılır.
01100
?