Giải thích whatfuck


8

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ả 1nế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 1bit hiện tại.

Chương trình chấm dứt 0nế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 0thì 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ử 0trướ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, bcnhư vậy

(a XOR b) AND (a XOR c) AND (b XOR c) là đúng?

?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0

Câu trả lời:


5

Python, 305 ký tự

P=raw_input()+'$'
S=[(0,0,[])]
F={}
R={}
i=r=0
for c in P:
 if'['==c:S+=i,
 if']'==c:j=S.pop();F[j]=R[i]=i-j
 i+=1
while S*(1-r):p,t,B=S.pop(0);c=P[p];b=B.count(t)%2;p+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;t+=(c=='>')-(c=='<');B=B+[t]*(c=='*');r|=(c=='$')&b;S+=[(p,t,B)]*(c!='$')+[(p,t,B+[t])]*(c=='?')
print r

Theo dõi tập hợp các trạng thái không xác định S, mỗi trạng thái có vị trí mã p, vị trí băng tvà danh sách các chỉ mục băng B. Một chỉ mục băng có thể xuất hiện nhiều lần trong danh sách B, băng ở chỉ mục đó là 1 nếu chỉ mục xuất hiện một số lần lẻ B.


Lưu 1 byte bằng cách thay thế t+=(c=='>')-(c=='<');bằng t+=c=='>';t-=c=='<';, một cái khác bằng cách thay thế B=B+[t]*(c=='*')bằng B+=[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ằng p+=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ũ!)
osuka_

5

Vô hạn băng ahoy!

Haskell, 516

i((p:l,r),(π,'<':φ))=[((l,p:r),('<':π,φ))]
i((l,p:r),(π,'>':φ))=[((p:l,r),('>':π,φ))]
i((l,p:r),(π,'*':φ))=[((l,1-p:r),('*':π,φ))]
i((l,_:r),(π,'?':φ))=[((l,b:r),('?':π,φ))|b<-[0,1]]
i(s@(l,0:r),(π,'[':φ))=[(s,m(']':π,φ)0)]
i(s,(π,'[':φ))=[(s,(']':π,φ))]
i(s,(π,']':φ))=[(s,ξ$m(']':φ,π)0)]
i _=[]
m(l,']':r)0=('[':l,r)
m(l,']':r)n=m('[':l,r)$n-1
m(l,'[':r)n=m(']':l,r)$n+1
m(l,c:r)n=m(c:l,r)n
ν=null;ο=0:ο
μ[]="0"
μ ω|ν[ψ|ψ@((_,b:_),_)<-ω,b>0,ν$i ψ]=μ$ω>>=i
μ _="1"
ξ(a,b)=(b,a)
main=interact$ \ζ->μ[((ο,ο),("",ζ))]

1
Thật đáng chú ý khi tần suất các câu trả lời của Haskell thành công trong việc giành được số phiếu cao nhất ngay cả khi có những câu trả lời khác có điểm số khách quan hơn ...
đã ngừng quay ngược lại vào

μ :) ..............
kẻ lừa đảo kẻ lừa đảo

1

Con trăn ( 405 399 379)

Nó nhận đầu vào trên một dòng, nhưng tôi "có thể giả sử chương trình whatfuck chỉ chứa các ký tự []<>*?" và dòng mới không có trong danh sách đó: P

w, i, p, a = {}, 0, raw_input (), [(0,0, [], [])]
cho c trong p:
 nếu c == '[': a + = i,
 nếu c == ']': g = a.pop (); w [i], w [g] = g, i
 tôi + = 1
i, z = 0, lambda l: l và l.pop () hoặc 0
trong khi một:
 n, c, l, r = a.pop (0)
 thử: o = p [n]
 ngoại trừ:
        nếu c: i = 1; nghỉ
        tiếp tục
 nếu o == '*': c = không c
 nếu o == '>': l + = c ,; c = z (r)
 nếu o == '<': r + = c ,; c = z (l)
 nếu o trong '[]' và (']' == o) == c: n = w [n]
 nếu o == '?': a + = (n + 1, không phải c, l [:], r [:]),
 a + = (n + 1, c, l, r),
in tôi


1
.append(item)-> +=[item], xóa kvà thay thế tất cả các cuộc gọi bằng a+=[...]để lưu một vài ký tự.
beary605

@ beary605: cảm ơn, tuy nhiên tôi đã kết thúc bằng cách sử dụng +=item,thậm chí còn ngắn hơn.
bến
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.