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 1
jika ada urutan bit yang dipilih untuk ?
s yang mengakibatkan program berakhir dengan 1
bit saat ini.
Program berakhir dengan 0
jika 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 0
dulu 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 0
terlebih 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
, b
dan c
seperti 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!)