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
#
*****
****
#
* ** *
t no two shapes can touch horizontally, vertically or diagonally
(ini seharusnya di awal, tidak hilang hampir mendekati akhir, tapi bagaimanapun ...)