Ein Nonogramm ist ein zweidimensionales Logik-Puzzle, das ungefähr so aussieht (Screenshots aus dem Spiel Pixelo , meinem Lieblings-Nonogramm-Spiel):
Das Ziel des Spiels ist es herauszufinden, welches Bild diese Zahlen codieren. Die Regeln sind einfach: Eine Zahl in einer Spalte oder Zeile bedeutet, dass irgendwo in dieser Spalte oder Zeile viele Felder in einer Zeile ausgefüllt sind. Beispielsweise darf in der unteren Zeile des obigen Bildes kein Kästchen ausgefüllt sein, während in der oberen Zeile alle Kästchen ausgefüllt sein müssen. Die dritte Reihe von unten hat 8 gefüllte Kisten, und sie werden alle in einer Reihe sein.
Zwei oder mehr Zahlen für dieselbe Spalte oder Zeile bedeuten, dass mehrere "Durchläufe" von gefüllten Feldern mit mindestens einem Leerzeichen dazwischen mit diesen Längen vorhanden sind. Die Reihenfolge bleibt erhalten. Beispielsweise befinden sich drei ausgefüllte Kästchen in der rechten Spalte des obigen Bildes, mindestens ein Leerzeichen darunter, und ein weiteres ausgefülltes Kästchen.
Hier ist dasselbe Puzzle, fast fertig:
(Die Xs sind nicht wichtig, sie sind nur ein Hinweis, den der Spieler für sich selbst hinterlässt, um zu sagen, "Dieses Feld ist definitiv nicht ausgefüllt". Denken Sie an Flags in Minesweeper. Sie haben keine Regelbedeutung.)
Hoffentlich können Sie sehen, dass beispielsweise die mittleren Spalten mit Hinweisen, die "2 2" sagen, zwei Reihen von ausgefüllten Feldern mit zwei Längen aufweisen.
Ihre Mission ist es, ein Programm oder eine Funktion zu schreiben, mit der Sie ein solches Puzzle erstellen können. Sie erhalten die Größe der Tafel als einzelne Ganzzahl (5 <= n <= 50) auf stdin oder als Argument (es gibt keinen Grund, warum ein Nonogramm-Puzzle quadratisch sein muss, aber für diese Herausforderung wird es sein). Danach erhalten Sie eine Reihe von Einsen und Nullen, die jeweils gefüllte und ungefüllte Quadrate im Bild darstellen. Die ersten n von ihnen sind die oberste Reihe, dann die nächste Reihe usw. Sie kehren zurück oder drucken auf eine Tafel mit 2 * 1-Zellen (weil sie besser aussehen und Sie Platz für zweistellige Hinweise für eine Spalte haben) ), alle leer, mit Hinweisen, die den Eingabedaten entsprechen.
Ausgabeformat
Probe
Eingang:
./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])
Bild:
Ausgabe:
1
2 1 2
3 2 1 2 3
+----------
3|
2 2|
1 1 1|
2 2|
3|
Eingang:
./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'
Bild:
Ausgabe:
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|
Klarstellungen
- Ihre Ausgabe muss kein lösbares Rätsel sein. Nicht alle Nonogramme sind lösbar, aber das geht Sie nichts an. Gib einfach die Hinweise aus, die der Eingabe entsprechen, ob sie ein gutes Puzzle ergeben oder nicht.
- Ein Programm, das Argumente in der Befehlszeile akzeptiert, ist zulässig. Dies ist eine Art oben angegeben, aber es ist möglich, die falsche Idee zu bekommen. Dafür gibt es Klarstellungen.
- Das Drucken von a
0
für eine Zeile oder Spalte, in der keine Felder ausgefüllt sind, ist obligatorisch. Ich sage das nirgendwo mit Worten, aber es ist in den Beispieldaten.
5<=n<=50
ist die Spezifikation, daher kann es keine 3-stelligen Zahlen geben-
als sie sollte?Antworten:
GolfScript, 128 Zeichen
Die Eingabe muss in STDIN als durch Leerzeichen getrennte Zahl erfolgen.
Sie können das Beispiel testen hier .
Kommentierter Code:
quelle
~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n](
golfen : (aus irgendeinem Grund sagt lettercount.com 125 Zeichen, wenn Sie es kopieren, aber ich versichere Ihnen, es sind 123 Zeichen). Einige Teile des Algorithmus wurden geändert, aber die Mehrheit bleibt gleich. Ich habe auch einige Variablennamen geändert (9 als Variable ist klug, aber auch verwirrend), aber Sie können sie zurücksetzen, wenn Sie möchten.Rubin, 216
255Dies führt zwar nicht zu der in der Frage angegebenen exakten Beispielausgabe, entspricht jedoch den Spezifikationen. Der einzige Unterschied zu den Beispielen besteht darin, dass ich ein paar führende Leerzeichen / Zeilenumbrüche drucke.
Beispiel:
Änderungsprotokoll:
chunk
nach verschoben wurdemap
.[nil]
statt aufrufenArray#compact
.quelle
length(leading spaces + numbers to the left) == 2*n
undheight(leading newlines + numbers at the top) == n
... Solange Ihr Monitor groß genug für3*n+1 × 2*n+2
Zeichen ist, sollten Sie mich nicht disqualifizieren müssen. :)Ruby, 434
quelle
ruby $yourprogram <<< $input
aber bekamruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError)
.ruby nonogram.rb 2 1 0 0 1
für eine 2x20
im zweiten Beispiel wird die viertletzte Spalte nicht gedruckt .+------
... -Zeile auch von einem zu vielen Leerzeichen eingerückt wird.GolfScript
149147Der Code
Bearbeitungen:
puts
, um ein weiteres Zeichen zu speichernOnline-Demos
Eine etwas kommentierte Version des Codes
quelle
Javascript (E6) 314
334 357 410Ungolfed
Verwendung
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])
Verlauf bearbeiten
1 Regexp entfernt, um Spalten zu finden. Overkill
2 Einfacher ist besser. Ausgabe in eine Zeichenfolge, nicht in ein Array. Hilfefunktion FÜLLEN (F) entfernt
3 Noch einfacher. Ich kann es nicht besser machen. Kann immer noch nicht mit Golfscript vergleichen :(
quelle
R 384 Zeichen
Mit Einrückungen und Erläuterungen:
Verwendung:
quelle
C - 511
C war definitiv nicht dafür gemacht, die Ausgabe gut zu formatieren. Die Zeichenanzahl enthält nur die erforderlichen Leerzeichen / neuen Zeilen.
Die Eingabe erfolgt von STDIN, Zahlen durch Leerzeichen getrennt.
quelle
Es ist ein paar Tage her und niemand hat in Python geantwortet, also hier ist mein (wahrscheinlich ziemlich schlechter) Versuch:
Python 2.7 -
404397380 BytesIch werde bald eine ungolfed Version posten, aber im Moment denke ich, dass sie ziemlich lesbar ist. :)BEARBEITEN: Während die ungolfed Version zu schreiben, habe ich einige Verbesserungen bemerkte ich könnte das ziemlich bedeutend sein machen aufaddiert! Aus irgendeinem Grund, den ich nicht erklären kann, hat es jetzt zusätzliche Zeilenumbrüche oben und Leerzeichen links (obwohl ich glaube, dass ich nichts an der Funktionalität geändert habe), aber es entspricht immer noch den Spezifikationen.
Ungolfed-Version kommt!Ungolfed:
Aus Gründen der Lesbarkeit wurden einige Änderungen vorgenommen (
g
Aufteilung in drei benannte Funktionen, komplexes Listenverständnis infor
Schleifen), aber logischerweise funktioniert es genauso.Aus diesem Grund ist es verwirrend, dass hier keine zusätzlichen Leerzeichen und Zeilenumbrüche gedruckt werden, während dies beim Golfspieler der Fall ist. ¯ \ _ (ツ) _ / ¯
quelle