C90 (gcc), 46 byte
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
Đầu vào là thông qua các đối số dòng lệnh (một số nguyên cho mỗi đối số), đầu ra thông qua mã thoát .
Hãy thử trực tuyến!
Làm thế nào nó hoạt động
r là một biến toàn cục. Kiểu của nó mặc định là int và, là toàn cục, nó có giá trị mặc định là 0 .
Đối số hàm c mặc định là int . Nó sẽ giữ số nguyên n + 1 cho các mảng của n Booleans; đối số đầu tiên của chính luôn là đường dẫn của tệp thực thi.
Đối số hàm v được khai báo là int**
. Loại v thực tế sẽ là char**
, nhưng vì chúng ta sẽ chỉ kiểm tra bit có ý nghĩa nhỏ nhất của mỗi đối số để phân biệt các ký tự 0 (mã điểm 48 ) và 1 (mã điểm 49 ) máy móc.
Vòng lặp while giảm c và so sánh nó với 0 . Khi c đạt 0 , chúng ta sẽ thoát ra khỏi vòng lặp. Điều này chỉ cần thiết nếu mảng không chứa 0 's.
Chừng nào 0<--c
trở về 1 , chúng tôi sẽ đưa các c th đối số dòng lệnh ( v[c]
) và trích xuất ký tự đầu tiên của mình với bởi dereferencing con trỏ ( *
). Chúng ta lấy bit AND của Boolean 0<--c
và điểm mã của ký tự (và ba byte rác theo sau nó), do đó điều kiện sẽ trả về 0 khi gặp 0 , thoát khỏi vòng lặp.
Trong trường hợp còn lại, trong khi các đối số dòng lệnh là 1 , r++
tăng r lên 1 , do đó đếm số lượng theo dõi 1 's.
Cuối cùng, c=r
lưu trữ giá trị tính toán của r trong c . Với các thiết lập mặc định, trình biên dịch tối ưu hóa và loại bỏ gán; nó thực sự tạo ra movl %eax, -4(%rbp)
hướng dẫn. Vì ret
trả về giá trị của thanh ghi EAX, điều này tạo ra đầu ra mong muốn.
Lưu ý rằng mã này không hoạt động với C99, trả về 0 từ chính nếu đạt đến cuối của chính .
01100
?