Anda harus mengevaluasi string yang ditulis dalam notasi Reverse Polish dan menghasilkan hasilnya.
Program harus menerima input dan mengembalikan output. Untuk bahasa pemrograman yang tidak memiliki fungsi untuk menerima input / output, Anda dapat mengasumsikan fungsi seperti readLine / print.
Anda tidak diizinkan menggunakan "eval" dalam program apa pun.
Angka dan operator dipisahkan oleh satu ruang atau lebih .
Anda harus mendukung setidaknya +, -, * dan / operator.
Anda perlu menambahkan dukungan ke angka negatif (misalnya, -4
tidak sama dengan 0 4 -
) dan angka floating point.
Anda dapat menganggap input tersebut valid dan mengikuti aturan di atas
Uji Kasus
Memasukkan:
-4 5 +
Keluaran:
1
Memasukkan:
5 2 /
Keluaran:
2.5
Memasukkan:
5 2.5 /
Keluaran:
2
Memasukkan:
5 1 2 + 4 * 3 - +
Keluaran:
14
Memasukkan:
4 2 5 * + 1 3 2 * + /
Keluaran:
2
~
. :-Peval
nomor parse? Kedengarannya sangat rusak. (GolfScript adalah salah satu bahasa seperti itu, sejauh yang saya tahu. Saya pikir itu rusak juga.)eval(s)
lebih baik daripadafloat(s)
Jawaban:
Ruby -
9577 karakterMengambil input pada stdin.
Kode pengujian
memberi
Tidak seperti versi C, ini mengembalikan hasil valid terakhir jika ada angka tambahan yang ditambahkan ke input.
sumber
Python - 124 karakter
Python - 133 karakter
sumber
0
operan kedua ...[a/b]
harus diganti denganb and[a/b]
sehingga Anda dapat memiliki 0 sebagai operan kedua.Skema, 162 karakter
(Jeda baris ditambahkan untuk kejelasan — semua adalah opsional.)
Versi berformat penuh (ungolfed):
Komentar yang dipilih
`(,foo ,@bar)
sama dengan(cons foo bar)
(yaitu, (secara efektif † ) mengembalikan daftar baru denganfoo
prepended tobar
), kecuali satu karakter lebih pendek jika Anda mengompres semua spasi.Dengan demikian, Anda dapat membaca klausa iterasi sebagai
(loop (cons token stack))
dan(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
jika itu lebih mudah di mata Anda.`((+ ,+) (- ,-) (* ,*) (/ ,/))
membuat daftar asosiasi dengan simbol yang+
dipasangkan dengan prosedur+
, dan juga dengan operator lain. Jadi ini adalah tabel pencarian simbol sederhana (kata-kata telanjang adalah(read)
sebagai simbol, itulah sebabnya tidak diperlukan proses lebih lanjuttoken
). Daftar asosiasi memiliki pencarian O (n), dan karenanya hanya cocok untuk daftar pendek, seperti halnya di sini. :-P† Ini secara teknis tidak akurat, tetapi, untuk programmer non-Lisp, ia mendapatkan ide yang cukup tepat.
sumber
lambda (ass)
+1 untuk pilihan nama variabel: Pc - 424 karakter yang diperlukan
Asumsikan bahwa Anda memiliki libc yang cukup baru untuk dimasukkan
getdelim
dalam stdio.h. Pendekatannya lurus ke depan, seluruh input dibaca ke dalam buffer, lalu kita tokenize denganstrsep
menggunakan panjang dan karakter awal untuk menentukan kelas masing-masing. Tidak ada perlindungan terhadap input yang buruk. Beri makan "+ - * / + - ...", dan ia dengan senang hati akan mengeluarkan barang-barang dari memori "di bawah" tumpukan hingga rusak. Semua non-operator ditafsirkan sebagai pelampungatof
yang berarti nilai nol jika mereka tidak terlihat seperti angka.Dapat dibaca dan dikomentari:
Validasi:
Heh! Harus mengutip apa pun dengan
*
di dalamnya ...dan test case saya sendiri
sumber
case
dengan makro.Haskell (155)
sumber
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
akan menghemat 14 karakter.MATLAB -
158, 147(input dibaca dari input pengguna, output dicetak).
Di bawah ini adalah kode yang telah diprogram dan dikomentari, cukup banyak mengimplementasikan algoritma postfix yang dijelaskan (dengan asumsi bahwa ekspresi adalah valid):
Bonus:
Pada kode di atas, kita asumsikan operator selalu biner (
+
,-
,*
,/
). Kita dapat menggeneralisasikannya dengan menggunakannargin(f)
untuk menentukan jumlah argumen yang dibutuhkan oleh operand / function, dan memunculkan jumlah nilai yang tepat dari stack sesuai dengan itu, seperti pada:Dengan begitu kita dapat mengevaluasi ekspresi seperti:
di mana
mean_of_three
fungsi yang ditentukan pengguna dengan tiga input:sumber
Perl (134)
Lain kali, saya akan menggunakan regexp hal rekursif.
Tidak Disatukan:
Saya pikir F # adalah satu-satunya bahasa pemrograman impian saya ...
sumber
Windows PowerShell, 152
181192Dalam bentuk yang dapat dibaca, karena saat ini hanya ada dua baris tanpa peluang untuk memecahnya:
2010-01-30 11:07 (192) - Upaya pertama.
2010-01-30 11:09 (170) - Mengubah fungsi menjadi scriptblock memecahkan masalah ruang lingkup. Buat setiap doa dua byte lebih lama.
2010-01-30 11:19 (188) - Tidak menyelesaikan masalah ruang lingkup, test case hanya menutupinya. Menghapus indeks dari hasil akhir dan menghapus jeda baris yang berlebihan. Dan berubah ganda menjadi
float
.2010-01-30 11:19 (181) - Bahkan tidak bisa mengingat saran saya sendiri. Casting ke tipe numerik dapat dilakukan dalam satu karakter.
2010-01-30 11:39 (152) - Sangat dikurangi dengan menggunakan pencocokan regex di
switch
. Selesaikan sepenuhnya masalah ruang lingkup sebelumnya dengan mengakses tumpukan untuk melewatinya.sumber
Raket 131:
Pemutusan saluran opsional.
Berdasarkan solusi Chris Jester-Young untuk Skema.
sumber
Python, 166 karakter
sumber
raw_input()
kode tidak terbagi dalam beberapa baris.from operator import*
dan gantio.div
dengandiv
.Python 3, 119 byte
Memasukkan:
5 1 1 - -7 0 * + - 2 /
Keluaran:
2.5
(Anda dapat menemukan versi 128-karakter Python dalam sejarah edit.)
sumber
/
dalam string.ZeroDivisionError
saat operan kedua adalah 0 (mis5 0 +
.).ord(x) - 42
metode ini.JavaScript (157)
Kode ini mengasumsikan ada dua fungsi ini: readLine dan cetak
sumber
prompt()
bukanreadLine()
(dan mungkinalert()
bukanprint()
untuk mencocokkanprompt()
).Perl, 128
Ini tidak benar-benar kompetitif di sebelah jawaban Perl lainnya, tetapi mengeksplorasi jalur (suboptimal) yang berbeda.
Karakter dihitung sebagai berbeda dengan
perl -e ''
doa sederhana .sumber
Python, 161 karakter:
sumber
PHP,
439265263262244240 karakterKode ini harus bekerja dengan stdin, meskipun tidak diuji dengan stdin.
Telah diuji pada semua kasus, output (dan kode) untuk yang terakhir ada di sini:
http://codepad.viper-7.com/fGbnv6
Tidak dikumpulkan,
314330326 karaktersumber
flex - 157
Jika Anda tidak terbiasa, kompilasi dengan
flex rpn.l && gcc -lfl lex.yy.c
sumber
Python, 130 karakter
Akan menjadi 124 karakter jika kita menjatuhkan
b and
(yang beberapa jawaban Python hilang). Dan itu menggabungkan 42!sumber
Python 3,
126132 karakterSudah ada solusi yang lebih baik, tetapi sekarang saya telah menulisnya (tanpa harus membaca kiriman sebelumnya, tentu saja - meskipun saya harus mengakui bahwa kode saya terlihat seolah-olah saya telah menyalinnya bersama-sama), saya ingin membagikannya, terlalu.
sumber
b/a
harus diganti dengana and b/a
, jika tidak solusi ini tidak akan berfungsi jika operan kedua adalah 0 (mis4 0 -
.).c99 gcc 235
Ini bekerja untuk saya (dengan peringatan):
Tetapi jika Anda mengompilasinya dengan mingw32 Anda harus mematikan globbing (lihat https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) dengan mengkompilasi seperti ini:
Jika Anda tidak * secara otomatis diperluas oleh mingw32 CRT.
Adakah yang tahu bagaimana cara berubah
break;case'*':s[--d]*=s[d+1];
menjadi makro yang menerima karakter + sebagai parameter karena dengan demikian keempat kasus hanya akan menjadiO(+)O(-)O(*)O(/)
sumber
C,
232229 byteBersenang-senang dengan rekursi.
Tidak Disatukan:
Kasus uji:
sumber
JavaScript ES7, 119 byte
Saya mendapatkan bug dengan pemahaman array jadi saya gunakan
.map
Cobalah online di ESFiddle
sumber
PHP - 259 karakter
Mengasumsikan input dalam variabel POST i .
sumber
C # - 392 karakter
Namun, jika argumen dapat digunakan alih-alih input standar, kita dapat membawanya ke
C # - 366 karakter
sumber
Scala
412 376 349 335312:sumber
Python - 206
Versi tidak disatukan:
Masukan dari argumen baris perintah; output pada output standar.
sumber
ECMAScript 6 (131)
Hanya mengetik bersama dalam beberapa detik, jadi mungkin bisa bermain golf lebih jauh atau bahkan mendekati lebih baik. Saya mungkin akan mengunjungi lagi besok:
sumber
C # -
323284241Sunting: Mengganti Stack dengan Array jauh lebih pendek
Sunting2: Mengganti ifs dengan ekspresi ternary
sumber
string[] i
=>string[]i
.Python 2
Saya sudah mencoba beberapa pendekatan berbeda dengan yang diterbitkan sejauh ini. Tidak satu pun dari ini yang sesingkat solusi Python terbaik, tetapi mereka mungkin masih menarik bagi sebagian dari Anda.
Menggunakan rekursi, 146
Menggunakan manipulasi daftar, 149
Menggunakan
reduce()
, 145sumber
Matlab, 228
Tidak Disatukan:
sumber
;
. Jadi saya pikir jumlah byte samacr+lf
untuk baris baru, yaitu 2 karakter. Notepad saya ++ menghitung 230 karakter dalam versi 3 baris Anda, tetapi hanya 128 jika saya menempelkan semuanya dalam satu baris (dihapus 2 * 2 = 4 karakter dari 2 baris baru, dan menambahkan dua;
). Coba sendiri;)K5, 70 byte
Saya tidak yakin kapan K5 dirilis, jadi ini mungkin tidak masuk hitungan. Masih mengagumkan!
sumber