Hashiwokakero ("membangun jembatan" dalam bahasa Jepang) adalah teka-teki di mana Anda ditugaskan untuk menghubungkan sekelompok pulau dengan jembatan. Aturannya adalah:
- Jembatan harus berjalan baik secara vertikal maupun horizontal antara dua pulau.
- Jembatan mungkin tidak saling bersilangan.
- Sepasang pulau mungkin dihubungkan oleh paling banyak dua jembatan paralel.
- Setiap pulau ditandai dengan angka antara 1 dan 8, termasuk. Jumlah jembatan yang terhubung ke sebuah pulau harus cocok dengan nomor di pulau itu.
- Jembatan harus menghubungkan pulau-pulau menjadi satu kelompok yang terhubung.
Tugas Anda adalah menulis sebuah program yang akan menyelesaikan teka-teki Hashiwokakero.
Anda dapat mengasumsikan bahwa setiap teka-teki yang diberikan dapat dipecahkan dan hanya ada satu solusi.
Program harus cukup efisien. Misalnya, memecahkan teka-teki 25x25 di bawah ini seharusnya tidak perlu lebih dari 10 menit pada PC rata-rata dan tidak boleh menggunakan lebih dari satu gigabyte memori. Memecahkan puzzle yang lebih kecil seperti yang 7x7 akan membutuhkan waktu beberapa detik.
Memasukkan:
Teka-teki akan diberikan sebagai peta karakter 2D, dengan digit 1
untuk 8
mewakili pulau, dan ruang mewakili air. Garis-garis akan diisi dengan spasi jika perlu untuk membuat mereka semua memiliki panjang yang sama.
Pulau-pulau akan selalu dipisahkan secara horizontal dan vertikal dengan setidaknya satu kuadrat air sehingga ada ruang untuk menempatkan jembatan potensial di antara mereka. Akan selalu ada setidaknya dua pulau dalam teka-teki.
Program Anda sebaiknya membaca peta puzzle dari input standar, tetapi Anda dapat menentukan metode input alternatif jika bahasa pemrograman Anda membutuhkannya.
Keluaran:
Keluaran harus seperti input, kecuali dengan spasi diganti dengan jembatan yang diperlukan. Jembatan harus digambar menggunakan karakter menggambar kotak Unicode ─
(U + 2500), │
(U + 2502), ═
(U + 2550) dan ║
(U + 2551) untuk mewakili jembatan tunggal dan ganda horisontal dan vertikal.
Jika karakter Unicode yang masalah, Anda dapat menggunakan karakter ASCII -
, |
, =
dan H
sebagai gantinya.
Kriteria menang:
Ini kode golf. Solusi terpendek yang benar dan cukup efisien menang.
Contoh:
Teka-teki (7x7):
2 2 1
1 4 3
3 2
4
3 2 3
1
3 4 2
Larutan:
2─2──1
│1──4─3
3──2║ ║
│ │4 ║
│3─2║ 3
1║ ║ │
3──4─2
Teka-teki (25x25):
2 2 2 2 1 1 2 2 2 2 2
1 3 5 4 4 2
2 2 4 5 5 4 2 2 1 3
2 1 1 3 3 2 2
3 4 4 4 4 5 4 3 2 3
2 4 5 4 2 3
2 1 4 2 4 3 1 1 2
2 1 3 1 1 6 4 2
3 2 4 3 6 3 2
2 2 3 3 2 5 2 4 3
2 1 1 2
1 3 3 3 3 5 8 7 6 5 4
2 3 1 1 2
1 1 5 1 4 5 6 3 1 2
1 1 2 2 3 4
3 5 4 4 3 3 8 7 5 1 2
2 3 1 2 2 1 1
2 2 2 2 5 7 6 3 3
3 3 6 3 5 3 2 2 2 3
2 1 2 3 2 2
3 4 6 4 5 5 3 3 5 1
2 1 2 2 1 1 3
2 1 1 2 3 6 5 2 2
2 3 4 4 4 2 1
2 2 2 2 2 2 2 1 1 3 2
Larutan:
2─2─2──2 1 1─2─2──2──2─2
│ │ │1─3═5══4══4─2│
2 2─4─5══5═4═2│2──1 │ │3
│ 2│ ║1│ 1─3═3─2│ │ 2║
│ ║3═4│4══4─4═5─4─3──2 │3
2 4═5─4│ │ │ ║ │ │2───3│
│2─1║ ║4─2│ 4─3 │ 1│ 1 │2
2│1─3 ║║ │1 ║1──6══4 │ 2│
│3─2──4║ 3══6─3 ║ │ │ │2
2│2═3 │3──2 │ ║ 5─2│ 4─3│
│2─1│ │ │ │ ║ ║ │1 ║ │2
│ 1─3─3─3─3─5═8═7═6──5═4│
2──3───1│1─2│ ║ │ ║ ││
1 │ 1──5─1││ 4─5─6─3─1│2
1│ │1──2║ │2 │ ║ ║ │3═4│
│3─5═4 │4──3│ 3═8═7═5│1│2
2│ │ ║ 3│ 1│2──2║ │ ║1│1│
│2 │ ║ ║2 │2──2│5═7═6─3─3
3│ 3─6─3│ 5═3 │2│ ║2│2─3│
║2 │ ║ │ ║ │ 1│2─3║2│ ║2
3│ 4═6──4─5─5──3─3─5││1║│
│2 │ │1 │ │2║2──1│ ║1││3│
2│ │ 1│ │ 1║2│3══6═5─2││2
│2─3──4═4──4─2│ │ │1│
2─2──2─2──2─2─2 1 1─3─2
1 1
menjadi input?1 1
, yang merupakan puzzle yang valid dan harus ditangani dengan benar.Jawaban:
Haskell, 1074 karakter
Awalnya, saya memilikinya bahkan lebih murni Jepang dengan juga menerapkan fungsi primitif dalam hal pencocokan pola sederhana dan daftar kombinasi:
Haskell, 1192
berjalan dalam ≈3 menit pada i5 saya .
Versi yang dikomentari:
sumber
Python, 1079 karakter
Kode melakukan pencarian lengkap yang cukup mudah
S
, menggunakan beberapa kendala propagasi untuk membuatnya berjalan dalam waktu yang wajar.E
mewakili set tepi saat ini, dalam format [dari, ke, delta, bobot yang mungkin] . dari dan ke adalah pengidentifikasi pulau dan delta adalah 1 untuk tepi horizontal atau W (= lebar garis) untuk tepi vertikal. kemungkinan bobot adalah sublist dari [0,1,2] yang mengkodekan keadaan saat ini dari sisi tersebut (0 = tanpa jembatan, 1 = jembatan tunggal, 2 = jembatan ganda).S
melakukan tiga hal. Pertama, ia menyebarkan informasi, seperti jika satu sisi tidak lagi memiliki bobot 0 sebagai kemungkinan, maka semua tepi yang melintasinya dihilangkan (kemungkinan bobotnya diatur ke [0]). Demikian pula, jika jumlah berat minimum untuk insiden tepi pada sebuah pulau sama dengan berat pulau, maka semua tepi tersebut diatur ke minimum.Kedua,
S
periksa apakah grafik masih terhubung menggunakan sisi yang tidak [0] (Q
perhitungan).Akhirnya,
S
memilih tepi yang masih belum sepenuhnya ditentukan dan menyebut dirinya secara rekursif, mengatur tepi itu ke salah satu kemungkinan yang tersisa.Butuh sekitar 2 menit untuk contoh terbesar.
sumber
print(B);sys.exit(0)
C # -
660156612225Tidak terlalu pegolf. Menggunakan pustaka pemrograman kendala dari google atau-tools. Membangun kendala untuk jumlah total tepi dan untuk menghilangkan jembatan penyeberangan, tetapi agak sulit untuk mendefinisikan kendala untuk memastikan mereka semua terhubung. Saya memang menambahkan logika untuk memangkas 2 = 2 dan 1-1 komponen, tapi saya masih harus melalui daftar akhir (39 pada yang besar) dan menghilangkan yang tidak sepenuhnya terhubung. Bekerja sangat cepat. Hanya membutuhkan beberapa detik pada contoh terbesar. Tidak Terkumpul:
sumber