Katakanlah saya memiliki ekspresi:
9 * 8 + 1 - 4
Ungkapan ini dapat ditafsirkan dalam enam cara berbeda, tergantung pada prioritas operator:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Katakanlah saya seorang pengembang, dan saya tidak ingin menghafal tabel prioritas, dll., Jadi saya hanya akan menebak.
Dalam hal ini, margin kesalahan terbesar adalah 45-77, yang merupakan perbedaan 32. Ini berarti bahwa tebakan saya hanya akan dimatikan oleh maksimum 32.
Tantangan
Mengingat ekspresi yang terdiri dari angka dan +
, -
, *
, /
(pembagian integer) dan%
, output perbedaan mutlak dari nilai yang mungkin terbesar dan terkecil untuk ekspresi yang, berdasarkan didahulukan dari operator.
Spesifikasi
- Ekspresi input tidak akan mengandung tanda kurung dan setiap operator adalah asosiatif kiri.
- Ekspresi input hanya akan mengandung bilangan bulat tidak negatif. Namun, subekspresi dapat dievaluasi menjadi negatif (misalnya
1 - 4
). - Anda dapat mengambil ekspresi dalam format apa pun yang masuk akal. Sebagai contoh:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- Input akan berisi setidaknya 1 dan paling banyak 10 operator.
- Ekspresi apa pun yang berisi pembagian atau modulo dengan 0 harus diabaikan.
- Anda dapat mengasumsikan bahwa modulo tidak akan diberikan operan negatif.
Uji Kasus
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Buah Esolanging
sumber
sumber
%
memiliki dua prioritas berbeda dalam contoh kedua Anda.%
operator bekerja pada angka negatif? Cara seperti C atau Python atau yang lainnya?Jawaban:
Python 2 ,
171156 byteCobalah online!
Bagaimana itu bekerja
Kami mengelilingi setiap operator dengan jumlah berbeda dari pasangan kurung yang menghadap ke luar untuk mensimulasikan berbagai prioritas (dalam semua cara yang mungkin), dan membungkus pasangan kurung yang menghadap ke dalam di sekitar seluruh string, untuk mendapatkan ekspresi yang kami bisa
eval
. Misalnya dengan+
↦)+(
*
↦))*((
-
↦)))-(((
kita mendapatkan
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.sumber
or
luarsum
untuk menghapus lapisan tanda kurung:sum([...],[])or[eval(a)]
bukannyasum([...]or[[eval(a)]],[])
sum
mungkin kosong tanpa argumennya kosong — namun, sebenarnya baik-baik saja karenaeval
harus gagal dalam kasus itu. Terima kasih.Jelly , 126 byte
"Operator Precedence? Kurung? Pah, siapa yang butuh itu?" - Tantangan menggunakan Jelly untuk tantangan prioritas operator.
Cobalah online!
Input diambil sebagai string, misalnya "1 + 2_3 × 4: 5% 6". Catatan penggandaan menggunakan "×" bukan "*", pembagian menggunakan ":" alih-alih "/", dan pengurangan menggunakan "_" bukannya "-".
Bagaimana itu bekerja Program ini dibagi menjadi tiga bagian: menghasilkan semua ekspresi dari prioritas operator yang berbeda, mengevaluasinya, dan mengembalikan perbedaan antara maksimum dan minimum.
Semua ekspresi dihasilkan dengan kode:
Tautan dievaluasi dengan ini (saya mungkin bisa memperbaiki dengan struktur yang berbeda):
Perbedaan antara maksimum dan minimum dihitung dengan kode dalam tautan (5):
sumber
Python 2 ,
235234233226 byte-1 byte (dan perbaikan) berkat Anders Kaseorg !
-7 byte berkat Langkah Hen !
Cobalah online!
sumber
a
menjadi tuple bukan daftar, dan bahkan menyimpan 1 byte dengan melakukannya (a=()
,a+=eval(*l),
).Haskell 582 byte
Ini tidak berjalan hampir sebaik yang saya harapkan ...
Cobalah secara Online!
Mencoba bermain golf dengan program panjang hanya membuat saya menulis kode yang buruk :(
Saya mencoba menggunakan algoritma Anders di Haskell, tetapi itu keluar dari kendali saya
Fungsi e seperti kasus eval tertentu. (#) mengambil daftar string yang mewakili bilangan bulat dan serangkaian operator dan mengembalikan perbedaan antara nilai maksimum dan minimum yang mungkin. misalnya
sumber
#
menjadi##
, Anda dapat mengubah namae
menjadi(#)
, seperti:(n#s)(x:a)=...
r=read;j=zipWith;o=map
dan kemudian ganti fungsi-fungsi itu dengan huruf alias.Pyth, 45 byte
Saya yakin bahwa lebih banyak optimasi dapat dilakukan, tetapi saya sangat menyukainya sejauh ini.
Mengambil input seperti ini:
[9, 8, 1, 4], ["*", "+", "-"]
.Cobalah online!
sumber
Mathematica,
186164159 byte\[Function]
membutuhkan 3 byte.Beberapa alternatif (tetap bytecount sama)
#2-#&@MinMax[...]
untuk menggantikanMax@#-Min@#&[...]
Head@#2
untuk menggantikan#2[[0]]
Cobalah online di http://sandbox.open.wolframcloud.com : masukkan
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
dengan....
diganti dengan kode di atas untuk test case60 / 8 % 8 * 6 % 4 * 5
. TekanShift + enter
untuk mengevaluasi.sumber
Javascript, 280 byte
Catatan : Putaran pembagian bilangan bulat menggunakan fungsi lantai, yang berarti bahwa angka negatif membulatkan dari nol.
Solusi ini didasarkan pada jawaban ini .
Cuplikan kode contoh:
sumber
a/b|0
menghentikan pemeriksaan kesalahan divide / modulo 0, tetapiMath.floor(a/b)
berhasilHaskell , 254 byte
Cobalah online!
Input adalah seluruh string, seperti 4 + 5 * 2. Ini menghasilkan semua permutasi operasi, dan untuk setiap permutasi membagi string secara rekursif. Ini memfilter divisi dengan 0 dengan daftar monad.
sumber
(%)
adalah operator modulus. Ini adalah sisa dari operasi pembagian antara argumen kiri dan argumen kanan.Python 2 ,
262256254 byteCobalah online!
sumber
in [
kein[
(space tidak diperlukan)PHP , 316 byte
Cobalah online!
sumber
Python 3 , 284 byte
Sunting: sepertinya ada yang salah dengan mengevaluasi contoh terakhir. Saya akan memeriksanya besok.
Jawaban Python lainnya. Tidak bisa mengungguli orang lain, tapi saya menghabiskan terlalu lama dalam hal ini untuk tidak memasangnya.
Cobalah online!
sumber
while(p)
dapat menjadiwhile p
untuk satu byte yang disimpan.Clojure (+ kombinatorik),
342377 + 41 = 418 byte+35 byte karena bug.
Cobalah online!
Untuk fungsi ini untuk bekerja, Anda harus
use
denganclojure.math.combinatorics
perpustakaan (41 bytes):Nuansa:
Fungsi ini adalah fungsi anonim, yang berarti Anda harus melakukan ini untuk menggunakannya:
Juga, saya menggunakan kata
quot
bukan/
(karena Clojure melakukan pembagian fraksi secara default), danmod
bukannya%
.Program tidak digabungkan:
sumber
use
pernyataan.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
perlu dimasukkan dalam kode dan panjangnya harus ditambahkan ke jumlah byte.JavaScript (ES6), 210 byte
Input sebagai array angka dan operator
Kurang golf
Uji
sumber