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.
0: 1, 2, 3, 4, 5, 6
untuk konsistensi=
(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.Jawaban:
Javascript, 1069 Bytes
Saya sudah mengujinya dengan beberapa persamaan uji dan tampaknya berfungsi sepanjang waktu sekarang ...
Ya, ini pertama kalinya saya mengirimkan jawaban, jadi saya tidak melihat diri saya menang. Ini pada dasarnya adalah metode brute force untuk mencari tahu semua jawaban dan kemudian mengambil dan mengembalikan yang terkecil dalam sebuah array. dengan argumen pertama adalah panjang dan argumen kedua adalah array dengan output.
jika inputnya adalah "1-2 = 9" outputnya [1, ["1 + 2 = 3", "7-2 = 5"]]
dan ini adalah kode yang tidak terkompresi:
Peringatan: Jangan lakukan persamaan seperti 950-250 = 750 yang digunakan ~ 45 Matchsticks dan karena kode ini menggunakan brute force maka akan menyebabkan javascript hang.
sumber
var k
di loop sebagai parameter yang tidak digunakan untuk fungsi tersebut, menghemat 3 byte untuk setiap deklarasi.08=8
untuk80=8
salah.Perl, 334
Cukup cepat asalkan solusinya dapat dicapai dalam 1 atau 2 gerakan. Ketika tidak ada solusi Anda menunggu lama bahkan dalam kasus terkecil
1=7
.Contoh:
Ini tidak akan menemukan solusi yang mengubah panjang persamaan seperti
11=4
->2 11=11
, tapi saya tidak yakin ini akan diizinkan.sumber