Dalam notasi awalan, operator datang sebelum argumen, sehingga Anda bisa membayangkan bahwa operator memanggil next()
yang secara rekursif dipanggil. Dalam notasi infiks, operator beralih di antara argumen, sehingga Anda dapat membayangkannya hanya sebagai parse tree. Dalam notasi postfix, operator datang setelah argumen, jadi Anda bisa membayangkannya sebagai berbasis stack.
Dalam notasi perbaikan apa pun, operator dapat pergi ke mana saja * . Jika operator muncul dan tidak ada cukup argumen, maka operator menunggu sampai ada cukup argumen. Untuk tantangan ini, Anda harus menerapkan evaluator perbaikan apa pun yang sangat mendasar. (Perhatikan bahwa perbaikan apa pun adalah bahasa rekreasional yang saya tinggalkan yang dapat Anda mainkan di sini atau lihat di sini )
Anda harus mendukung perintah berikut:
(Arity 1)
- duplikat
- negatif
(Arity 2)
- tambahan
- perkalian
- kesetaraan: pengembalian
0
atau1
.
Anda dapat memilih untuk menggunakan lima simbol non-spasi putih untuk perintah ini. Untuk tujuan demonstrasi, saya akan menggunakan "
sebagai duplikat, ×
sebagai perkalian, dan +
sebagai tambahan.
Untuk literal, Anda hanya perlu mendukung bilangan bulat non-negatif, tetapi juru bahasa Anda harus dapat memuat semua bilangan bulat (dalam rentang bilangan bulat (wajar) bahasa Anda).
Mari kita lihat sebuah contoh: 10+5
. Penyimpanan harus berperilaku sebagai tumpukan, bukan antrian. Jadi pertama-tama, tumpukan dimulai []
, dan daftar operator yang antri dimulai pada []
. Kemudian, literal 10
dievaluasi yang membuat stack [10]
. Selanjutnya, operator +
dievaluasi, yang membutuhkan dua argumen. Namun, hanya ada satu argumen di stack, sehingga daftar operator yang antri menjadi ['+']
. Kemudian, literal 5
dievaluasi yang membuat stack [10, 5]
. Pada titik ini, operator '+'
dapat dievaluasi sehingga, membuat tumpukan [15]
dan antrian []
.
Hasil akhir harus [15]
untuk + 10 5
, 10 + 5
, dan 10 5 +
.
Mari kita lihat contoh lebih keras: 10+"
. Tumpukan dan antrian dimulai dengan []
dan []
. 10
dievaluasi terlebih dahulu yang membuat stack [10]
. Selanjutnya, +
dievaluasi, yang tidak mengubah tumpukan (karena tidak ada cukup argumen) dan membuat antrian ['+']
. Kemudian, "
dievaluasi. Ini bisa langsung berjalan begitu saja, membuat stack [10, 10]
. +
sekarang dapat dievaluasi sehingga tumpukan menjadi [20]
dan antrian []
. Hasil akhirnya adalah [20]
.
Bagaimana dengan urutan operasi?
Mari kita lihat ×+"10 10
. Tumpukan dan antrian memulai keduanya sebagai []
:
×
: Tumpukan tidak berubah dan antrian menjadi['×']
.+
: Tumpukan tidak berubah dan antrian menjadi['×', '+']
."
: Tumpukan tidak berubah dan antrian menjadi['×', '+', '"']
.10
: Tumpukan menjadi[10]
. Meskipun×
harus menjadi operator pertama yang dievaluasi sejak muncul pertama kali,"
dapat segera berjalan dan tidak ada operator sebelum itu, sehingga dievaluasi. Tumpukan menjadi[10, 10]
dan antrian['×', '+']
.×
sekarang dapat dievaluasi, yang membuat tumpukan[100]
dan antrian['+']
.10
: Tumpukan menjadi[100, 10]
, yang memungkinkan+
untuk dievaluasi. Tumpukan menjadi[110]
dan antrian[]
.
Hasil akhirnya adalah [110]
.
Perintah yang digunakan dalam demonstrasi ini konsisten dengan perintah dari bahasa perbaikan apa pun; namun, contoh terakhir tidak akan berfungsi karena ada bug pada juru bahasa saya. (Penafian: Kiriman Anda tidak akan digunakan dalam penerjemah perbaikan apa pun)
Tantangan
Pilih satu set 5 karakter non-spasi-kosong non-digit dan buat penerjemah perbaikan apa pun sesuai dengan spesifikasi di atas. Program Anda dapat menampilkan array tunggal atau nilai yang terkandung di dalamnya; dijamin bahwa tumpukan nilai hanya akan berisi nilai tunggal pada akhir eksekusi dan bahwa antrian operator akan kosong pada akhir eksekusi.
Ini adalah kode-golf sehingga kode terpendek dalam byte menang.
Uji Kasus
Untuk kasus uji ini, duplikat adalah "
, negatif adalah -
, tambahan adalah +
, perkalian adalah ×
, dan kesetaraan =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Aturan
- Celah Standar Berlaku
- Anda dapat mengambil juru bahasa resmi apa pun dan mengubahnya jika Anda mau. Harapkan untuk kehilangan mengerikan.
Input akan diberikan sebagai string dan output sebagai array, integer tunggal, keluar dari representasi string keduanya. Anda dapat berasumsi bahwa input hanya akan berisi spasi, digit, dan 5 karakter yang Anda pilih.
* sebenarnya tidak
0
dan 1
?
×+"10 10
dalam kasus uji, atau contoh lain yang 1) menggunakan spasi dan 2) menunda penggunaan operator duplikat (dua hal yang saya lewatkan sepenuhnya).