Anda bekerja untuk perusahaan yang ingin membuat kalkulator yang ramah pengguna, dan dengan demikian Anda telah diberi tugas untuk menambahkan kemampuan bagi pengguna untuk menggunakan "steno angka," yaitu, huruf yang mewakili nilai numerik, seperti kuntuk 1000. Karena perusahaan Anda ingin menghemat uang pada penyimpanan dalam kalkulator tersebut, Anda harus meminimalkan kode Anda sebanyak mungkin untuk mengurangi biaya penyimpanan.
Tugas Anda
Anda harus membuat fungsi yang bisa membaca ekspresi sebagai input dari STDIN atau menjadikannya sebagai parameter dan mengembalikan evaluasinya atau mencetaknya ke STDOUT.
Beberapa Klarifikasi
Biarkan saya melakukan beberapa definisi. Pertama, kami memiliki input, yang saya sebut ungkapan. Ini bisa seperti berikut ini:
x + y / z
Dalam ungkapan ini kami memiliki tiga nomor: x, y, dan z, dipisahkan oleh operator ( +dan /). Angka-angka ini belum tentu bilangan bulat positif (atau bahkan bilangan bulat). Yang menyulitkan adalah ketika kita harus mengevaluasi steno yang terkandung dalam angka. Misalnya dengan
2k15
untuk tujuan evaluasi, kami membagi ini menjadi tiga nomor: 2, 1000(yang k), dan 15. Kemudian, sesuai aturan, kami menggabungkannya untuk mendapatkan
2*1000 + 15 = 2015
Semoga ini membuatnya sedikit lebih mudah untuk memahami aturan berikut ini.
Aturan
NB Kecuali ditentukan lain, Anda dapat mengartikan kata "angka" atau sinonimnya untuk memasukkan singkatan.
Berikut ini merupakan shorthands numerik fungsi Anda harus mampu proses:
k, m, b, t, and e.k, m, b, and tsesuai dengan nilai1000, 1000000, 1000000000, and 1000000000000masing-masing (seribu, satu juta, satu miliar, dan satu triliun). Theesingkat akan selalu diikuti dengan nomor lain,n, dan mewakili10^n. Anda harus mengizinkan steno angka untuk hadirndan hadir sebelumnyae. Misalnya,kekevaluasi ke1000*10^1000.Demi kesederhanaan, jika angka memiliki steno
edi dalamnya, itu hanya akan digunakan sekali.Angka apa pun ( termasuk steno ) sebelum steno dikalikan dengan steno. misalnya
120kkakan dievaluasi sebagai120 * 1000 * 1000. Jika tidak ada angka sebelumnya, Anda harus mengasumsikan bahwa angka tersebut adalah 1 (seperti bagaimana Anda, dalam matematika, memperlakukan variabelxsecara implisit sebagai1x). misalnyae10mengevaluasi10^10. Contoh lain:2m2kmengevaluasi ke2*1000000*2*1000(tidak ada yang ditambahkan ke dalamnya).Nomor apa pun (singkatan tidak berlaku) mengikuti steno terakhir dalam nomor yang mengandung steno ditambahkan ke dalamnya. misalnya
2k12akan dievaluasi sebagai2*1000 + 12. Pengecualian untuk hal ini adalah jika stenoedigunakan, dalam hal ini nomor ( steno termasuk ) berikuteakan diperlakukan sebagaindan dievaluasi sebagai10^n(lihat aturan pertama).Fungsi Anda harus dapat memproses masing-masing operator
+, -, *, and /yang penjumlahan, pengurangan, perkalian, dan pembagian. Ini dapat memproses lebih banyak, jika Anda inginkan.Operasi dievaluasi sesuai dengan urutan operasi.
Angka dalam singkatan tidak hanya bilangan bulat.
3.5b1.2valid dan akan dievaluasi sebagai3.5*1000000000 + 1.2 = 3500000001.2Built-in tidak diperbolehkan, jika ada untuk hal semacam ini. Pengecualian yang akan saya tambahkan adalah jika bahasa Anda secara otomatis mengubah angka besar menjadi notasi ilmiah, dalam hal ini yang dapat diterima untuk hasil Anda.
Kode terpendek dalam byte menang, penerapan celah standar.
Memasukkan
Input akan berupa ekspresi dengan setiap angka dan operator dipisahkan oleh spasi. Angka mungkin mengandung steno atau tidak. Contoh ditunjukkan di bawah ini:
10 + 1b - 2k
Keluaran
Fungsi Anda harus menampilkan evaluasi ekspresi sebagai angka. Diperbolehkan menggunakan notasi ilmiah jika hasilnya terlalu besar untuk ditampilkan. Anda harus memiliki setidaknya tiga tempat desimal jika angka tersebut bukan bilangan bulat. Ini diterima jika Anda mempertahankan tempat desimal ini jika angka adalah bilangan bulat.
Uji Kasus
Memasukkan
t
Keluaran
1000000000000
Memasukkan
1 + 4b / 10k11
Keluaran
399561.483
Memasukkan
e2 + k2ke-1 - b12
Keluaran
-999799912
atau
-999799912.000
Memasukkan
142ek12
Keluaran
142e1012
atau
142.000e1012
Memasukkan:
1.2m5.25
Keluaran:
1200005.25
Catatan Akhir
Ini adalah tantangan pertama saya yang diposting (dengan bantuan dari pengguna di kotak pasir). Jika ada yang tidak jelas, beri tahu saya dan saya akan melakukan yang terbaik untuk mengklarifikasi.
1000 + 2000 * 10 ^ -1, tetapi itu memberikan jawaban akhir -999998712. (Juga, interpretasi saya sepertinya tidak cocok dengan " steno terakhir " aturan 4 , tetapi saya tidak yakin bagaimana lagi memahami urutannya k2k.) Bisakah Anda jelaskan langkah-langkah dalam mengevaluasinya?
2m2kharus ditambahkan ke diskusi aturan 3. Juga, mungkin lebih baik menggunakan istilah yang berbeda - mungkin "integer" - untuk angka literal seperti 123itu yang tidak shorthands. Kata "angka" memiliki sekitar 3 definisi berbeda di sini, seperti yang ada sekarang.