pengantar
Ada saatnya di masa kanak-kanak ketika Anda pikir Anda sudah menguasai menambah dan mengalikan, kemudian seseorang datang dan memberi tahu Anda bahwa:
a * b + c = (a * b) + c! = a * (b + c),
dan itu bukan proses yang sederhana atau linier seperti yang diajarkan sebelumnya. Anda belajar bahwa ada sesuatu yang disebut urutan operasi . Ini adalah cara yang sangat penting untuk menjaga tingkat konsistensi dan ekspresi, tanpa tanda kurung menghalangi segalanya.
Alur cerita umum
Suatu hari, Anda terbangun karena kepanikan di jalanan. Sebuah kelompok ekstremis dengan nama " The 2560 " (kependekan dari "Organisasi Melawan Perintah Operasi", dengan twist hex-ish norak) telah menggunakan metode jahat mereka untuk mengambil kendali atas semua senjata nuklir di dunia. Mereka menyandera seluruh planet, dan mereka memiliki tuntutan sederhana: membalik urutan operasi yang diterima atau menghadapi pemberantasan (tanda kurung harus mempertahankan prioritas mereka). Sistem baru ini disebut PSADME (tanda kurung, pengurangan / penambahan, pembagian / perkalian, eksponen), dan ekspresi mengevaluasi dari kanan ke kiri:
a - b - c = a - (b - c) = a + c - b
Hari-hari berlalu, dan transisi sedang berlangsung. Sementara matematikawan dan fisikawan semuanya sibuk menulis ulang persamaan mereka, para ilmuwan komputer dihadapkan pada tugas mengubah mode di mana ekspresi matematika ditafsirkan oleh komputer. Anda termasuk dalam kelompok pemrograman pemberontak rahasia yang bertujuan untuk menyebabkan banyak siksaan bagi penguasa global baru - dan, secara kebetulan, Anda dipilih secara acak oleh The 2560 dan ditugaskan untuk menghasilkan program perhitungan patokan.
Misi Anda
Tulis sebuah program (atau fungsi) yang mengambil ekspresi matematika (numerik) sebagai input, menghitung ekspresi menggunakan PSADME sebagai urutan operasi dan mengeluarkan hasilnya. Ekspresi harus mengevaluasi dari kanan ke kiri, jadi
Untuk kesederhanaan, semua angka yang diberikan akan bilangan bulat, dan perhitungan akan menghasilkan hasil bilangan bulat.
Aturan dan penilaian
- Program harus menerima panjang input hingga 128 karakter - jika bahasa / platform Anda memiliki panjang input maksimum lebih rendah, itu adalah alasan yang dapat diterima.
- Celah standar dilarang.
- Kode yang menang akan dipilih pada tanggal 18 November (4 minggu dari tanggal posting ini).
- Jangan ragu untuk mengirim kode yang tidak dianggap layak golf. Ini tentang kesenangan. Jika Anda memiliki cara yang menarik untuk melakukan ini tetapi tidak bisa golf sendiri (atau berdasarkan metode Anda), Anda tetap dapat mempostingnya.
Seperti biasa, kode yang menang adalah kode dengan jumlah byte paling sedikit, dengan beberapa bonus nilai hiburan:
- -5 untuk menghindari penggunaan karakter dalam ekspresi yang disediakan: + , - , ( , ) , ^ , * , /
- -5 untuk membuat perhitungan membutuhkan lebih dari 5 menit (tetapi tidak lebih dari 10 menit) untuk menghitung pada komputer standar, tanpa metode yang jelas (menggunakan jam atau loop yang tidak perlu); Tujuannya adalah untuk meyakinkan penguasa baru bahwa Anda tidak mencoba mengganggu perhitungan malapetaka mereka.
- - (5 + N) untuk pesan ofensif langsung (panjang N, tidak termasuk spasi putih terkemuka / tertinggal) tentang anggota The 2560 yang akan ditulis dengan jelas di dalam kode Anda, dengan beberapa penjelasan konyol mengapa harus dilakukan sana. Jika dihapus, kode tidak boleh berfungsi dengan benar. Ya, poin gratis untuk nilai hiburan.
Contoh dan penjelasan
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 * 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3 - 1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? Kanan ke kiri akan menyarankan demikian, tapi itu menempatkan penambahan di depan pengurangan, bertentangan dengan PSADME, bukan?P(SA)(DM)E
.Jawaban:
Haskell, 134 byte
Mendefinisikan ulang operator matematika dengan perbaikan dan prioritas baru. Sekarang:
sumber
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
Sayangnya, kesalahan ketik membuat kode yang dihasilkan tidak memiliki ruang antara digit dan simbol, tetapi masih berjalan dengan baik. Ini berarti kode Anda bisa kehilangan 5 byte, dan mengalahkan 'peningkatan' saya.sed
untuk menghasilkan dan mengevaluasi kode shell. Mungkin pertanyaan meta yang bagus.GNU sed -r dengan ekstensi exec, 398
Tidak terlalu pendek, tetapi menyelesaikan pekerjaan.
sed tidak apa-apa untuk menguraikan prioritas tetapi tidak melakukan aritmatika. Jadi kami menggunakan ekstensi GNU sed exec ke
s
perintah untuk melakukan outsourcing aritmatika yang diperlukan ke shell.Untuk saat ini mengasumsikan semua operator, kecuali
^
memiliki tepat satu ruang di depan dan belakang.Hasil tes:
sumber
JavaScript (ES6) 287
300Sunting Bug yang diperbaiki (hanya salah ketik, 6 seharusnya 4) - Menambahkan penjelasan lengkap di akhir cuplikan
Edit 2 Ditemukan beberapa peningkatan yang bekerja pada tantangan lain
Namun porting lain dari parser yang sama dengan hanya beberapa perbedaan minimal. (bandingkan dengan ini )
sumber