Validasi kisi teka-teki silang yang diusulkan.
Entri harus berupa program lengkap yang hanya menguji kisi yang diusulkan untuk menentukan apakah memenuhi serangkaian persyaratan untuk membuat pemecah teka-teki silang bahagia.
Memasukkan
Input akan menjadi nama file yang mewakili kisi teka-teki silang. Nama file input dapat diberikan sebagai argumen, pada input standar, atau dengan cara konvensional lain selain hardcoding.
Format file kisi: Baris pertama terdiri dari dua konstanta integer yang dipisahkan spasi-putih M dan N. Berikut adalah garis M yang masing-masing terdiri dari N karakter (ditambah baris baru) dipilih [#A-Z ]
. Karakter-karakter ini diinterpretasikan sedemikian rupa sehingga '#'
mengindikasikan kotak yang diblokir, ' '
kotak terbuka dalam teka-teki tanpa isi yang diketahui dan huruf apa pun berupa kotak terbuka yang berisi huruf itu.
Keluaran
Program seharusnya tidak menghasilkan output pada kisi yang valid dan keluar dengan keadaan terminasi normal. Jika kisi yang diusulkan gagal, program harus menghasilkan pesan kesalahan diagnostik dan keluar dengan keadaan terminasi abnormal (yaitu bukan 0 pada unix) jika ini didukung oleh lingkungan eksekusi Anda. Pesan kesalahan harus menunjukkan kondisi mana untuk validitas dilanggar dan lokasi alun-alun yang menyinggung; Anda bebas memilih cara menyampaikan fakta-fakta ini.
Ketentuan untuk validitas
Kisi yang valid tidak akan memiliki jawaban (melintasi atau turun) yang panjangnya hanya 1 karakter (kredit tambahan untuk membuat panjang minimum sebagai parameter input), dan akan menunjukkan simetri yang biasa. Simetri yang biasa berarti teka-teki silang tetap sama setelah (tiga deskripsi setara dari operasi yang sama):
- refleksi melalui pusat itu sendiri
- refleksi baik secara vertikal maupun horizontal
- Rotasi 180 derajat
Uji input dan output yang diharapkan
Passes:
5 5
# ##
#
#
#
## #
Gagal pada jawaban singkat:
5 5
## ##
#
#
#
## ##
Gagal pada simetri:
5 5
# ##
#
#
# #
## #
Ke samping
Ini adalah tantangan kedua terkait beberapa teka-teki silang. Saya berencana untuk menggunakan serangkaian file-format yang konsisten di seluruh dan untuk membangun seperangkat utilitas terkait silang yang terhormat dalam prosesnya. Misalnya teka-teki selanjutnya akan meminta untuk mencetak versi ASCII dari teka-teki silang berdasarkan input dan output dari teka-teki ini.
Tantangan sebelumnya dalam seri ini:
Jawaban:
Ruby -
215207Tidak Disatukan:
.
Ini pada dasarnya menghapus char (line break) terakhir dari setiap baris input dengan memanggil
chop
metode pada mereka, dan mengembalikan array hasil.h
mengambil elemen pertama dari array ini dan*g
mengambil sisanya. Jadi kita berakhir dengan baris pertamah
dan garis kotak silang masukg
.g*?#
bergabung (*
) arrayg
dengan"#"
(?#
adalah karakter literal). Ini sama dengang.*("#")
, ataug.join("#")
. Maka setiap non#
diganti dengan spasi.Untuk pemeriksaan simetri kita hanya perlu memeriksa apakah char di setiap indeks sama dengan char di indeks yang berlawanan dalam string:
Di Ruby kita bisa mengindeks string dari ujung menggunakan indeks negatif (mulai dari
-1
bukan0
), jadi itug[-i-1]
kebalikan darig[i]
dalam string. Ini menghemat beberapa karakter:Kami dapat menyimpan
;
dengan menggunakan pernyataan kondisional:Dalam versi golf kita dapat menyimpan beberapa karakter lagi:
Dalam versi sebelumnya saya menggunakan rekursi untuk iterasi pada string:
Akses tidak terikat ke
g
pengembalian nihil, jadi setelahg[i]
kembalinil
, ini menghentikan iterasi.Format output:
L untuk kesalahan panjang, dan R untuk kesalahan rotasi (jadi
L 1 2
berarti kesalahan panjang pada baris 1, kolom 2)sumber
Implementasi referensi
c99
sumber
C, 278 karakter
Seperti yang mungkin Anda harapkan, pesan kesalahannya sendiri telah di-golf. Mereka mengambil bentuk berikut:
11L8
- menunjukkan kesalahan panjang pada baris 11 kolom 84S10
- menunjukkan kesalahan simetri pada baris 4 kolom 10sumber
APL (115)
Jika grid tidak simetris, itu output
Jika kisi-kisi memiliki jawaban pendek, hasilnya⍉
diikuti oleh koordinat, yaitu untuk contoh yang diberikannya∘
diikuti oleh koordinat, yaitu untuk contoh yang diberikannyaPenjelasan:
d↑↑{'#'≠⍞}¨⍳⊃d←⎕
: baca baris pertama sebagai daftar angka dan simpand
, kemudian baca baris sebanyak angka pertama, dan bentuk ulang sebagai matriks ukurand
. Kotak 'Tertutup' disimpan sebagai 0 dan kotak 'terbuka' sebagai 1.∨/,k←⍵≠⌽⊖⍵
: simpan dik
tempat-tempat di mana grid tidak simetris. Jika ada tempat seperti itu ...'⍉',(,k×⍳⍴k)~⊂2/0
: output a ⍉ diikuti oleh koordinat yang menyinggung⋄
: jika tidak...~⊂2/0
: hapus koordinat nol dari daftar berikut:¨⍵(⍉⍵)
: untuk grid dan transposnya ...¯1⌽¯1⊖⍵↑⍨2+k←⍴⍵
: mengelilingi grid dengan nol (yaitu kotak tertutup)0 1 0⍷
: lihat di mana itu berisi kotak 'terbuka' yang dikelilingi oleh dua kotak 'tertutup' (= terlalu pendek)k↑1⌽1⊖
: lepaskan cincin nol tambahan lagi,⊃,/(g(⍉g←⍳⍴⍵))×
: kalikan dengan koordinat dan koordinat yang dialihkan, dan gabung bersama, untuk membentuk daftar koordinat yang menyinggung (dan banyak nol yang kita hapus).×⍴d←
: simpan koordinat yang menyinggung did
, dan jika ada ...:'∘',d
: output a ∘ diikuti oleh koordinat.sumber