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
t+=(c=='>')-(c=='<');dengant+=c=='>';t-=c=='<';, yang lain dengan menggantiB=B+[t]*(c=='*')denganB+=[t]*(c=='*'), dan yang ketiga dengan menggantip+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;denganp+=1+F.get(p,0)*-~-b-R.get(p,0)*b;. Jawaban bagus! (Maaf, saya tahu jawaban ini sangat tua!)