Pecahkan Alcazar ini untukku

39

Baru-baru ini saya telah memainkan game bernama Alcazar. Ini adalah permainan puzzle papan di mana tujuan Anda adalah masuk dari satu pintu, melewati semua kotak, dan keluar melalui pintu lain. Satu-satunya aturan adalah:

  • Masukkan sekali, tinggalkan sekali;
  • Lewati semua kotak;
  • Jangan melewati kotak lebih dari sekali

Gambar di bawah ini menunjukkan contoh papan Alcazar dan, di sebelah kanannya, puzzle yang dipecahkan (tentu saja ini mudah):

Contoh Alcazar Puzzle

Anda dapat menemukan lebih banyak teka-teki di http://www.theincrediblecompany.com/try-alcazar dan unduh game di PlayStore (PS: Bukan iklan).

Masalah saya adalah saya hampir menyelesaikan permainan, kecuali satu level. Saya tidak bisa menemukan cara untuk menyelesaikannya. Jadi tantangan yang saya usulkan adalah: membuat algoritma yang memecahkan level 1 Alcazar normal 1 yang dapat dipecahkan .

Tentu saja, saya tidak meminta siapa pun untuk membangun juru bahasa gambar untuk membaca gambar dan memecahkan teka-teki (atau saya?). Jadi saya menggambar ulang puzzle di atas menggunakan karakter menggambar kotak. Teka-teki dan solusinya akan seperti ini:

╔═══════╗         ╔═══════╗
║▒ ▒ ▒ ▒║         ║┌─┐ ┌─┐║
║     ║ ║         ║│ │ │║│║
╣▒ ▒ ▒║▒╠         ╣│ └─┘║└╠
║ ══╦═╩═╣         ║│══╦═╩═╣
║▒ ▒║▒ ▒║         ║└─┐║┌─┐║
║   ║   ║   ==>   ║  │║│ │║
╣▒ ▒║▒ ▒║         ╣┐ │║│ │║
║ ║ ║   ║         ║│║│║│ │║
╣▒║▒ ▒ ▒║         ╣│║└─┘ │║
║ ║     ║         ║│║    │║
║▒ ▒ ▒ ▒║         ║└─────┘║
╚═══════╝         ╚═══════╝

Pada papan di atas, adalah sel yang harus diisi.

Seseorang dapat mengamati bahwa ada gab vertikal dan horizontal antara sel-sel. Ini karena saya harus memasukkan ruang di antara sel untuk menambahkan dinding. Ini berarti bahwa satu-satunya sel penting adalah yang di atas, di bawah, di sebelah kiri, dan di sebelah kanan setiap sel. Diagonal dapat dihapus tanpa kehilangan informasi. Misalnya, di papan di bawah, keduanya mewakili teka-teki yang sama:

╔════╩╗         ═ ═ ╩ 
║▒ ▒ ▒║        ║▒ ▒ ▒║
║ ═══ ║           ═   
║▒ ▒ ▒║   ==   ║▒ ▒ ▒║
║     ║               
║▒ ▒ ▒║        ║▒ ▒ ▒║
╚╦════╝         ╦═ ══ 

Ini juga berlaku untuk solusinya. Artinya, tidak diperlukan untuk menghubungkan sel:

╔════╩╗        ╔════╩╗        ╔════╩╗
║▒ ▒ ▒║        ║┌───┘║        ║┌ ─ ┘║
║ ═══ ║        ║│═══ ║        ║ ═══ ║
║▒ ▒ ▒║   ==   ║└───┐║   =>   ║└ ─ ┐║
║     ║        ║    │║        ║     ║
║▒ ▒ ▒║        ║┌───┘║        ║┌ ─ ┘║
╚╦════╝        ╚╦════╝        ╚╦════╝

Dalam contoh di atas, kedua solusi memiliki arti yang sama.

Ya, kasus uji. Di sini mereka:

Teka-teki 1

╔════╩╗        ╔════╩╗
║▒ ▒ ▒║        ║┌ ─ ┘║
║ ═══ ║        ║ ═══ ║
║▒ ▒ ▒║   =>   ║└ ─ ┐║
║     ║        ║     ║
║▒ ▒ ▒║        ║┌ ─ ┘║
╚╦════╝        ╚╦════╝

Teka-teki 2

╔═════╗        ╔═════╗
║▒ ▒ ▒║        ║┌ ─ ┐║
║   ║ ║        ║   ║ ║
╣▒ ▒║▒║        ╣└ ┐║│║
║ ║ ║ ║   =>   ║ ║ ║ ║
╣▒║▒ ▒╠        ╣┐║│ │╠
║ ║   ║        ║ ║   ║
║▒ ▒ ▒║        ║└ ┘ │║
╚════╦╝        ╚════╦╝

Teka-teki 3

╔════╩══╗        ╔════╩══╗
║▒ ▒ ▒ ▒║        ║┌ ┐ └ ┐║
║ ║   ║ ║        ║ ║   ║ ║
╣▒║▒ ▒║▒╠        ╣┘║└ ┐║│╠
║ ╚══ ║ ║        ║ ╚══ ║ ║
║▒ ▒ ▒ ▒╠   =>   ║┌ ─ ┘ │╠
║   ═══ ║        ║   ═══ ║
║▒ ▒ ▒ ▒║        ║│ ┌ ┐ │║
║   ║   ║        ║   ║   ║
║▒ ▒║▒ ▒║        ║└ ┘║└ ┘║
╚═══╩═══╝        ╚═══╩═══╝

puzzle 4

╔═══════╗        ╔═══════╗
║▒ ▒ ▒ ▒║        ║┌ ┐ ┌ ┐║
║     ║ ║        ║     ║ ║
╣▒ ▒ ▒║▒╠        ╣│ └ ┘║└╠
║ ══╦═╩═╣        ║ ══╦═╩═╣
║▒ ▒║▒ ▒║        ║└ ┐║┌ ┐║
║   ║   ║   =>   ║   ║   ║
╣▒ ▒║▒ ▒║        ╣┐ │║│ │║
║ ║ ║   ║        ║ ║ ║   ║
╣▒║▒ ▒ ▒║        ╣│║└ ┘ │║
║ ║     ║        ║ ║     ║
║▒ ▒ ▒ ▒║        ║└ ─ ─ ┘║
╚═══════╝        ╚═══════╝

Teka-teki 5

╔══╩══════╗        ╔══╩══════╗
║▒ ▒ ▒ ▒ ▒║        ║┌ ─ ┐ ┌ ┐║
║   ║     ║        ║   ║     ║
║▒ ▒║▒ ▒ ▒╠        ║└ ┐║└ ┘ │╠
║   ╠════ ║        ║   ╠════ ║
║▒ ▒║▒ ▒ ▒║   =>   ║┌ ┘║┌ ─ ┘║
║   ║     ║        ║   ║     ║
║▒ ▒║▒ ▒ ▒╠        ║└ ┐║└ ─ ─╠
║   ╠═════╣        ║   ╠═════╣
║▒ ▒║▒ ▒ ▒║        ║┌ ┘║┌ ─ ┐║
║   ║     ║        ║   ║     ║
║▒ ▒ ▒ ▒ ▒║        ║└ ─ ┘ ┌ ┘║
╚══╦═══╦══╝        ╚══╦═══╦══╝

Teka-teki 6

╔═══════════╗        ╔═══════════╗
║▒ ▒ ▒ ▒ ▒ ▒║        ║┌ ┐ ┌ ┐ ┌ ┐║
║           ║        ║           ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║│ └ ┘ └ ┘ │║
║       ═══ ║        ║       ═══ ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║└ ┐ ┌ ─ ─ ┘║
║     ═══   ║        ║     ═══   ║
╣▒ ▒ ▒ ▒ ▒ ▒╠   =>   ╣┐ │ │ ┌ ┐ ┌╠
║           ║        ║           ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║│ │ │ │ │ │║
║   ║   ║   ║        ║   ║   ║   ║
║▒ ▒║▒ ▒║▒ ▒║        ║│ │║│ │║│ │║
║   ║   ║   ║        ║   ║   ║   ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║└ ┘ └ ┘ └ ┘║
╚═══════════╝        ╚═══════════╝

Teka-teki 7

╔════╩════════╦╩╗        ╔════╩════════╦╩╗
║▒ ▒ ▒ ▒ ▒ ▒ ▒║▒║        ║┌ ─ ─ ─ ─ ─ ┐║│║
║ ║       ║   ║ ║        ║ ║       ║   ║ ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║        ║│║┌ ─ ─ ┐║┌ ┘ │║
║ ║ ║ ═══ ║     ║        ║ ║ ║ ═══ ║     ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠        ║│ │║┌ ─ ┘ └ ┐ │╠
║   ║           ║        ║   ║           ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║│ │ └ ┐ ┌ ┐ └ ┘║
║     ║ ║     ══╣        ║     ║ ║     ══╣
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║        ║│ └ ┐║│║│ └ ─ ┐║
║     ║ ║       ║        ║     ║ ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║│ ┌ ┘ │ └ ┐ ┌ ┘║
║           ║ ══╣   =>   ║           ║ ══╣
║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║        ║└ ┘ ┌ ┘ ┌ ┘║└ ┐║
╠══       ║ ╚══ ║        ╠══       ║ ╚══ ║
║▒ ▒ ▒ ▒ ▒║▒ ▒ ▒║        ║┌ ┐ └ ┐ │║┌ ─ ┘║
║     ║ ║ ║     ║        ║     ║ ║ ║     ║
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║        ║│ └ ┐║│║│ └ ─ ┐║
║ ║   ║ ║ ╔══   ║        ║ ║   ║ ║ ╔══   ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║        ║│║┌ ┘ │ │║┌ ┐ │║
║ ║     ║ ║     ║        ║ ║     ║ ║     ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║        ║│ └ ─ ┘║└ ┘ │ │║
║       ╚══     ║        ║       ╚══     ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║└ ─ ─ ─ ─ ─ ┘ │║
╚════╦═╦═╦═════╦╝        ╚════╦═╦═╦═════╦╝

Puzzle 8 (Maaf, saya benar-benar tidak punya solusi untuk yang ini)

╔══╩╦══╩═══╩═╩═╩═══╩╗
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║   ║               ║
╣▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║   ╚══ ╔══     ╔═══╣
╣▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒╠
║       ║   ╔══ ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║           ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒╠
║           ║       ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║   ╔═══╗   ╚══     ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║
║   ║   ║           ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠
║ ══╝   ║       ╔══ ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒║
║   ══╗ ╚══ ╔══ ║   ║
╣▒ ▒ ▒║▒ ▒ ▒║▒ ▒ ▒ ▒╠
║     ║     ║   ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║
║   ═══   ══╗   ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
╠══ ║       ║   ╔══ ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒╠
║   ╚══ ║   ║   ║   ║
╣▒ ▒ ▒ ▒║▒ ▒║▒ ▒ ▒ ▒╠
║       ║   ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
╚══╦═══╦═══╦═╦═╦═╦═╦╝

Memasukkan

Input kode Anda dapat memiliki representasi apa pun asalkan mengikuti aturan ini:

  1. Itu harus berupa input grafis. Jadi tidak mungkin untuk membaca daftar koordinat, misalnya.

  2. Dinding horisontal, dinding vertikal, dan pintu harus berbeda, dan harus dibuat dari karakter yang terlihat (tidak ada karakter kosong).

  3. The dapat diganti dengan kosong. Saya hanya menggunakan karakter yang berbeda untuk menyorotnya.

Keluaran

Output juga dapat memiliki representasi apa pun asalkan mengikuti aturan-aturan ini:

  1. Itu harus berupa keluaran grafis. Artinya, seseorang dapat melihat jalan dengan melihatnya.

  2. Aturan nomor satu menyiratkan bahwa karakter jalur berbeda. Artinya, akan ada setidaknya 6 karakter jalur; horisontal, vertikal, dan sudut.

  3. Agar jawaban menjadi valid, output harus papan yang sama dengan input (jelas) dengan semua sel (dalam representasi saya, the ) diisi. Mengisi celah di antara sel adalah opsional.

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.

1 Ada beberapa level Alcazar yang memiliki sel dan terowongan opsional. Ini tidak akan dipertimbangkan.

2 Ada beberapa papan Alcazar yang tidak mungkin.

Phelype Oleinik
sumber
2
Program saya tidak menemukan solusi untuk puzzle 8. Apakah Anda yakin itu bisa dipecahkan? Mungkin salah ketik?
edc65
1
@ edc65 sama di sini - tidak ada solusi untuk # 8
ngn

Jawaban:

5

Python 3 , 809 728 723 714 693 688 684 663 657 641 639 627 610 571 569 byte

Sunting: Disimpan 55 byte berkat @Felipe Nardi Batista

Tidak menjalankan test case terakhir dalam 60 detik pada TIO, tetapi harus bekerja dengan benar. Mengembalikan daftar koordinat untuk jalur. Sekitar 400 byte digunakan untuk mendapatkan daftar data dari I / O.

A=enumerate
I,J="═║"
B=range
L=len
K=-1
Z=1,0
X=0,1
C=K,0
V=0,K
E=lambda a,b,p:(((a,b)in d)*L(p)==H*h)*p or max([E(q+a,w+b,p+[(q+a,w+b)])for q,w in y[a][b]if~-((q+a,w+b)in p)*-h>w+b>K<q+a<H]+[[]])
x=input().split("\n")
h=L(x[0])//2
H=L(x)//2
y=[[{C,Z,V,X}for i in B(h)]for j in B(H)]
d=[]
exec('d+=[(%s,i)for i,a in A(x[%s][1::2])if I<a]\nfor i,u in A(x[%s:%s:2]):\n d+=[(i,0)]*(J<u[0])+[(i,h-1)]*(J<u[K])\n for j,w in A(u[%s:%s:2]):\n  if"%s"==w:y[i][j]-={%s};y[i+%s][j+%s]-={%s}\n'*2%(0,*X,"",2,K,J,X,*X,V,H-1,K,2,K,1,"",I,Z,*Z,C))
print(max(E(*D,[D])for D in d))

Cobalah online!

Halvard Hummel
sumber
@HalvardHummel Baiklah, maaf atas rumusan tantangan yang buruk. Jadi saya mengusulkan yang berikut ini. Skor akan dihitung dengan mengalikan jumlah byte dengan waktu berjalan, sehingga waktu berjalan dan jumlah byte akan dihargai. Apa yang kamu pikirkan?
Phelype Oleinik
1
@PhelypeOleinik Saya tidak berpikir itu adalah sistem penilaian yang sangat baik. Menjaga golf mahasiswi adalah solusi yang lebih baik, tetapi jika Anda benar-benar mencari solusi, saya yakin ini dapat dimodifikasi agar lebih efisien.
caird coinheringaahing
@cairdcoinheringaahing Saya mengerti bahwa solusi paling elegan adalah tetap seperti itu. Tetapi sebuah algoritma yang membutuhkan "berhari-hari atau bahkan berbulan-bulan" untuk menyelesaikan papan puzzle 8x12 entah bagaimana tidak efisien, bukan begitu? Cara saya melihatnya, suatu algoritma yang memecahkan masalah dalam waktu yang lebih sedikit harus dihargai, bahkan jika itu sedikit lebih lama.
Phelype Oleinik
3
@PhelypeOleinik "Efisiensi" dari kode tidak relevan. Anda telah menantang kami untuk menulis kode pendek, dan itulah dasar dari tantangan Anda. Menambahkan kecepatan di mana program berjalan ke campuran hanya mempersulit hal-hal yang tidak perlu dan juga dapat dieksploitasi untuk skor yang konyol. Sistem penilaian khusus cenderung tidak berhasil. Jika Anda ingin kode pendek, buat pertanyaan kode-golf. Jika Anda ingin kode cepat, buat pertanyaan kode tercepat. Mencoba mencampurkan keduanya bukan ide yang baik.
LyricLy
Dalam exec(...)string Anda ada lima baris baru, direpresentasikan sebagai \n, 5 * 2 = 10 byte. Menggunakan string yang dikutip tiga kali lipat akan menambah 4 byte ( ...''...''...) tetapi kemudian menghapus 5 byte, karena karakter baris baru yang sebenarnya dapat digunakan. Secara total ini bisa menghemat satu byte.
Jonathan Frech
5

APL (Dyalog Classic) , 319 byte

iNj←⍳1+n←×/N←⌊2÷⍨⍴a←⎕⋄e←↑⊃,/{(,~'#='∊⍨a[(⍵⌽⍳2)∘+¨2×⍳N+⍵=⍳2])/,2,/[⍵]⊃,[⍵]/n i n}¨⍳2
r←{e g c←⍵⋄d←+/j∘.=∊g⋄e⌿⍨←(≠/c[e])∧2>⌈/d[e]⋄n≡≢g:gj/⍨d=10≡≢e:02>⌊/d+D←+/j∘.=,e:0⋄u←,¯1↑e←e[⍒⌊/D[e];]⋄e↓⍨←¯1⋄0≢r←∇e(g⍪u)(c-(-/c[u])×c=c[⊃u]):r⋄∇e g c}e(0e)j
a[1+2×⍳N]←' ??┌?─┐┬?└│├┘┴┤┼'[2⊥(↑(⊂i),¨¨{⊖∘⍉⍣⍵⊢n⍪¯1↓⌽∘⍉⍣⍵⊢i}¨⍳4)∊↓r⍪⌽r]
a

Cobalah online!

Input digunakan =#F7LJ<>^v.sebagai ganti ═║╔╗╚╝╣╠╩╦▒agar sesuai dengan charset klasik .

Semua test case kecuali untuk yang terakhir lulus dalam beberapa detik.

Tes terakhir memakan waktu 47 menit di komputer saya dan tidak menghasilkan solusi.

Ketika jalur yang dihasilkan menggunakan pintu di dekat sudut, jalan itu mungkin dibuat secara tidak benar (seolah-olah jejak itu bercabang dan melewati pintu imajiner tambahan), tetapi itu masih dapat dilihat dan tidak ambigu.

ngn
sumber
Sangat bagus! Jika saya boleh bertanya, pendekatan apa yang digunakan kode Anda untuk menyelesaikan? Pencarian yang melelahkan atau sesuatu yang lebih elegan? Juga, seperti yang saya katakan, saya tidak memecahkan puzzle terakhir dengan tangan. Itu tidak memiliki solusi langkah-demi-langkah yang jelas dan membutuhkan, bahkan ketika menyelesaikan dengan tangan, sebuah dugaan untuk menemukan beberapa jawaban. Teka-teki ini termasuk dalam permainan asli, tetapi mungkin tidak memiliki solusi, jadi mungkin tidak boleh diperhitungkan.
Phelype Oleinik
1
@PhypeOleinik Ya, ini merupakan pencarian yang agak tidak canggih. Alasan ia menemukan solusi yang ada dengan cepat adalah karena ia mencoba kasus yang lebih mungkin pertama (dengan vs tanpa tepi tertentu dalam grafik - heuristik saya adalah min dari derajat dari dua simpul, lebih rendah lebih mirip). Alasan mengapa ia bekerja sangat buruk dalam kasus terakhir adalah karena ia menguji semua kemungkinan dan memangkas rekursi hanya pada kontradiksi yang jelas. Tampaknya tidak ada algoritma jalur Hamiltonian yang dikenal baik, bahkan untuk kasus khusus grafik tingkat-terikat (≤4 tetangga).
ngn
3

JavaScript (ES6), 274 byte

Input sebagai string multiline, setiap baris diakhiri dengan karakter baris baru. Pintunya ditandai dengan karakter '2'

Output sebagai string multiline dengan lintasan yang ditandai oleh karakter '1', sangat mudah terlihat.

Ini adalah Pencarian Pertama Kedalaman , mencoba semua jalur dan backtraking saat macet. Ini tidak efisien sama sekali, tetapi dapat memecahkan teka-teki 1 .. 6 dalam waktu kurang dari 1 menit.

z=>(w=z.search`
`+1,t=(w-2)*(z.length/w-1)/4,z=[...z],R=(p,l,q)=>[1,-1,w,-w].some(d=>l<t?z[q=p+d]<1&z[q+d]<1&&(R(q+d,++z[q]+l)||--z[q]):z[p+d]>1&&--z[p+d],++z[p])||--z[p],z.some((c,i)=>-c&&(x=i%w,R(i<w?i+w:x?x>w-3?i-1:i-w:i+1,--z[i])||++z[i]*0))&&z.join``.replace(/0/g,' '))

Kurang golf

z => (
  w = z.search`\n`+1, // board width and offset to next row
  t = (w-2)*(z.length/w-1)/4, // total size of board, number of cells that must be filled
  z = [...z], // convert string to array
  d = [1, -1, w, -w], // delta to next position in all directions
  // recursive search
  // given a current position, try to move in all directions
  // if the board is not full, look for an emoty cell
  // if the board is full, look for a door
  R = (p, // current position
       l, // fill level
       q  // parameter used as a local variable
      ) => (
        ++z[p], // mark current position
        // .some will terminate early if the called function returns true
        // in case of return true the recursive function returns all way up leaving the path marked
        // in case of return false we need to unmark path and backtrack
        d.some( d => // for each direction, offset in d
          l < t // check if board is full
          ? z[q=p+d] < 1 & z[q+d] < 1 // not full, try to advance 
            && (++z[q], // mark intermediate cell
                R(q+d, 1+l) // recursive call incrementing fill level
                || --z[q] // if R return false, backtrack: unmark intermediate cell
               )
          : z[p+d] > 1 && --z[p+d]
        ) // full, ok only if I find a door nearby
        || --z[p], // if some returns false, unmark and backtrak
  // look for doors and for each door call R 
  // when R returns true, stop and return the marked board
  // if R returns false for each door, no solution, return false
  z.some((c,i) => 
   -c && // if numeric and != 0
    (x = i%w,
     z[i]=1, // marking starting position (door)
     R(i<w ? i+w : x ? x > w-3 ? i-1 : i-w : i+1, 1)
     || (z[i] = 2, false) // if R returned false, unmark a return false
    ) 
  ) && z.join``.replace(/0/g,' ') 
)

Di dalam cuplikan tes ada solusi menggunakan DFS dengan beberapa kendala yang memecahkan puzzle 7 dalam waktu kurang dari satu menit (pada PC saya). Puzzle 8 tidak memiliki solusi. Kendala:

  • Semua sel kosong harus dapat dijangkau dari sel saat ini - ruang kosong tidak boleh dibagi menjadi dua bagian
  • Pasti ada pintu yang bisa dijangkau
  • Konfigurasi sel tidak dapat dieksplorasi lebih dari satu kali
  • Tidak dapat melewati sel yang hanya memiliki satu sel berdekatan yang kosong

Uji

Hati-hati, puzzle 7 jauh melampaui batas waktu untuk eksekusi javascript di browser apa pun (menggunakan pemecah Pendek dan Lambat)

edc65
sumber