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
sumber
0
dan1
?×+"10 10
dalam kasus uji, atau contoh lain yang 1) menggunakan spasi dan 2) menunda penggunaan operator duplikat (dua hal yang saya lewatkan sepenuhnya).Jawaban:
JavaScript (ES6),
204203200 byteMengembalikan bilangan bulat.
Karakter yang digunakan:
+
: tambahan*
: perkalian#
: kesetaraand
: duplikat-
: negatifUji kasus
Tampilkan cuplikan kode
Diformat dan dikomentari
sumber
-1+-2
. Mengembalikan 3 bukannya -3.-
harus segera diterapkan-1
.-
akan pergi2
karena datang setelah operator lain. Mungkin @HyperNeutrino dapat mengklarifikasi. Operator negatif mungkin ambigu dalam beberapa situasi.JavaScript (ES6),
162152143150 byteSedikit tidak berbulu:
Penjelasan
Saya menggunakan
*
untuk perkalian danR
duplikat. Operator lain sama seperti dalam pertanyaan.N
menjadi array angka (termasuk duplikat).The
replace
menangani kasus di mana tanda negatif datang setelah nomor. Misalnya, itu akan berubah1-
ke- 1
dan-1-
ke- -1
.Di dalam
eval
,s.match
menciptakan array dari operator biner. Perhatikan bahwa ini akan selalu memiliki satu elemen lebih sedikit daripadaN
.Hasil dari fungsi adalah
eval
pemetaan angka dan operator.Berikut ini apa yang harus dilakukan
eval
untuk setiap kasus uji:Operator koma dalam ekspresi JavaScript mengembalikan hasil dari ekspresi terakhirnya, sehingga
map
secara otomatis mengembalikan ekspresi yang dapat digunakan.The
+
tanda diperlukan sebelumeval
berubahtrue
untuk1
danfalse
untuk0
.Penggunaan
R
sebagai variabel dan operator duplikat sangat menyederhanakanmap
sub-ekspresi.Kasus uji:
Tampilkan cuplikan kode
sumber
replace
pekerjaan seperti yang dimaksudkan. Ini mengembalikan3
untuk-1+--2
dan saya pikir1
akan benar (1
perubahan menandatangani tiga kali sebelum ada argumen kedua untuk yang+
tersedia, menghasilkan-1 + 2
).JavaScript,
321311 byteCobalah online!
Kelima karakter itu sama seperti dalam pertanyaan, kecuali
*
untuk perkalian.Script dikompres menggunakan RegPack . Script asli disimpan dalam variabel
_
setelah evaluasi.sumber
-1+-2
. Mengembalikan 3 bukannya -3.-3
bukan3
?-1 + -2
apakah-3
, tetapi harus diuraikan sebagai--1 + 2
gantinya?3
.2
Bahkan sebelum datang di tumpukan, yang kedua-
dievaluasi, dan oleh karena itu kita punya1 2 +
yang memang3
. Ah, dan mungkin Anda harus mengedit jawaban Anda juga.Haskell , 251 byte
Cobalah online! Gunakan karakter berikut:
a
untuk tambahan,m
untuk perkalian,q
untuk kesetaraan,D
untuk duplikat danN
untuk negasi. (Saya ingin menggunakane
untuk kesetaraan, tetapi mengalami masalah yanglex
diuraikan2e3
sebagai angka.) Contoh penggunaan:(#([],[])) "2a3 4m"
hasil20
.sumber
6502 kode mesin (C64), 697 byte
Demo online
Pemakaian
sys49152
, lalu masukkan ekspresi perbaikan apa pun dan tekan kembali.*
, semua yang lain seperti yang disarankan.Inilah kode sumber assembler gaya ca65 yang dapat dibaca .
sumber
VB.NET (.NET 4.5)
615576 byte-39 byte terima kasih kepada Felix Palmen dengan mengubah
\r\n
ke\n
Membutuhkan
Imports System.Collections.Generic
(termasuk dalam jumlah byte)Titik masuknya adalah Function
A
, yang mengambil string sebagai input dan mengembalikan aStack(Of Long)
.Simbol:
+
*
=
-
d
Gambaran:
Fungsi
A
mengambil input dan tokenizes itu. Ini menggunakanLong?
untuk melakukan total berjalan untuk bilangan bulat multi-digit, yangNothing
menandakan kita saat ini tidak membaca bilangan bulat.Subroutine
E
mengambil tumpukan bilangan bulat dan antrian operator, dan mengevaluasi notasi perbaikan apa pun. Itu menyebut dirinya secara rekursif sampai tidak ada tindakan yang tersisa.Saya mendeklarasikan params global sekaligus untuk menghemat byte pada deklarasi dan parameter yang lewat.
Nilai kembali dari
A
ditetapkan dengan menetapkan nilai ke variabel yang cocokA
.VB
True
setara dengan-1
, sehingga operasi harus meniadakan hasil untuk mendapatkan nilai yang benar.Cobalah online!
sumber
Imports
, saya mendapatkan hitungan byte saja576
- bisakah Anda salah menghitung ?\r\n
alih - alih\n
, jadi di situlah perbedaannya.