Smallfuck là một ngôn ngữ giống như brainfuck với các tế bào 1 bit. Nó có các hướng dẫn sau:
> Increment the pointer
< Decrement the pointer
* Flip the current bit
[ If the current bit is not set, jump to the instruction after the matching ]
] If the current bit is set, jump to the instruction after the matching [
( or just jump unconditionally to matching [ )
Whatfuck thêm một hướng dẫn:
? Nondeterministically set the current bit to 0 or 1.
Một chương trình whatfuck không có bất kỳ đầu vào. Nó có thể dẫn đến một trong 3 khả năng: 1
(chấp nhận), 0
(từ chối) hoặc có thể không bao giờ dừng lại.
Chương trình sẽ dẫn đến kết quả 1
nếu tồn tại một chuỗi các bit được chọn cho ?
s, kết quả là chương trình kết thúc với 1
bit hiện tại.
Chương trình chấm dứt 0
nếu tất cả các lựa chọn có thể kết thúc với bit hiện tại 0
,
Nếu một số lựa chọn không chấm dứt và tất cả các lựa chọn chấm dứt thực hiện 0
thì chương trình sẽ không bao giờ chấm dứt.
Thông dịch viên của bạn nên chạy tất cả các khả năng cùng một lúc. Bạn không thể thử 0
trước rồi mới thử 1
, vì một số chương trình sẽ không chấm dứt khi cần. Ví dụ, *[?*]*
sẽ chấp nhận với lựa chọn 1
, nhưng không bao giờ chấm dứt nếu bạn luôn chọn 0
.
Ví dụ, đây là một trình thông dịch python 2 tôi đã viết, không chơi gôn
Quy tắc
Thông dịch viên của bạn phải chấp nhận một chương trình whatfuck từ stdin và in kết quả của nó.
Bạn có thể giả sử chương trình whatfuck chỉ chứa các ký tự
[]<>*?
Mảng bit không bị chặn ở cả hai đầu.
Mã ngắn nhất sẽ thắng.
Một số trường hợp thử nghiệm
Điều này sẽ thất bại nếu mã của bạn luôn cố gắng 0
đầu tiên
*[?*]*
1
Có một tập hợp con {-7,-3, 5, 8}
có tổng bằng 3 không?
*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1
Có một tập hợp con {-7,-3, 5, 8}
có tổng bằng 4 không?
*<<<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
0
Có cách nào để gán giá trị boolean cho a
, b
và c
như vậy
(a XOR b) AND (a XOR c) AND (b XOR c)
là đúng?
?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
t+=(c=='>')-(c=='<');
bằngt+=c=='>';t-=c=='<';
, một cái khác bằng cách thay thếB=B+[t]*(c=='*')
bằngB+=[t]*(c=='*')
và một phần ba bằng cách thay thếp+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;
bằngp+=1+F.get(p,0)*-~-b-R.get(p,0)*b;
. Câu trả lời chính xác! (Xin lỗi, tôi biết câu trả lời này là siêu cũ!)