Anda harus menulis program untuk mengevaluasi string yang akan dimasukkan ke dalam kalkulator.
Program harus menerima input dan mengeluarkan jawaban yang benar. Untuk bahasa yang tidak memiliki fungsi input / output standar, Anda dapat mengasumsikan fungsi readLine
dan print
.
Persyaratan
- Tidak menggunakan segala jenis fungsi "eval"
- Dapat menangani floating point dan angka negatif
- Mendukung setidaknya +, -, *, dan / operator
- Dapat menangani input yang berisi satu atau beberapa ruang antara operator dan angka
- Mengevaluasi ekspresi dari kiri ke kanan
Program yang merupakan kemenangan tersingkat. Dalam hal seri, program yang diajukan menang terlebih dahulu.
Anda dapat mengasumsikan bahwa input tersebut valid dan mengikuti format yang benar
Uji Kasus
Memasukkan
-4 + 5
Keluaran
1
Memasukkan
-7.5 / 2.5
Keluaran
-3
Memasukkan
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Keluaran
-12
code-golf
math
arithmetic
Kevin Brown
sumber
sumber
Jawaban:
Ruby -
74696765 karaktersumber
b[0],b[1].to_f
Anda dapat mengganti|b|
dengan|b,c|
dan menggunakanb,c.to_f
a.send(b,c.to_f)
, gunakana.send b,c.to_f
. Ini menghemat char$<
sebagai gantinyaARGF
Befunge -
37 x 5 = 18538 x 3 = 114 karakterIni terbatas pada angka integer karena Befunge tidak memiliki dukungan floating point.
Penjelasan
Fitur pembeda terbesar dari Befunge adalah bahwa alih-alih menjadi seperangkat instruksi linier seperti kebanyakan bahasa; itu adalah kotak 2d instruksi karakter tunggal, di mana kontrol dapat mengalir ke segala arah.
Yang pertama
&
hanya memasukkan angka pertama. Thev
dan>
kemudian kontrol redirect ke jalan utama di baris kedua.Ini menginput karakter (
~
), menduplikatnya (:
), mendorong nol ke tumpukan (0
), muncul dua elemen teratas dan menentukan apakah yang kedua lebih besar dari yang pertama (`
saya terkejut Anda tidak dapat menggunakan `` `untuk mendapatkan kode backticks. ), membalikkan kebenaran dari elemen atas (!
), lalu berbelok ke kanan jika nol, turun sebaliknya (#v_
).Pada dasarnya memeriksa apakah input
-1
mewakili tidak ada input lagi.Jika input
-1
kemudian nilai input duplikat dibuang ($
), bagian atas tumpukan adalah output sebagai integer (.
) dan program dihentikan (@
).Kalau tidak, proses serupa diulang untuk menentukan apakah input kurang dari atau sama dengan spasi. Jika itu adalah ruang maka kontrol turun, jika tidak kontrol kepala kanan.
Jika ini adalah spasi maka dialihkan ke kiri (
<
); program halt (@
), output (.
) dan redirection kanan (>
) semuanya dilewati menggunakan#
; tetapi buangan dijalankan untuk menghilangkan ruang dari tumpukan. Akhirnya diarahkan untuk memulai eksekusi berikutnya (^
).Jika itu bukan ruang, proses yang sama digunakan untuk membagi jika itu dalam
[+, *]
atau di[-, \]
masing-masing naik dan naik.Untuk
[+, *]
itu lagi dibagi untuk menentukan apakah itu a+
atau a*
. Jika+
diarahkan ke bawah maka angka berikutnya adalah input (&
) dan mereka ditambahkan (+
), kontrol kemudian membungkus dan diarahkan ke jalur utama untuk karakter berikutnya. Jika*
kemudian input (&
) dan dikalikan (*
) maka langsung membungkus.Untuk
[-, \]
itu dimulai di sebelah kanan menuju kiri. Itu#
melewatkan karakter setelah mereka sehingga jalur awal adalah"-"`_
yang hanya menentukan apakah itu-
atau/
. Jika ya/
maka terus ke input (&
) dan bagi (/
). Jika itu-
kemudian mengarah ke kanan, sekali lagi melewatkan karakter sehingga dieksekusi&"-"$-
menghasilkan angka yang menjadi input (&
)-
karakter didorong ke tumpukan kemudian dibuang ("-"$
) dan kemudian pengurangan dihitung (-
). Kontrol kemudian diarahkan kembali ke jalur utama.sumber
Python 3, 105 byte
Mengelola empat operasi dasar, tetapi masing-masing hanya menambah 5 karakter untuk ditambahkan
^
atau%
.Presedensi operasi dibiarkan dari kanan ke kanan.
sumber
Python (156)
sumber
C -
168126 karaktersumber
Tcl 8.6,
5748 karakter.Masukan dari argumen:
Dari Stdin (
6453 )Anda harus menggunakan shell interaktif untuk kedua solusi.
Saya memperlakukan masukan sebagai daftar (Tcl menggunakan spasi sebagai pembatas) mengambil elemen pertama dan menetapkan ke
a
, maka saya berjalan sisanya, mengambil 2 elemen setiap kali, operator dan nomor kedua, menerapkan operator pada$a
dan$b
dan menetapkan hasil kea
. Pada akhirnya hasilnya adalaha
.sumber
lmap
ituforeach
adalah pengganti yang baik.Haskell:
124114 karakterJawaban yang agak mudah, menggunakan pencocokan pola dan pernyataan kasus sederhana untuk pengangkatan berat. Pemakaian:
sumber
((case m of{..})(read u)(read b))
Anda dapat menulis((case m of{..}$read u)$read b)
, 2 karakter lebih sedikit.C:
111108 karakterItu memenuhi semua persyaratan, penggunaan:
sumber
~scanf
dapat menggantikan+1
. Juga,c^45
->c%5
danc^42
->c%2
harus berfungsi.C ++ 0x
205203198194 karakterDiformat dengan baik:
sumber
Perl (97)
baca dari argumen
baca dari input
sumber
PostScript (145)
Entri PostScript lain (terima kasih kepada luser droog untuk menggali golf yang menarik untuk PostScript!):
Tidak golf:
sumber
Python - 308
Versi yang dapat dibaca:
Mengambil ekspresi sebagai argumen baris perintah, output pada output standar.
sumber
Catatan tambahan (340)
Dan sedikit lebih mudah dibaca:
sumber
JavaScript (208 karakter dipadatkan)
Untuk lebih jelasnya, ini adalah kode sebelum saya memadatkannya ( JS-Fiddle ):
Ini dia dipadatkan menjadi 208 karakter ( JS-Fiddle ):
Karena saya mengakhiri garis dengan titik koma, semua spasi putih yang dapat dilepas diabaikan untuk penghitungan karakter, tetapi ditinggalkan untuk kejelasan.
sumber
Haskell - 124
Hasilnya akan dibungkus dalam
Maybe
monadJuga memerlukan impor
<*>
dariControl.Applicative
, tetapi impor dapat dilakukan di luar kode, jadi saya harap itu diizinkan.sumber
C #
(234)(231)(229)(223)(214)sumber
JavaScript (87 karakter)
sumber
Java 11, 151 (sebagai fungsi lambda)
Fungsi Lambda mengambil input String dan menghasilkan float.
Cobalah online.
Java 11, 241 byte (sebagai program lengkap dengan tanya I / O)
Program lengkap mengambil String-line melalui STDIN dan mengeluarkan ke STDOUT.
Cobalah online.
Penjelasan:
sumber
05AB1E , 30 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Jika
eval
builtin diizinkan, ini bisa menjadi pendekatan alternatif ( 16 byte ):Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Ini akan berubah
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
menjadi"((((((-2)+6)/2)*8)-1)/2.5)-18"
sebelum menggunakaneval
builtin (menggunakan.E
secara langsung akan memberikan operator diutamakan*/
lebih+-
, maka konversi dengan tanda kurung terlebih dahulu).sumber