Terkadang berguna untuk menjalankan masalah matematika dengan beberapa input. Tujuan dari tantangan ini adalah membuat program yang memudahkan tugas ini.
Ekspresi yang menghasilkan angka
Anda harus mendukung 3 jenis ekspresi:
- Generator nomor tunggal: Sangat sederhana, hanya angka literal
- Generator multi-angka: Sedikit lebih rumit. Mereka dikelilingi oleh tanda kurung (
[]
). Angka adalah koma (,
) dipisahkan dalam ekspresi. Contoh[-1,2,3.26]
. - Range generator: Yang ini dikelilingi oleh kurung kurawal (
{}
). Ini akan memiliki 3 angka yang dipisahkan oleh koma. Format ungkapan ini adalah{start,stop,step}
.start
danstop
inklusif.
Aturan untuk evaluasi
- Anda harus mendukung urutan operasi. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Anda tidak perlu mendukung tanda kurung.
- Sejumlah spasi dapat terjadi dalam ekspresi.
- Anda harus mendukung angka floating point (apa pun ketepatan bahasa yang Anda gunakan tidak masalah)
- Pembagian berdasarkan
0
hasilNaN
(bukan angka).
Program Anda harus mendukung multiplikasi ( *
), pembagian ( /
), penjumlahan ( +
) dan pengurangan ( -
).
Keluaran
Setiap jalur output adalah salah satu kombinasi dari generator. Formatnya adalah ekspresi (dengan bilangan real diganti dengan itu) diikuti oleh tanda sama dengan ( =
) dan hasil evaluasi. Semua kombinasi generator harus diwakili dalam output.
Contohnya
( >>>
menunjukkan input)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
Program ini harus singkat sehingga saya dapat mengingatnya dan menggunakannya di mana saja.
Terima kasih kepada @PeterTaylor dan @geokavel karena membantu saya dengan pos ini di kotak pasir
x/0
menghasilkan evaluasi instan ke NaN, atau apakah saya harus memperlakukan NaN sebagai suatu nilai?Jawaban:
JavaScript (ES6),
213211 bytePenjelasan
Fungsi rekursif yang mengeksekusi ekspresi jika tidak mengandung multi-number atau range generator, atau jika memang mengandung salah satu generator ini, memanggil dirinya sendiri dengan generator diganti dengan setiap nomor yang dihasilkan olehnya.
Membagi dengan
0
dalam JavaScript menghasilkanInfinity
, jadiInfinity
hanya bisa diganti denganNaN
.Dengan menggunakan metode ini, multi-generator diurai dari back-to-front, bukan front-to-back seperti dalam kasus uji. Ini berarti urutan ekspresi keluaran terkadang berbeda.
Uji
Tes tidak menggunakan tugas penataan untuk kompatibilitas browser.
sumber
Haskell,
474362 byteFungsi f mengambil string sebagai input dan mencetak hasilnya
tes:
keluaran:
sumber
Python 3, 387 Bytes
Anda dapat mengujinya dengan kode berikut:
Berikut adalah kode yang tidak ditandai:
Ia bekerja dengan menemukan set kurung pertama dari jenis apa pun, dan kemudian perulangan melalui semua nilai di dalamnya, dengan mengganti tanda kurung dan isinya dengan nilai dan menjalankan metode secara rekursif. Ini digunakan
eval
setelah tidak ada tanda kurung di baris. Itu kembaliNaN
jika ada pengecualian berjalaneval
.sumber
e[:]=s[:]
? Tidak akane[:]=s
melakukan hal yang samaJava, 874 byte
Rinci Coba Di Sini
sumber
Dyalog APL , 164 byteJawaban ini tidak mengikuti persyaratan yang diperbarui, dan karenanya tidak bersaing:
Ini menggunakan regex untuk mengubah ekspresi yang diberikan ke APL yang sesuai (dan semua operator dimodifikasi untuk mengimplementasikan
NaN
) dan untuk mengekstrak operator. Ini mengganti semua operator dengan catenation dan mengeksekusi ekspresi untuk mendapatkan angka input akhir. Ini kemudian menjalin semuanya untuk mendapatkan hasil akhir.Mempertahankan urutan evaluasi APL (ketat dari kanan ke kiri).
Menangani tanda kurung dengan benar.
Uji kasus (dengan tanda kurung tambahan untuk memaksa urutan eksekusi seperti matematika):
sumber