Catatan: Ini adalah kelanjutan dan revisi jawaban saya yang lain .
Masalah dengan reduksi
Ingat masalah keputusan:
Apakah ada ubin sempurna yang menutupi kotak dengan ubin unik?n(n+1)×(n+2)n
Jadi untuk kisi , kita hanya bisa menggunakan variabel .n(n+1)×(n+2)n
Tapi:
- Pengurangan kami membutuhkan banyak variabel unik, lebih dari .O(n)
- Selain itu, kabel kami bersifat terbuka, yang mengarah ke:
- Bagaimana kami tahu bahwa kami dapat memasang ubin di area terbuka?
Untuk mengatasi masalah pertama, kami secara artifisial membuat papan permainan lebih besar; intinya kita membuat sama dengan jumlah variabel yang sebenarnya kita butuhkan, lalu membuat kisi ukuran , dan menempatkan kisi kita di sudut kiri bawah. Ini akan menyebabkan blowup kuadratik.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)
Untuk masalah kedua, kita harus memikirkan kembali gadget kita sedikit.
Tampaknya agak menakutkan untuk membuktikan bahwa kita dapat berhasil memasang papan yang lain sesuai aturan. Jadi kita mulai dengan strategi yang sama yang akan digunakan untuk benar-benar menghasilkan papan permainan ukuran :(n+1)×(n+2)
Pertama, kami menghasilkan satu set semua ubin yang mungkin. Semua ubin ini harus ditempatkan di papan tulis. Lalu kami menghapus ubin, dan meninggalkan kotak mereka.
Namun, gadget kami tidak menjamin satu set ubin tertentu akan ditempatkan; ubin yang ditempatkan tergantung pada negara. Jadi kita harus hati-hati memodifikasi gadget untuk memastikan ubin tertentu akan dihapus, tidak peduli negara mana yang dipilih.
Mari kita pergi ke gadget kita.
Kawat dan gerbang klausa bermasalah karena dua alasan.
- Kita tidak tahu bahwa bujur sangkar yang mengelilingi kawat atau gerbang klausa dapat ditata dengan benar; setelah semua, beberapa kabel dapat didorong ke kiri, yang lain ke kanan, dan ubin kotak putih yang tersisa menjadi non-sepele. Kami akan menyebut masalah ini sebagai masalah "aliran".
- Tidak ada cara untuk mengetahui ubin mana yang harus dihapus dari ubin-set; di satu negara, satu set kotak, di kawat atau gerbang klausa, akan ubin, di negara lain, satu set kotak yang sama sekali berbeda akan ubin.
Untuk mengatasi masalah ini:
- Pertama, kami menghasilkan satu set semua ubin yang mungkin. Semua ubin ini harus ditempatkan di papan; saat kami meletakkannya di papan tulis, kami akan menghapus ubin dari set. Meskipun kita mungkin tidak di kenal pertama , karena kita belum sepenuhnya menggambarkan formulasi, kita dapat menambahkan semua kemungkinan genteng baru seperti yang kita kenaikan , sesuai kebutuhan. Semua ubin yang kami hapus dari set ini harus dijamin placeable (setidaknya, dijamin placeable jika formula memuaskan). Kami memanggil menghapus ubin dari set-ubin, untuk "melepaskan" ubin dari set-ubin, seperti untuk melepaskan kewajiban kami untuk menempatkannya di papan-permainan.nnn
- Kami harus merancang gadget dengan hati-hati untuk memastikan ubin tertentu akan dihapus, apa pun negara bagian yang dipilih.
- Kita harus menutup gadget kita, sehingga mereka tidak mendorong ubin di sekitar papan tergantung pada negara mereka; alih-alih semua negara bagian mereka hanya harus mengambil area tertentu yang didefinisikan dengan baik.
- Atau, semua negara mereka harus dijamin untuk dapat mengambil area yang didefinisikan dengan baik; ini menjamin ubin yang memuaskan, tetapi tidak menjamin bahwa ubin tertentu akan terjadi. Ini adalah cara yang sama dengan permainan Dominosa dibuat:
- Pertama, ubin dibuat menjadi satu set;
- Kemudian ubin ditempatkan dalam konfigurasi acak,
- Karena setiap ubin ditempatkan, itu dihapus dari ubin-set.
- Kemudian ubin dikeluarkan dari papan, meninggalkan kotak mereka.
- Ini tidak menjamin bahwa konfigurasi yang dimaksud akan dipilih,
- Sebaliknya, itu menjamin bahwa konfigurasi yang dimaksud dapat dipilih, dan dengan demikian ada solusi. Kita dapat melakukan hal yang sama di sini.
- Setelah menempatkan semua gadget formulasi, alih-alih menempatkan kuadrat unik secara default, yaitu pada semua "spasi putih", kami memastikan spasi putih adalah area persegi panjang dengan satu dimensi genap, atau memecah ruang putih menjadi empat persegi panjang dengan satu dimensi genap, dan kami cukup ubin spasi putih dengan ubin yang tersisa di ubin-set.⋆
- Setelah menempatkan semua ubin dari set, kami tahu semuanya bisa dilakukan.
- Beberapa ubin jelas akan dapat ditempatkan, seperti yang ada di dinding, yang lain akan dapat ditempatkan hanya jika formula memuaskan, karena sifat hubungan antara gadget.
- Lalu kami menghapus ubin, dan meninggalkan kotak mereka.
Mari kita pergi ke gadget kita.
Memaksa gadget
Kita dapat membuat jumlah blok bangunan yang sewenang-wenang dengan memastikan masing-masing blok tidak dapat dipasangkan dengan diri mereka sendiri.
Misalnya, katakanlah kami ingin memaksa ubin , sehingga kami dapat menggunakan sebagai blok bangunan. (catatan, adalah variabel arbitrer, yang kami ingin paksakan sebagai pasangan untuk dirinya sendiri, tidak harus merupakan blok penyusun karena kami menggunakan nilai sebelumnya)1 ⋆ 1 ⋆ 1(1⋆,1⋆)1⋆1⋆1
Untuk menjamin bahwa cadangan -building-block kami , kami akan meletakkannya di dinding bawah di konfigurasi berikut: kami akan menempatkan nomor yang dipesan, mari kita sebut itu di dinding seperti up-tack (berbentuk seperti ); di dinding, dan satu di baris ke-2 di tengah. Kemudian kita akan menempatkan dua angka lagi, mari kita memanggil mereka dan ; ini unik untuk gadget ini. Kami menempatkan ini di atas kiri dan kanan .( 1 ⋆ , 1 ⋆ ) 1 ⋆ ⊥ 3 2 ⋆ 3 ⋆ 1 ⋆1⋆(1⋆,1⋆)1⋆⊥32⋆3⋆1⋆
Diilustrasikan di bawah, batas hitam bersama adalah bagian bawah papan permainan, deskripsi dari kiri ke kanan.
- Konfigurasi gadget. Setiap dan sini unik untuk gadget ini.3 ⋆2⋆3⋆
- 3 kemungkinan status ubin pusat .1⋆
Setelah melakukan hal ini, kita dapat menjamin bahwa gadget kami dapat dapat ubin dengan serangkaian tertentu ubin, sementara menjamin bahwa gadget kita harus memaksa pasangan .(1⋆,1⋆)
- Kita tahu bahwa harus terjadi, karena semua 3 kemungkinan status ubin dari menengah bawah , tile as , seperti yang diilustrasikan dalam gambar di sebelah kanan, di atas.1 ⋆ ( 1 ⋆ , 1 ⋆ )(1⋆,1⋆)1⋆(1⋆,1⋆)
- Ubin yang tersisa dapat digubah sebagai dan , yang menutupi gadget. Dengan demikian, kita dapat menghapus ubin-ubin itu dari set-ubin global kita. Diilustrasikan di bawah ini.( 1 ⋆ , 3 ⋆ )(1⋆,2⋆)(1⋆,3⋆)
Keterangan, dari kiri ke kanan:
- Kiri, atas: Keadaan kiri, Kiri, bawah: Ubin yang valid dari kuadrat yang tersisa.
- Middle, top: Middle state, Middle, bottom: Ubin yang valid dari kuadrat yang tersisa.
- Kanan, atas: Keadaan kanan, Kanan, bawah: Ubin yang valid dari kuadrat yang tersisa.
Perhatikan, bahwa ubin dari kuadrat yang tersisa tidak dipaksakan , karena mereka dapat ubin dengan tetangga terdekat bukan , tetapi karena itu adalah ubin papan permainan yang valid di semua negara bagian , kita dapat menghapusnya dari ubin-set, dan menganggap mereka akan memasang ubin persis seperti itu. Karena kami tahu ada kemungkinan ubin yang valid, kami memiliki setidaknya satu kemungkinan ubin papan permainan, jika rumusnya memuaskan. Meskipun tidak ada jaminan bahwa ini akan ubin dengan cara ini, ada jaminan bahwa ubin akan dipaksakan.( 1 ⋆ , 1 ⋆ )1⋆(1⋆,1⋆)
Catatan: jika Anda tidak puas dengan ini, atau bingung dengan perbedaan "bisa memasang" vs "dipaksa memasang", Anda cukup meletakkan dinding di sekitar gadget , dengan cara yang sama kami membuat dinding bawah untuk gadget-klausa.3 × 23×23×2
Gadget ini tidak ditutup, karena tidak perlu (tetapi Anda bisa jika mau). Tidak perlu, karena memiliki konfigurasi yang layak, yang dapat kita hapus dari tile-set. Meskipun dimungkinkan untuk melakukan konfigurasi yang berbeda, ini tidak mempengaruhi kepuasan masalah.
Ubin berikut dijamin untuk ubin (sehingga dapat dihapus dari set-ubin): (1⋆,1⋆)
Ubin-ubin berikut dijamin untuk dapat ubin (sehingga dapat dihapus dari set-ubin): (1⋆,2⋆),(1⋆,3⋆)
Jika Anda memilih untuk menutup gadget ini dengan dinding, maka juga akan menjadi dijamin akan ditanggung.(1⋆,2⋆),(1⋆,3⋆)
Gerbang Kawat dan Klausul Baru
Karena masalah mengalir, dan mengosongkan ubin-set, kita perlu mendesain ulang kawat sedikit.
Salah satu cara untuk mengatasi masalah aliran, adalah membuat kawat menjadi sirkuit, bukan hanya keadaan kiri-kanan yang sederhana; yaitu, itu akan menjadi lingkaran, bukan garis, dan oleh karena itu jika bagian atas dari lingkaran didorong ke kanan, bagian bawah akan didorong ke kiri. Ini memecahkan masalah aliran.
Dengan mengikuti rute ini, kita dapat mengubah wire dan clause gate untuk menyelesaikan kedua masalah.
Pemesanan danFTF
Mari kita memperkenalkan dua nilai-nilai universal yang baru, dan . Kedua nilai ini bersifat universal; nilai aktual dalam kisi, seperti nilai kuadrat dan (karena berdasarkan konvensi, kami mencadangkan sebagai blok bangunan untuk dinding), atau apa pun yang Anda pilih. Mereka mewakili benar dan salah, masing-masing.F 2 3 1TF231
Kami mencadangkan ubin secara paksa , , , sebagai berikut; ilustrasi di bawah ini, deskripsi dari kiri ke kanan:( T , T ) ( F , F )(T,F)(T,T)(F,F)
- Kami menggunakan skema yang sama dengan memaksa ubin , menggunakan sebagai . Setiap dan sini unik untuk gadget ini.T 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)T1⋆2⋆3⋆
- Kami menggunakan skema yang sama dengan memaksa ubin , menggunakan sebagai Setiap dan sini unik untuk gadget ini.F 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆2⋆3⋆
- Kami menggunakan skema yang sama dengan memaksa , menggunakan sebagai di tengah, dan menggunakan di lokasi lain dari up-tack. Ini memaksa ke ubin. dan dapat melakukan tile dengan , jadi kami menghapusnya dari set-ubin. Setiap dan sini unik untuk gadget ini.F 1 ⋆ T ( F , T ) 2 ⋆ 3 ⋆ T 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T2⋆3⋆
Kawat
Setiap kawat akan mulai dan diakhiri dengan sebuah nilai, mari kita sebut , yang unik dengan to wire. Untuk setiap klausa yang diikuti oleh kawat, kawat akan memiliki dua nilai kawat, , dan , yang unik untuk setiap kawat, dan berpartisipasi dalam klausa yang sama. Ilustrasi di bawah, dengan deskripsi dari kiri ke kanan.x ⋆ x ′ ⋆A⋆x⋆x′⋆
- Kawat yang berpartisipasi dalam satu klausa. Kawat memiliki ketinggian , dan memiliki panjang , di mana adalah jumlah klausa yang diikuti oleh kawat tersebut. Kawat tersebut diisi oleh dua kotak di sebelah kiri, dan dua di sebelah kanan. Tentu saja, dikelilingi oleh dinding di semua sisi, ditunjukkan oleh garis biru. Perhatikan, bahwa unik untuk kawat ini, dan hanya akan digunakan dalam kawat, dan klausa yang diikutinya.22∗p+3pA⋆1⋆
Yang diilustrasikan di bawah ini adalah dua keadaan, deskripsi dari kiri ke kanan.
- Kawat yang berpartisipasi dalam satu klausa, dalam kondisi sebenarnya. Kawat dianggap benar, ketika kotak dipasangkan dengan kotak , dan kotak dipasangkan dengan kotakItu dianggap salah di negara lain, di mana ubin terbalik. Perhatikan bagaimana ubin dipaksa setelah ubin dipilih: sudah dipaksa sebelumnya, sehingga sisa ubin harus horisontal.x⋆Tx′⋆FA⋆(T,F)
- Kawat yang sama dalam kondisi salah.
Ketika berpartisipasi dalam lebih banyak klausa, ada lebih banyak nilai , dan , satu pasang untuk setiap klausa yang diikuti. Kawat bergantian berada di atas dan bawah, seperti halnya dan kotak yang memisahkan setiap pasangan.x⋆x′⋆TFx⋆,x′⋆
Dua negara bagian yang bersesuaian.
Gadget ini ditutup , sehingga tidak ada "masalah aliran".
Perhatikan bagaimana di kedua negara bagian, kami mengumpulkan ubin berikut, apa pun kondisinya: , , .(A⋆,A⋆)(A⋆,T)(A⋆,F)
Namun ada beberapa ubin, yang kita tidak yakin; dalam satu keadaan kita dapat menghapus dari ubin-set, sementara di negara lain kita dapat menghapus dari tile-set, jadi ubin mana yang bisa kita gunakan sebenarnya menghapus? Jawabannya adalah: gerbang klausa memiliki masalah yang sama, tetapi dengan set ubin yang berlawanan. Itu akan selalu mengumpulkan ubin yang tersisa, berlawanan, dan tidak terkumpul, seperti yang akan kita lihat di bagian selanjutnya. Karena masing-masing dipasangkan dengan gerbang klausa, kami akan dapat menghapus keduanya.(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
Ayat
Selanjutnya kita akan membuat iterasi pertama gerbang klausa baru. Ini terdiri dari gadget , dikelilingi oleh dinding. Di dalam gadget, kami menempatkan satu di tengah atas, dan dua kotak di sudut bawah; satu di kiri bawah, dan satu di kanan bawah. Kotak yang tersisa akan menjadi nilai yang mewakili variabel kawat dari tiga kabel yang berbeda. Mari kita sebut dan . The akan dipaksa untuk pasangan dengan salah satu kawat-variabel, dan kawat-variabel yang tersisa akan memasangkan dengan nilai-nilai. Ilustrasi di bawah, deskripsi dari kiri ke kanan.2×3FTa⋆,b⋆,c⋆FT
- Kiri: Konfigurasi untuk iterasi pertama gerbang klausa baru.
- Kanan Tiga kemungkinan status dari ubinF
Tiga kondisi ini mengarah pada tiga kemungkinan kemiringan. Ilustrasi di bawah, deskripsi dari kiri ke kanan.
- Kiri, atas : ubin kiri, Kiri, bawah: Ubin kotak yang tersisa.F
- Tengah, atas : ubin kanan, Tengah, bawah: Ubin kotak yang tersisa.F
- Kanan, atas : ubin ke bawah, Kanan, bawah: Ubin kotak yang tersisa.F
Karena akan dipasangkan dengan salah satu variabel kawat dalam klausa , variabel kawat itu tidak bisa lagi dipasangkan dengan di kawat ; dengan demikian memaksa kawat untuk benar. Sebaliknya, variabel kawat yang tersisa yang ubin dengan akan dipaksa untuk ubin dengan dalam kabel mereka. Ini persis kendala yang sama dengan klausa.FF TF1-in-3-SAT
Catatan, dan adalah variabel kawat, tetapi masing-masing dapat merujuk ke atau variabel kawat; menggunakan pada dasarnya meniadakan variabel kawat.a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Satu tambahan: untuk melepaskan kewajiban mengetahui ubin mana yang dapat dihapus dari ubin-set, kita harus "menggandakan dan kontrapositif" klausa. Yang saya maksud dengan ini, adalah membuat gadget lainnya, dengan variabel tambahan yang mewakili negasi dari dan . Mari kita sebut dan . Ini harus berupa nilai variabel-kawat yang dinegasikan dari dan . Ini gadget berbeda, dalam hal ini akan memiliki di pusat, dan dua3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆a⋆,b⋆,c⋆3×2TF nilai di sudut; kebalikan dari gadget klausa yang dijelaskan sejauh ini. Dengan "menggandakan" klausa seperti ini, kami menambahkan kembali kendala yang sama seperti gadget yang dijelaskan di atas. Namun, kami juga menjalankan semua kombinasi dari tile-set, untuk setiap variabel (dan dengan demikian untuk dan juga, karena semuanya adalah variabel-variabel kawat). Diilustrasikan di bawah, deskripsi dari kiri ke kanan.(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- Klausa "ganda dan kontrapositif". Bagian bawah adalah klausa yang dijelaskan di atas; bagian atas adalah klausa contrapositive yang baru dijelaskan. Klausa baru memiliki kendala logis yang persis sama; itu adalah kontrapositif dari klausa bawah. Bersama-sama, gadget gabungan ini dan kabel melepaskan semua kombinasi dari tile-set, untuk setiap variabel kawat yang berpartisipasi dalam klausa.(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- Garis biru di tengah-tengah sosok paling kiri ada untuk memudahkan penglihatan; pada kenyataannya itu dapat dihapus tanpa mengizinkan negara lagi.
Jadi, mari kita ambil contoh, untuk menunjukkan bahwa semua ubin bisa habis seperti yang dijanjikan. Diilustrasikan di bawah, deskripsi dari kiri ke kanan.
- Gambar kawat yang berpartisipasi dalam satu klausa; sebuah negara dipilih untuk klausa. Di sini, kita menggunakan , sementara dan mewakili nilai-nilai kawat lain dalam klausa ini.1⋆=b⋆a⋆b⋆
- Untuk negara yang diberikan dalam ayat tersebut, nilai dipaksa untuk dipasangkan dengan tetangga .1⋆T
- Ini menyebabkan kawat dipaksa bernilai benar (Anda dapat mengatakan bahwa variabel positif dari kawat dipaksa untuk berpasangan dengan , dan variabel negatif dipaksa untuk berpasangan dengan , seperti dijelaskan di atas ).TF
- Ini memaksa dalam klausa kontrapositif (bagian atas klausa) harus dipasangkan dengan dalam klausa. Sekarang jika Anda melihat kawat, setiap ubin di dalam kawat dijamin akan habis: baik habis di kabel itu sendiri, atau di gadget klausa yang sesuai. Dalam keadaan ini, kami memiliki ubin, , , , , , , dan .1′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
Mencoba keadaan lain, kita mendapatkan ilustrasi di bawah ini, deskripsi dari kiri ke kanan.
- Klausa berada di negara bagian lain, ubin dalam salah satu dari dua cara.(1⋆,T
- Oleh karena itu, dipaksakan,(1⋆,F
- Memimpin sisa kawat ke ubin sesuai, dan nilai kawat itu salah.
- Akhirnya, di bagian kontrapositif / atas gadget klausa, harus di-tile, karena diambil di kawat. Dalam keadaan ini, kami memiliki ubin, , , , , , , dan . Ini adalah ubin yang sama seperti di negara bagian lain .(1′⋆,F)(1′⋆,T)(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
Jadi di kedua negara, kami melepaskan ubin yang sama. Oleh karena itu, kawat dan klausa bersama berhasil mengeluarkan ubin tertentu jika ada tugas yang memuaskan.
Gadget ini ditutup , sehingga tidak akan ada masalah aliran.
Gadget klausa bersama dengan gadget kawat dijamin untuk selalu melepaskan nilai pasangan ubin yang sama , dan dengan demikian kita dapat melepaskannya bahkan jika kita tidak tahu ke arah mana ubin itu akan dipasang.
Sekarang semua gadget kami memenuhi kriteria.
Perumusan
Dalam formulasi akhir kami, kami membuat tiga baris gadget, masing-masing dipisahkan oleh dinding horizontal.
- Di bagian bawah, kami menempatkan gadget-paksa, yang tingginya dua ubin. Kami membutuhkan gadget memaksa untuk blok bangunan, dan untuk kombinasi dari dan . Kami menempatkan gadget pemaksa langsung di sebelah satu sama lain.TF
- Di baris tengah, kami menempatkan gadget kawat, secara horizontal, yang tingginya dua ubin. Gawai kawat harus dipisahkan satu sama lain dengan dinding vertikal.
- Di baris atas, kami menempatkan gadget klausa, yang tingginya empat ubin. Gadget klausa harus dipisahkan satu sama lain oleh dinding vertikal.
Ilustrasi mengikuti, deskripsi di atas setiap gambar. Klik gambar untuk resolusi penuh. Kode sumber untuk mereproduksi / menghasilkan gambar tercantum di bagian bawah halaman.
Menggunakan rumus sebagai contoh, kami memiliki kepuasan solusi sebagai saksi.Φ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4)(¬x1,x2,x3,¬x4)
Pertama kita mulai dengan dinding horizontal yang memisahkan barisan gadget. Kami menunjukkan kotak, dan pasangan yang dipaksa untuk memasang di dalam dinding.
Selanjutnya, kami menampilkan gadget. Garis biru menunjukkan batas gadget; biru pekat untuk gadget pemaksaan, karena mereka tidak akan dikelilingi oleh dinding. Perhatikan garis di tengah gadget klausa tidak dikelilingi oleh dinding; itu ada untuk memudahkan penglihatan; mengambil garis tidak memungkinkan negara lagi terjadi dalam klausa, seperti yang dijelaskan di atas, tetapi kami menunjukkan garis biru untuk demonstrasi ini. Catatan: bahwa kami menggunakan nama kuadrat untuk memberikan angka keterbacaan semantik, jika ada. Setiap nama mewakili nilai numerik.
Di sini kita mengisi dinding vertikal.
Di sini kami mengisi solusi saksi; yaitu ini adalah solusi ubin jika menggunakan solusi SAT untuk menghasilkannya.
Selanjutnya kita ubin area pengisi; sisa papan, sebesar yang diperlukan, untuk sebesar diperlukan untuk ubin sejauh ini. Jadi kami melepaskan pasangan yang tersisa di ubin-set. Garis putus-putus di sini mewakili ubin yang valid tetapi tidak dipaksa; mungkin ada cara lain untuk memasang ini. Di sini kami menunjukkan sudut kiri bawah.n
Di sini kita mengisi kotak yang tersisa dengan ubin yang valid sepele.
Di sini kami menunjukkan sudut kanan bawah dari grid.
Di sini kami menunjukkan sudut kanan atas grid. Perhatikan bagaimana ubin vertikal tidak lagi pas; jadi kami memasang baris atas secara horizontal, jika perlu.
Dan akhirnya sudut kiri atas.
Menghasilkan seluruh papan permainan sekaligus melalui TeX gagal dengan kesalahan kehabisan memori dari pdflatex, jadi jika Anda ingin melihatnya, Anda harus membuat klip dan menambalnya bersama. Pastikan untuk memeriksa penampil notebook .
Sumber TikZ
Generator game:
graphtex.py
Konversi TeX ke svg, menggunakan pdflatex, pdfcairo (poppler), dan rsvg-convert (libsvg)
dominosa.py
Berisi logika konversi, verifikasi solusi-game, dan logika menggambar
dominosa_demo.py
Demo yang dapat dieksekusi yang menghasilkan gambar yang digunakan dalam jawaban di atas. Tuang gambar ke direktori saat ini yang berfungsi.
dominosa_demo.ipynb
Demo ipython yang menghasilkan gambar yang digunakan dalam jawaban di atas.