Sebuah Nonogram adalah dimensi dua teka-teki logika yang terlihat seperti ini (screenshot dari game Pixelo , permainan Nonogram favorit saya):
Tujuan permainan ini adalah untuk mengetahui gambar apa yang dikodekan oleh angka-angka tersebut. Aturannya sederhana: Angka pada kolom atau baris berarti bahwa di suatu tempat di kolom atau baris itu, bahwa banyak kotak diisi dalam satu baris. Misalnya, baris bawah pada gambar di atas harus tidak memiliki kotak diisi, sedangkan yang di atasnya harus memiliki semua kotaknya diisi. Baris ketiga dari bawah memiliki 8 kotak yang terisi, dan semuanya akan berturut-turut.
Dua atau lebih angka untuk kolom atau baris yang sama berarti ada beberapa "run" dari kotak yang diisi, dengan setidaknya satu spasi di antaranya, dengan panjangnya. Pesanan dipertahankan. Misalnya, ada tiga kotak yang diisi di kolom paling kanan dari gambar di atas, setidaknya satu ruang di bawahnya, dan kemudian satu lagi yang diisi kotak.
Inilah teka-teki yang sama, hampir selesai:
(The Xs tidak penting, mereka hanya petunjuk pemain meninggalkannya untuk mengatakan "Alun-alun ini jelas tidak diisi". Pikirkan bendera di Minesweeper. Mereka tidak memiliki arti aturan.)
Mudah-mudahan Anda dapat melihat bahwa, misalnya, kolom tengah dengan petunjuk yang mengatakan "2 2" memiliki dua run 2-panjang dari kotak yang diisi.
Misi Anda, jika Anda memilih untuk menerimanya, adalah menulis program atau fungsi yang akan membuat teka-teki seperti ini. Anda diberi ukuran papan sebagai bilangan bulat tunggal (5 <= n <= 50) pada stdin atau sebagai argumen (tidak ada alasan mengapa teka-teki nonogram harus persegi, tetapi untuk tantangan ini akan menjadi). Setelah itu, Anda akan diberi serangkaian 1s dan 0s yang mewakili kotak diisi dan tidak terisi dalam gambar, masing-masing. N pertama dari mereka adalah baris atas, kemudian baris berikutnya, dll. Anda akan kembali atau mencetak ke stdout papan 2 * 1 sel (karena mereka terlihat lebih baik, dan itu memberi Anda ruang untuk petunjuk 2 digit untuk kolom ), semuanya kosong, dengan petunjuk yang sesuai dengan data input.
Format output
Mencicipi
Memasukkan:
./nonogram <<< '5 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0'
OR
n(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
Gambar:
Keluaran:
1
2 1 2
3 2 1 2 3
+----------
3|
2 2|
1 1 1|
2 2|
3|
Memasukkan:
./nonogram <<< '15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1'
Gambar:
Keluaran:
1 1
1 1 3 3 5 5 3 3 1
7 2 3 2 4 2 3 210 2 3 0 4 215
+------------------------------
2|
1|
1|
1|
1|
1 1|
3 3 1 1|
1 5 1 1|
3 5 3|
1 5 1|
1 3 1|
1 1 1 1 1|
1 1 1 1 1 1 1 1|
11 3|
11 3|
Klarifikasi
- Output Anda tidak perlu menjadi teka-teki yang dapat dipecahkan. Tidak semua nonogram dapat dipecahkan, tetapi itu bukan urusan Anda. Keluarkan petunjuk yang sesuai dengan input, apakah itu membuat puzzle yang baik atau tidak.
- Program yang mengambil argumen pada baris perintah diizinkan. Ini adalah jenis yang disebutkan di atas, tetapi mungkin untuk mendapatkan ide yang salah. Untuk itulah klarifikasi.
- Mencetak
0
untuk baris atau kolom yang tidak memiliki kotak diisi adalah wajib. Saya tidak mengatakan ini dengan kata-kata di mana pun tetapi dalam data sampel.
5<=n<=50
adalah specnya, jadi tidak mungkin ada angka 3 digit-
dari yang seharusnya?Jawaban:
GolfScript, 128 karakter
Masukan harus diberikan pada STDIN sebagai angka yang dipisahkan spasi.
Anda dapat menguji contohnya di sini .
Kode yang dikomentari:
sumber
~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n](
(untuk beberapa alasan lettercount.com mengatakan 125 karakter jika Anda menyalinnya, tapi saya yakinkan Anda, ini 123 karakter). Beberapa bagian dari algoritma telah diubah, tetapi mayoritas masih tetap sama. Saya juga mengubah beberapa nama variabel (memiliki 9 sebagai variabel pintar, tetapi membingungkan juga), tetapi Anda dapat mengubahnya kembali jika Anda mau.Ruby, 216
255Meskipun ini tidak menghasilkan output sampel yang tepat yang diberikan dalam pertanyaan, itu memang mengikuti spesifikasi. Satu-satunya perbedaan dengan contoh adalah bahwa saya mencetak beberapa spasi / baris baru.
Contoh:
Changelog:
chunk
kemap
.[nil]
alih-alih meneleponArray#compact
.sumber
length(leading spaces + numbers to the left) == 2*n
danheight(leading newlines + numbers at the top) == n
... selama monitor Anda cukup besar untuk3*n+1 × 2*n+2
karakter, Anda tidak harus mendiskualifikasi saya. :)Ruby, 434
sumber
ruby $yourprogram <<< $input
tetapi berhasilruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError)
.ruby nonogram.rb 2 1 0 0 1
untuk 2x20
untuk kolom keempat terakhir pada contoh kedua.+------
... garis diindentasi oleh satu terlalu banyak ruang juga.GolfScript
149147Kode
Suntingan:
puts
untuk menyimpan satu char lagiDemo online
Versi kode yang agak beranotasi
sumber
Javascript (E6) 314
334 357 410Tidak disatukan
Pemakaian
N(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
N(15,[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1])
Edit riwayat
1 Dihapus regexp digunakan untuk menemukan kolom. Lebih dari
2 Simpler lebih baik. Output ke string, bukan ke array. Fungsi pembantu yang dihapus FILL (F)
3 Lebih sederhana. Saya tidak bisa berbuat lebih baik dari ini. Masih tidak bisa dibandingkan dengan Golfscript :(
sumber
R, 384 karakter
Dengan lekukan dan beberapa penjelasan:
Pemakaian:
sumber
C - 511
C jelas tidak dibuat untuk memformat output dengan baik. Hitungan karakter hanya mencakup spasi yang diperlukan / baris baru.
Input dari STDIN, angka dipisahkan oleh spasi.
sumber
Sudah beberapa hari dan tidak ada yang menjawab dengan python, jadi inilah upaya saya (mungkin sangat buruk):
Python 2.7 -
404397380 byteSaya akan segera memposting versi yang tidak diklik, tetapi saat ini saya pikir itu cukup mudah dibaca. :)SUNTING : Sambil menulis versi yang tidak di-serigala, saya perhatikan beberapa peningkatan yang bisa saya lakukan sehingga cukup signifikan! Untuk beberapa alasan yang saya tidak bisa jelaskan, sekarang memiliki baris baru tambahan di bagian atas dan spasi di sebelah kiri (meskipun saya tidak berpikir saya mengubah sesuatu yang fungsional), tetapi masih memenuhi spesifikasi.
Versi tidak serigala akan datang!Tidak Disatukan:
Beberapa perubahan dibuat demi keterbacaan (
g
dibagi menjadi tiga fungsi bernama, pemahaman daftar kompleks dibuat menjadifor
loop) tetapi secara logis itu bekerja dengan cara yang persis sama.Itulah mengapa membingungkan bahwa yang ini tidak mencetak spasi tambahan dan baris baru, sedangkan yang golf melakukannya. ¯ \ _ (ツ) _ / ¯
sumber