Peg solitaire adalah game populer yang biasanya dimainkan sendiri. Gim ini terdiri dari sejumlah pasak dan papan yang dibagi menjadi kisi - biasanya papan tidak berbentuk persegi panjang tetapi untuk tantangan ini kami akan menganggapnya demikian.
Setiap gerakan yang valid memungkinkan seseorang untuk menghapus pasak tunggal dan tujuannya adalah untuk bermain sedemikian rupa, sehingga ada satu pasak tersisa. Sekarang, langkah yang valid harus berada dalam satu arah (utara, timur, selatan atau timur) dan melompati satu pasak yang dapat dihapus.
Contohnya
Membiarkan .
ruang kosong di papan dan angka adalah pasak, langkah berikut akan memindahkan 1
satu ke kanan dan menghapus 2
dari papan:
..... .....
.12.. -> ...1.
..... .....
Suatu langkah harus selalu melompati satu pasak, sehingga yang berikut ini tidak valid:
...... ......
.123.. -> ....1.
...... ......
Berikut adalah beberapa konfigurasi yang valid setelah setiap gerakan:
...1... ...1... ..71... ..71...
.2.34.5 ---> .24...5 ---> .2....5 ---> ......5
.678... (4W) .678... (7N) .6.8... (2S) ...8...
....... ....... ....... .2.....
Tantangan
Diberikan konfigurasi papan awal dan beberapa konfigurasi lainnya, keluaran apakah konfigurasi lainnya dapat dicapai dengan memindahkan pasak secara berurutan seperti dijelaskan di atas.
Aturan
- Input akan berupa matriks / daftar daftar / ... dari nilai-nilai yang menunjukkan ruang kosong (mis. Nol atau salah) atau pasak (mis. Tidak nol atau benar)
- Anda dapat mengasumsikan dan
- Anda dapat menggunakan true / non-zero untuk menunjukkan ruang kosong dan sebaliknya jika itu membantu
- Output akan berupa dua nilai yang berbeda (salah satu nilainya mungkin berbeda) yang mengindikasikan apakah konfigurasi akhir dapat dicapai (mis. Falsy / truthy ,
[]
/[list of moves]
..)
Uji kasus
initial goal -> output
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,0],[0,1,0],[1,1,0]] -> True
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,1],[0,1,1],[0,0,0]] -> False
[[0,0,0],[1,0,0],[0,0,0]] [[0,0,0],[0,0,1],[0,0,0]] -> False
[[0,0,0],[1,1,0],[0,0,0]] [[0,0,0],[0,1,1],[0,0,0]] -> False
[[0,0,0,0],[1,1,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,1],[0,0,0,0]] -> False
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[0,0,1],[0,1,0],[1,0,0],[0,0,1]] -> True
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[1,0,0],[0,0,0],[0,0,0],[0,0,0]] -> False
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,1,0],[1,0,0,0],[1,0,1,0],[1,0,0,1]] -> True
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> False
[[1,0,0,0],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> True
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]] -> False
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] -> False
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,1,0,0,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
7
dalam contoh Anda? Mengapa hilang setelah2
pindah ke selatan?Jawaban:
JavaScript (ES6),
184 178173 byte(initial_board)(target_board)
Cobalah online!
(menghapus dua kasus uji terakhir yang terlalu banyak waktu untuk TIO)
Berkomentar
sumber
Bersih , 232 byte
Cobalah online!
Ini adalah salah satu kesempatan langka di mana saya dapat memanfaatkan komposisi dan kari sambil menghemat byte.
Dijelaskan:
@ :: [Int] -> [[Int]]
adalah fungsi pembantu yang digunakan untuk menghasilkan berbagai potensi baru baris / kolom yang dapat hasil dari langkah yang dibuat. Ini menghindari perlu kasus khusus[1,1,0:_]
dengan memperhatikan bahwaa*b-c>0
hanya ketika[a,b,c]=[1,1,0]
, dantake(a*b-c)...
memberi[]
dengan mengambil-1
atau0
elemen untuk semua konfigurasi yang bukan langkah yang valid.flip elem o...
membalik urutan argumen keelem
(menjadikannya "tidak berisi y" bukan "adalah anggota x y") dan menerapkan fungsi anonimc
ke argumen pertama.\c=limit(iterate(nub o concatMap ...)[c])
menghasilkan setiap papan potensial yang dapat dihasilkan daric
dengan bergabung dengan set papan saat ini dengan semua gerakan yang dapat terjadi pada semua papan dan menghapus duplikat, sampai hasilnya berhenti berubah.\l=[l]++...
menambahkan papanl
ke daftar semua papan baru yang potensial, satu langkah jarak jauhnya, yang dihasilkan dengan menerapkan@
ke setiap baris orientasi papan (0, 90, 180, 270 derajat rotasi) dan mengganti baris yang diubah sesuai dengan yang baru baris.sumber