C90 (gcc), 46 byte
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
Input melalui argumen baris perintah (satu integer per argumen), output melalui kode keluar .
Cobalah online!
Bagaimana itu bekerja
r adalah variabel global. Jenisnya default ke int dan, karena bersifat global, nilainya default ke 0 .
Argumen fungsi c juga default untuk int . Ini akan menyimpan integer n +1 untuk array n Boolean; argumen pertama dari utama adalah selalu path dari executable.
Argumen fungsi v dinyatakan sebagai int**
. Jenis sebenarnya dari v adalah char**
, tetapi karena kita hanya akan memeriksa bit paling tidak signifikan dari setiap argumen untuk memberi tahu karakter 0 (titik kode 48 ) dan 1 (titik kode 49 ), ini tidak akan berpengaruh pada little-endian mesin.
Loop sementara menurunkan c dan membandingkannya dengan 0 . Setelah c mencapai 0 , kami akan keluar dari loop. Ini diperlukan hanya jika array mengandung no 0 's.
Selama 0<--c
pengembalian 1 , kita mengambil c th argumen baris perintah ( v[c]
) dan ekstrak karakter pertama dengan oleh dereferencing pointer ( *
). Kami mengambil bitwise AND dari Boolean 0<--c
dan titik kode karakter (dan tiga byte sampah yang mengikutinya), sehingga kondisinya akan mengembalikan 0 sekali 0 ditemui, keluar dari loop.
Dalam kasus yang tersisa, sedangkan argumen baris perintah adalah 1 , r++
bertambah r dengan 1 , sehingga menghitung jumlah trailing 1 's.
Akhirnya, c=r
simpan nilai yang dihitung dari r in c . Dengan pengaturan default, kompiler mengoptimalkan dan menghapus tugas; sebenarnya menghasilkan movl %eax, -4(%rbp)
instruksi. Karena ret
mengembalikan nilai register EAX, ini menghasilkan output yang diinginkan.
Perhatikan bahwa kode ini tidak berfungsi dengan C99, yang mengembalikan 0 dari main jika akhir main tercapai.
01100
?