Tugas Anda dalam tantangan ini adalah untuk menganalisis "Persamaan Batang Korek Api" yang diberikan seperti ini ...
... dan untuk mengetahui apakah itu dapat diubah menjadi persamaan yang valid dengan mengatur ulang pertandingan. Jika demikian, Anda akan menghasilkan jumlah gerakan paling sedikit untuk melakukannya dan persamaan yang dihasilkan.
Memasukkan
Input adalah sebuah String yang dapat dibaca dari STDIN, diambil sebagai argumen fungsi atau bahkan disimpan dalam file. Ini adalah persamaan yang mewakili pengaturan batang korek api dan dapat dijelaskan menggunakan EBNF berikut:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
Contoh untuk input yang valid adalah 3+6-201=0+0+8
.
Tugas
Pertimbangkan ilustrasi berikut ini di mana setiap batang korek api memiliki nomor yang ditetapkan:
Kami sekarang memetakan setiap simbol input ke posisi batang korek api yang sesuai sebagai berikut:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
Setiap formula input dapat diubah menjadi pengaturan batang korek api. Misalnya, persamaan "45 + 6 = 92" menjadi
di mana korek api yang tidak digunakan diklik. Tugas Anda adalah untuk mengetahui jumlah korek api yang paling sedikit yang harus disusun ulang agar persamaannya valid.
Keluaran
Kami membedakan antara tiga kemungkinan kasus:
- Jika input tidak valid (artinya tidak memenuhi EBNF di atas), output apa pun yang Anda inginkan.
- Jika tidak, jika ada cara untuk mengubah persamaan menjadi valid dengan menata ulang korek api, Anda harus output baik jumlah minimum penyusunan ulang dan sesuai persamaan. Sama seperti input, persamaan yang dikeluarkan juga harus memenuhi EBNF yang diberikan. Dalam contoh di atas, output yang benar adalah
1
dan46+6=52
. Jika ada beberapa kemungkinan untuk persamaan yang dihasilkan, output salah satunya. - Kalau tidak (jadi jika inputnya valid tetapi tidak ada cara untuk membuat persamaan itu benar), Anda harus output
-1
.
Detail
- Anda tidak diizinkan untuk menghapus atau menambahkan kecocokan. Itu berarti, jika input dibuat dari
n
korek api, output juga harus terdiri darin
korek api. - Batang korek api "Kosong" hanya diperbolehkan di bagian akhir dan awal persamaan, bukan di tengah. Jadi, misalnya, beralih
7-1=6
ke7 =6-1
hanya dengan menghapus-1
dari sisi kiri dan menambahkannya di sisi kanan hanya dengan 3 pengaturan batang korek api tidak diperbolehkan. Karena saya tidak benar-benar melihat pemetaan dari angka ke posisi batang korek api sebagai bagian yang menarik dari tantangan ini, untuk plus 20 byte , Anda dapat
- mengakses file di mana pemetaan
(number/operation ↦ matchstick positions)
disimpan dengan cara apa pun yang masuk akal, atau - jika bahasa pemrograman Anda mendukung
Map
tipe data, asumsikan bahwa Anda memiliki akses ke peta yang diinisialisasi dengan(number/operation ↦ matchstick positions)
-petakan. Peta ini misalnya terlihat seperti itu:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- mengakses file di mana pemetaan
Contohnya
Input: 1+1=3
↦ Output: 1
dan1+1=2
Input: 15+6=21
↦ Output: 0
dan15+6=21
Input: 1=7
↦ Output: -1
Input: 950-250=750
↦ Output: 2
dan990-240=750
Input: 1-2=9
↦ Output: 1
dan1+2=3
Input: 20 + 3=04
↦ Output: apa pun
Pemenang
Ini adalah kode-golf , jadi jawaban terpendek yang benar (dalam byte) menang. Pemenang akan dipilih satu minggu setelah jawaban pertama yang benar diposting.
=
(2 batang korek api) dan -
(1 batang korek api) dan meninggalkan semua nomor di mana mereka berada. Namun, jika 2 harus dipindahkan ke kiri, Anda juga harus menghitung langkah yang diperlukan.
1+1+2=3-6+10
? Dan pertanyaan yang sama tentang output.
0: 1, 2, 3, 4, 5, 6
untuk konsistensi