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<--cpengembalian 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<--cdan 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=rsimpan nilai yang dihitung dari r in c . Dengan pengaturan default, kompiler mengoptimalkan dan menghapus tugas; sebenarnya menghasilkan movl %eax, -4(%rbp)instruksi. Karena retmengembalikan 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?