Buat program yang memecahkan ekspresi matematika menggunakan elemen-elemen dari sisi bergantian ekspresi. Cara melakukannya adalah, alih-alih membaca dari kiri ke kanan, Anda membaca karakter pertama, lalu yang terakhir, lalu yang kedua, lalu yang kedua ke yang terakhir dll. Ini akan memberi Anda ekspresi baru yang harus Anda evaluasi dan hasilkan.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Contoh:
1*3/2+4-5
15*-34/+2 = -255
Jika ungkapan itu tidak berfungsi, a 1
harus dimasukkan ke posisi yang diperlukan untuk membuatnya berfungsi.
Beberapa contoh mungkin akan menggambarkannya dengan lebih baik:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Operator yang harus didukung adalah + - * /
. Tidak akan ada tanda kurung. Aturan matematika normal dan "sintaks" digunakan, jadi misalnya **
tidak berarti eksponensial. a++++1
setara dengan a+1
(yaitu gaya MATLAB, bukan C ++).
Jika ada keraguan, beberapa operasi yang valid adalah:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Sementara semua hal berikut ini tidak valid. Ini menunjukkan apa yang harus diganti dengan:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Aturan:
- Kode dapat berupa fungsi atau program lengkap
- Input dapat berupa STDIN atau argumen fungsi
- Input harus berupa ekspresi matematika yang valid, tanpa tanda kutip,
''
atau""
. - Keluaran harus menjadi jawaban untuk ekspresi baru, sebagai bilangan bulat, desimal atau fraksi yang disederhanakan.
- Setidaknya tiga digit setelah titik desimal harus didukung. Jadi
1/3 = 0.333
tidak0.33
.0.333333333
diterima. ans = ...
diterima.- Jalur dan spasi baru dan terdepan diterima.
- Input hanya berupa bilangan bulat
- Pembagian dengan nol dapat menghasilkan kesalahan, NaN, Inf, dll. Mengeluarkan angka tidak diterima.
Seperti biasa, kode terpendek dalam byte menang. Pemenang akan dipilih satu minggu dari hari tantangan diposting. Jawaban yang diposkan nanti mungkin masih menang jika lebih pendek dari pemimpin saat ini.
sumber
2^64
, dan haruskah itu kesalahan atau membungkus jika Anda pergi?0/0
jika ekspresi bernilai untuk pembagian integer atau modulo dengan nol?x/0
adalah output yang valid. Selama tidak menghasilkan jawaban yang salah tidak apa-apa. Kesalahan dan "Bukan angka" menurut definisi benar, dan tak terhingga "cukup benar",Jawaban:
Perl,
108100 byteKode 96 byte, ditambah 4 untuk argumen baris perintah
-pF//
, di mana-p
sisipanwhile (<>) { .. } continue { print }
dan-F//
memisahkan input dan memasukkannya ke dalam@F
.Perhatikan bahwa input seharusnya tidak memiliki baris baru, jadi gunakan
/bin/echo -n 'formula' | perl ...
Kurang golf:
Pengujian
Masukkan yang di atas dalam file yang disebut
114.pl
, dan script tes di bawah ini dalam file di sebelahnya:Menjalankannya menghasilkan:
Catatan yang
1/0
menyebabkan pembagian dengan kesalahan nol:eval
outputundef
, yang diwakili oleh string kosong.sumber
JavaScript ES6, 105
106Sunting Disimpan 1 byte thx @ Kenney
Cuplikan tes
sumber
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.