Deskripsi
Bahasa pemrograman imajiner (IPL) menggunakan Polish Reverse Notation. Ini memiliki perintah berikut:
- i - masukan nomor dan dorong ke tumpukan
- o - output top non-destruktif dari stack (jumlah tetap pada stack)
- d - buang bagian atas tumpukan
- angka integer - dorong nomor ini ke tumpukan
- + - * - pop dua angka dari tumpukan, melakukan operasi yang sesuai dan mendorong kembali hasilnya. Tidak ada divisi di IPL.
IPL hanya bekerja dengan bilangan bulat dan digunakan untuk perhitungan sederhana. Program IPL ditulis pada satu baris dan dipisahkan oleh spasi. String kosong adalah program IPL yang valid.
Program IPL:
i i + o
Input dua angka, tambahkan bersama-sama dan hasilkan hasilnya.
Bilangan input dan bilangan bulat yang dapat didorong ke stack berada dalam kisaran [-999, 999], namun outputnya bisa apa saja. Jika bahasa Anda tidak mendukung angka besar, tidak apa-apa.
Format input / output
Anda dapat memilih format input / output apa pun selama jelas untuk memahami dan membaca / menulis: string, daftar, token, dll.
Tugas
Anda diberi beberapa program IPL, Anda perlu mengoptimalkannya (mengurangi panjang):
i 12 + 3 + o d 2 3 + d
Setelah optimasi akan menjadi
i 15 + o
Anda tidak harus mempertahankan status tumpukan, tetapi jumlah input dan output serta urutannya harus sesuai dengan program asli dan yang dioptimalkan.
Jadi program IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Setelah optimasi akan menjadi
i -80 * o i 4 o i
atau
-80 i * o i 4 o i
(perhatikan bahwa Anda harus menyimpan semua input, meskipun inputnya tidak relevan).
Seharusnya tidak ada hardcoding untuk kasus uji, kode harus bekerja pada program IPL sembarang dan menghasilkan program IPL sesingkat mungkin yang memenuhi persyaratan.
Mencetak gol
Penilaian kode-golf default.
PEMBARUAN: mengubah skor menjadi penilaian kode golf murni, sesuai saran @Sanchises.
Kasus uji:
Memasukkan:
(empty string)
Output yang mungkin:
(empty string)
Memasukkan:
i 4 * 2 + 3 * 6 - o
Output yang mungkin:
i 12 * o
Memasukkan:
1 1 + o
Output yang mungkin:
2 o
Memasukkan:
i 2 + 3 + o d 2 3 + d
Output yang mungkin:
i 5 + o
Memasukkan:
-40 i * 2 * o i + 3 1 + o i 2 *
Output yang mungkin:
-80 i * o i 4 o i
Memasukkan:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Output yang mungkin:
i i i i i d d d d o
Memasukkan:
i i i 0 * * * o
Output yang mungkin:
i i i 0 o
Memasukkan:
i i i 1 * * * o
Output yang mungkin:
i i i * * o
Memasukkan:
i 222 + i 222 - + o
Output yang mungkin:
i i + o
Memasukkan:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Output yang mungkin:
i i i i i o 1 o
Memasukkan:
i 1 + 2 * 1 + o
Output yang mungkin:
i 2 * 3 + o
Memasukkan:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Output yang mungkin:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
sumber
i i d o
kei o i
(input adalah dalam rangka dan output adalah dalam rangka) atau harus Anda tidak menyederhanakannya? (himpunan input dan output harus berurutan)Jawaban:
Bahasa Wolfram (Mathematica) ,
733728690564516506513548 bytesCobalah online!
Ini adalah tour-de-force empat langkah yang (1) menggantikan "-" dengan "-1 * +" sehingga kita tidak harus berurusan dengan pengurangan, (2) menyederhanakan daftar perintah sedikit, ( 3) membuat daftar semua permutasi dari daftar perintah ini dan memilih yang memberikan hasil yang sama ketika diuraikan (dieksekusi), dan (4) menyederhanakan daftar perintah ini sedikit dan mengambil yang terpendek, setelah mengubah operasi tertentu kembali ke pengurangan.
Kode ini sangat tidak efisien karena melewati daftar semua permutasi dari kode input. Untuk kode input panjang, saya tidak merekomendasikan menjalankan kode ini; tetapi ketika saya membacanya tidak ada runtime atau batasan memori dalam tantangan ini.
Kode ini melakukan langkah pengoptimalan setelah mengonversi semua operasi "-" menjadi "+" dengan tanda terbalik, dan hanya pada akhirnya memperkenalkan kembali operator "-" ketika mengonversi kode kembali ke string. Misalnya ini menyiratkan bahwa "i -1 i * + o" dioptimalkan dengan benar untuk "ii - o".
Karena persyaratan format i / o cukup longgar, kode ini mengambil dan mengembalikan kode sebagai daftar, di mana simbol "+", "-", "*" masing-masing diwakili oleh p, m, t, token. Konversi dari dan ke string dilakukan dalam fungsi wrapper yang diberikan pada TIO:
Versi un-golf, termasuk pembungkus format string dan meminimalkan panjang string kode final alih-alih jumlah token, dan termasuk beberapa transformasi lebih baik:
Terima kasih kepada @redundancy karena telah menangkap bug: Pengurai membutuhkan a
Expand
diterapkan pada output untuk menangani kesetaraan distributif. 506 → 513memperbarui
Sekarang juga mengoptimalkan
1 o 1 + o
untuk1 o 2 o
. Ini adalah kasus yang sangat sulit dan membuat kode lebih lambat. 513 → 548sumber
i i 1 + i 1 + i 1 + i 1 + d d d d o
.i 2 * i 2 * + o
harus menghasilkan output yang dioptimalkani i + 2 * o
, tetapi kode ini mengembalikan input (tidak dioptimalkan).