Menafsirkan apa-apa

8

Smallfuck adalah bahasa seperti brainfuck dengan sel 1-bit. Ini memiliki instruksi berikut:

> 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 menambahkan satu instruksi lagi:

? Nondeterministically set the current bit to 0 or 1.

Program whatfuck tidak menerima input apa pun. Ini dapat menghasilkan salah satu dari 3 kemungkinan: 1(menerima), 0(menolak) atau mungkin tidak pernah berhenti.

Program akan menghasilkan 1jika ada urutan bit yang dipilih untuk ?s yang mengakibatkan program berakhir dengan 1bit saat ini.

Program berakhir dengan 0jika semua pilihan yang mungkin berakhir dengan bit saat ini 0,

Jika beberapa pilihan tidak berakhir, dan semua pilihan yang berakhir dengan itu 0, maka program tidak akan pernah berakhir.

Penerjemah Anda harus menjalankan semua kemungkinan secara bersamaan. Anda tidak dapat mencoba 0dulu dan kemudian mencoba 1, karena beberapa program tidak akan berhenti ketika seharusnya. Misalnya, *[?*]*akan menerima dengan pilihan 1, tetapi tidak pernah berhenti jika Anda selalu memilih 0.

Sebagai contoh, berikut adalah juru bahasa python 2 yang saya tulis, bukan golf

Aturan

  • Penerjemah Anda harus menerima program whatfuck dari stdin dan mencetak hasilnya.

  • Anda dapat menganggap program whatfuck hanya berisi karakter []<>*?

  • Array bit tidak dibatasi di kedua ujungnya.

  • Kode terpendek menang.

Beberapa Kasus Uji

Ini akan gagal jika kode Anda selalu mencoba 0terlebih dahulu

*[?*]*
1

Apakah ada himpunan bagian {-7,-3, 5, 8}yang jumlahnya 3?

*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1

Apakah ada himpunan bagian {-7,-3, 5, 8}yang jumlahnya 4?

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

Apakah ada cara untuk menetapkan nilai boolean a, bdan cseperti itu

(a XOR b) AND (a XOR c) AND (b XOR c) adalah benar?

?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
kotak kardus
sumber

Jawaban:

5

Python, 305 karakter

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

Melacak set negara bagian nondeterministic di S, masing-masing dengan posisi kode p, posisi pita t, dan daftar indeks rekaman B. Indeks rekaman dapat muncul beberapa kali dalam daftar B, rekaman di indeks itu adalah 1 jika indeks muncul beberapa kali dalam B.

Keith Randall
sumber
Simpan 1 byte dengan mengganti t+=(c=='>')-(c=='<');dengan t+=c=='>';t-=c=='<';, yang lain dengan mengganti B=B+[t]*(c=='*')dengan B+=[t]*(c=='*'), dan yang ketiga dengan mengganti p+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;dengan p+=1+F.get(p,0)*-~-b-R.get(p,0)*b;. Jawaban bagus! (Maaf, saya tahu jawaban ini sangat tua!)
osuka_
5

Kaset ahoy tak terbatas!

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$ \ζ->μ[((ο,ο),("",ζ))]
tidak lagi mengaktifkan counterclockwis
sumber
1
Sungguh luar biasa betapa seringnya jawaban Haskell berhasil mendapatkan suara terbanyak walaupun ada jawaban lain dengan skor yang lebih baik secara obyektif di sekitar ...
berhenti mengubah counterclockwis
μ :) ..............
luser droog
1

Python ( 405 399 379)

Dibutuhkan input pada satu baris, tetapi saya "dapat mengasumsikan program whatfuck hanya berisi karakter []<>*?" dan baris baru tidak ada dalam daftar itu: P

w, i, p, a = {}, 0, raw_input (), [(0,0, [], [])]
untuk c dalam p:
 jika c == '[': a + = i,
 jika c == ']': g = a.pop (); w [i], w [g] = g, i
 i + = 1
i, z = 0, lambda l: l dan l.pop () atau 0
sementara a:
 n, c, l, r = a.pop (0)
 coba: o = p [n]
 kecuali:
        jika c: i = 1; break
        terus
 jika o == '*': c = tidak c
 jika o == '>': l + = c,; c = z (r)
 jika o == '<': r + = c,; c = z (l)
 jika o dalam '[]' dan (']' == o) == c: n = w [n]
 jika o == '?': a + = (n +1, bukan c, l [:], r [:]),
 a + = (n +1, c, l, r),
cetak saya

marinus
sumber
1
.append(item)-> +=[item], hapus kdan ganti semua panggilan dengan a+=[...]untuk menyimpan beberapa karakter.
beary605
@ beary605: terima kasih, namun akhirnya saya menggunakan +=item,yang lebih pendek.
marinus