Permainan
Baru-baru ini, sebagian besar waktu saya dihabiskan oleh permainan adiktif di ponsel saya, yang disebut Logic Dots, yang menginspirasi saya untuk menulis tantangan ini. Lebih mudah untuk menjelaskan aturan jika saya menunjukkan tampilan permainan, jadi di sini adalah tangkapan layar dari teka-teki yang belum terpecahkan, dan dipecahkan:
Sekarang di sini, ada tiga hal utama yang perlu diperhatikan.
- Papan permainan (kotak 4x4 kotak di tengah)
- Bentuk yang diperlukan (titik-titik yang ditautkan di bilah kedua dari atas, di bawah skor dan menu, dll.), Yang semuanya adalah garis, atau
a
dengan 1 persegi panjang - Angka di atas baris dan kolom, yang menunjukkan berapa banyak titik yang harus ada dalam kolom, untuk solusi
Tujuan permainan ini adalah untuk menyesuaikan bentuk yang diperlukan ke dalam kisi. Anda dapat memutar bentuk, tetapi mereka tidak bisa masuk secara diagonal.
Dalam solusinya, perhatikan bahwa semua bentuk dibuat tepat sekali (karena mereka hanya dalam bentuk yang diperlukan sekali), dan dalam hal ini semua bentuk horisontal tetapi juga bisa vertikal. Merah muda yang diisi kotak menunjukkan kotak tidak digunakan.
Berikut ini kisi yang lebih besar, dan sedikit lebih rumit:
Perhatikan bahwa dalam teka-teki yang belum terpecahkan, sudah ada beberapa kotak yang diisi. Kotak berwarna abu-abu menandakan kotak yang diblokir yang tidak dapat Anda tempatkan titik. Titik-titik dengan ekor memberi tahu Anda bahwa ada titik di titik itu, dan titik itu terhubung ke setidaknya satu titik lagi di arah ekor, tetapi tidak ke arah lain (termasuk arah yang berlawanan).
Notasi
Untuk sisa posting ini, saya akan merujuk ke papan menggunakan simbol-simbol berikut:
- <,>, ^, v - Menandakan titik yang ditempatkan sebelumnya dengan ekor memanjang ke arah titik
- * - Menandakan titik. Jika diberikan pada grid (input) yang tidak terpecahkan, itu adalah bentuk individual. Jika dalam output, maka terhubung ke titik-titik di sekitarnya.
- # - Menandakan kotak persegi yang diblokir (tempat Anda tidak dapat menempatkan titik)
- -, | (tanda hubung dan batang) - Menandakan titik dengan ekor kanan dan kiri, dan titik dengan ekor atas dan bawah
- ** (karakter spasi) - ** Menandakan ruang kosong
Dengan menggunakan simbol-simbol ini, contoh kasus terakhir (belum terpecahkan) dapat direpresentasikan sebagai berikut:
<
#
^ #
Dan solusinya dapat direpresentasikan sebagai:
*< * *
*
*
* *
* *#*
^ # *
Perhatikan bahwa tidak ada dua bentuk yang dapat menyentuh secara horizontal, vertikal atau diagonal , sehingga case berikut ini tidak valid:
***
**
**
Tantangan
Tantangan Anda adalah menyelesaikan teka-teki titik logika apa pun, mulai dari 4x4 hingga 9x9 inklusif. Anda akan menerima empat baris input, kemudian papan permainan. Barisnya adalah sebagai berikut:
- Baris pertama, Bentuk - Bentuk yang ditemukan, masing-masing diberikan dalam bentuk
sizexquantity
(mis.3x2
Untuk dua bentuk dengan panjang tiga) dan dipisahkan oleh spasi. Baris contoh:3x1 2x1 1x1
- Baris 2, Kolom - Daftar yang dipisahkan spasi dari jumlah titik yang diperlukan untuk setiap kolom. Baris contoh:
1 1 2 2
- Baris ke-3, Baris - Daftar spasi terpisah dari jumlah titik yang diperlukan untuk setiap baris. Baris contoh:
3 0 3 0
- Baris 4, Ukuran papan - Bilangan bulat tunggal, ukuran papan,
B
Papan kemudian diberikan, dan B
garis input mewakili papan menggunakan notasi yang disebutkan di atas. Misalnya, input lengkap untuk contoh kasus terakhir adalah sebagai berikut:
4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
<
#
^ #
Program Anda kemudian akan menampilkan papan yang diselesaikan, dalam notasi yang sama. Output yang cocok untuk input di atas adalah sebagai berikut:
** * *
*
*
* *
* *#*
* # *
Perhatikan bahwa papan permainan dapat memiliki beberapa solusi. Dalam hal ini, cukup keluarkan satu solusi yang valid. Selain itu, program Anda harus mengeluarkan solusi yang benar dalam waktu 10 detik pada komputer desktop yang masuk akal untuk kisi 10x10 yang rumit.
Ini adalah kode golf, jadi paling tidak byte menang.
Uji Kasus
Input 1
3x2 1x4
2 2 3 1 2
4 0 3 0 3
5
#
#
*
Output 1
*** *
***#
#
* * *
Input 2
3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*
#
Keluaran 2
* * *
*
* *
* #
* *
Input 3
5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#
-
#
<
Keluaran 3
#
*****
****
#
* ** *
sumber
t no two shapes can touch horizontally, vertically or diagonally
(ini seharusnya di awal, tidak hilang hampir mendekati akhir, tapi bagaimanapun ...)Jawaban:
Python 2:
766739696663633 byteLihat berfungsi online: Ideone.com (Versi online mungkin terlalu lambat untuk kisi besar dan sulit, offline seharusnya baik-baik saja)
Input melalui stdin, cukup salin dan lewati baris dari OP (tapi hati-hati, stackexchange terkadang menghapus spasi atau garis).
Beberapa ide dasar kode ini: Menggunakan fungsi rekursif
f
.f
mencoba menempatkan satu bentuk di papan tulis. Untuk setiap lokasi yang memungkinkan ia memanggil dirinya sendiri dengan papan yang dimodifikasi. Ada 3 loop di dalamnya.o
menentukan orientasi (2 - horizontal, 3 - vertikal). Itu akan selalu menempatkan bentuk horizontal, oleh karena itu pada akhiro=2
, itu akan mengubah posisi papan dengan fungsit
.i
adalah baris danj
semuanya adalah kolom awal yang memungkinkan. Kemudian banyak pemeriksaan terjadi, jika ujung-ujungnya memiliki karakter yang valid, jika bagian tengahnya memiliki karakter yang valid dan jika sekitarnya kosong.sumber
JavaScript (ES6) 661
667 695 702 745 755 786 790 784 798Pekerjaan yang sedang berjalan, bisa dipersingkat.Mungkin terlalu lambat pada kisi yang rumit. Mungkin tidak.Edit sedikit lebih lama, jauh lebih cepat.
Edit 2 Bug fix, periksa kolom / baris. Kebetulan, sekarang lebih cepat
Fungsi M adalah yang utama. Parameter w adalah string multiline dengan semua input. Fungsi mem-parsing input dan menyiapkan papan awal. Karakter
<>^v|-*
di papan awal diganti dengan,
, masing-masing,
harus diganti dengan*
dalam solusi yang benar.Fungsi R mencoba secara rekursif untuk menempatkan semua bentuk di papan tulis. Ketika suatu bentuk ditempatkan, ia menyebut dirinya melewati daftar bentuk yang lebih pendek dan papan yang dimodifikasi. Ketika semua bentuk ditempatkan, solusi masih bisa tidak valid jika tidak ada yang
,
diganti*
.Tes fungsi P jika suatu bentuk dapat ditempatkan pada posisi dan orientasi tertentu. Ia memeriksa semua costrains (di dalam papan, tidak ada tumpang tindih, tidak ada sentuhan, jumlah baris dan kolom yang valid)
Uji di konsol FireFox / FireBug
Output (total waktu eksekusi <1sec)
sumber