Perkalian antara 2 bilangan bulat dapat direduksi menjadi serangkaian tambahan seperti itu
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Eksponensial (menaikkan a ke daya b ) juga dapat dikurangi menjadi serangkaian perkalian:
5 ^ 3 = 5 * 5 * 5
Oleh karena itu, eksponensial dapat direduksi menjadi serangkaian penambahan, dengan membuat ekspresi multiplikasi, kemudian menjadi serangkaian penambahan. Misalnya, 5 ^ 3
(5 potong dadu) dapat ditulis ulang sebagai
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Tugas Anda adalah, mengingat ekspresi yang ditambahkan bersama-sama yang terdiri dari eksponensial, perkalian, dan penambahan, kurangi menjadi serangkaian penambahan terpendek. Ekspresi "terpendek" didefinisikan sebagai ekspresi dengan jumlah +
simbol paling sedikit , masih menggunakan hanya satu dari dua angka dalam ekspresi asli. Misalnya, ekspresi terpendek 10 * 2
adalah 10 + 10
.
Angka-angka yang terlibat dalam input semuanya akan bilangan bulat positif, dan ekspresi hanya terdiri dari +
(penambahan), *
(perkalian) dan ^
(eksponensial), bersama dengan bilangan bulat dan tanda kurung ( ()
) untuk menunjukkan prioritas.
Output harus terdiri dari bilangan bulat positif dan +
simbol saja. Anda seharusnya tidak mengeluarkan langkah-langkah individual dari pengurangan, hanya hasil akhir. Output mungkin tidak terdiri dari angka yang tidak muncul di input. Namun, Anda dapat menggunakan 3 simbol berbeda, bukan +*^
, tapi tolong katakan simbol apa itu
Ruang-ruang yang memisahkan input dan output mungkin atau tidak dapat digunakan dalam program Anda, yaitu 3 * 5
dapat dikeluarkan sebagai salah satu 5 + 5 + 5
atau 5+5+5
.
Perhatikan bahwa dalam kebanyakan kasus, penambahan sebenarnya tidak dilakukan. Satu-satunya kasus di mana penambahan harus dilakukan adalah ketika Anda memiliki sesuatu seperti 5 ^ (1 + 2)
, dalam hal ini, penambahan diperlukan untuk melanjutkan -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Lihat test case # 4.
Kode Anda tidak perlu menangani input yang sampai pada ekspresi yang ambigu. Misalnya (2 + 2) * (4 + 1)
,. Karena aturan yang ditetapkan sejauh ini, tujuannya bukan untuk menghitung jawabannya, tujuannya adalah untuk menyederhanakan penambahan. Jadi hasilnya bisa berbeda tergantung pada urutan bahwa ekspresi diselesaikan atau diringankan (penambahan mana yang disederhanakan, yang harus ditinggalkan?). Contoh valid lain: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Ini adalah kode-golf sehingga kode terpendek menang
Uji kasus
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
sumber
**
bukan^
?using only one of the two numbers in the original expression.
tetapi ekspresi asli dapat memiliki lebih dari dua angka. Saya tidak mengerti mengapa8 + 8
ini bukan keluaran yang valid untuk2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Pertanyaan ini masih belum jelas bagi saya.Jawaban:
Retina , 302 byte
Saya yakin ini bisa bermain golf, tetapi pada titik ini, saya senang itu berfungsi. Bagian eksponensial dan multiplikasi keduanya sangat mirip, tetapi karena urutan operasi itu penting, saya tidak tahu cara menggabungkannya.
y
- Eksponensialx
- Perkalianp
- PenambahanCoba online - semua test case
Konverter kasus uji
Penjelasan
Anda juga dapat memperhatikan bahwa grup yang paling umum digunakan adalah
(\(\w+\)|1+)
. Ini cocok dengan ekspresi batin dengan tanda kurung, atau bilangan bulat. Saya memilih untuk menggunakan simbol yang saya lakukan sehingga saya bisa menggunakan\w
daripada kelas karakter. Saya tidak yakin apakah akan lebih baik menggunakan simbol non-kata dan mengganti beberapa lookaround dengan batas kata (\b
).sumber
Mathematica,
250218183170 byteBerhasil! Akhirnya!
Menentukan fungsi dalam
f
.Inputnya adalah ekspresi matematika biasa. (Yaitu
1 + 2
tidak"1 + 2"
).Cobalah secara Online!
Perhatikan bahwa tautan TIO memiliki kode yang sedikit berbeda, karena TIO (yang, saya duga, menggunakan kernel Mathematica) tidak suka
Infix
.Riffle
Sebagai gantinya saya menggunakan untuk mendapatkan penampilan yang sama dengan Mathematica REPL.Tidak disatukan
sumber
Mathematica,
405406 byteTidak diikat dan dijelaskan
Aku pergi ke banyak kesulitan untuk mendapatkan efek berikut: fungsi ini mengambil sebagai masukan ekspresi Mathematica standar, dengan biasa
+
,*
dan^
operasi (dan tanda kurung) di dalamnya, dan output apa yang tampak seperti ekspresi Mathematica standar (tapi dengan "dinonaktifkan" ditambah tanda-tanda) sebagai jawabannya.Fungsi di atas dimulai dengan menonaktifkan semua operasi di input. Kemudian, ia menerapkan aturan ekspansi berulang kali hingga tidak ada yang bisa disederhanakan lagi. Setiap kali bertemu dengan produk seperti
2 * 3 * 4
, yang dapat diperluas dengan berbagai cara, ia membuat daftar kemungkinan ekspansi, dan terus berjalan. Pada akhirnya, kami mendapatkan daftar jawaban akhir yang mungkin, dan yang paling pendek diambil.sumber