Überprüfen Sie ein vorgeschlagenes Kreuzworträtsel.
Einträge sollten vollständige Programme sein, die einfach ein vorgeschlagenes Raster testen, um festzustellen, ob es eine Reihe von Bedingungen erfüllt, um Kreuzworträtsellöser glücklich zu machen.
Eingang
Die Eingabe ist der Name einer Datei, die das Kreuzworträtsel darstellt. Der Eingabedateiname kann als Argument, für die Standardeingabe oder auf andere herkömmliche Weise als durch Hardcodierung übergeben werden.
Rasterdateiformat: Die erste Zeile besteht aus zwei durch Leerzeichen getrennten Ganzzahlkonstanten M und N. Nach dieser Zeile befinden sich M Zeilen, die jeweils aus N Zeichen (plus einer neuen Zeile) bestehen [#A-Z ]
. Diese Zeichen werden so interpretiert, dass sie '#'
ein blockiertes Quadrat, ' '
ein offenes Quadrat im Puzzle ohne bekannten Inhalt und einen Buchstaben ein offenes Quadrat anzeigen, das diesen Buchstaben enthält.
Ausgabe
Das Programm sollte keine Ausgabe in gültigen Gittern erzeugen und mit normalem Beendigungszustand beenden. Wenn das vorgeschlagene Raster ausfällt, sollte das Programm eine Diagnosefehlermeldung ausgeben und mit einem abnormalen Beendigungsstatus (dh nicht 0 unter Unix) beenden, wenn dies von Ihrer Ausführungsumgebung unterstützt wird. Die Fehlermeldung sollte sowohl angeben, welche Bedingung für die Gültigkeit verletzt wurde, als auch die Position des fehlerhaften Quadrats. Es steht Ihnen frei, die Mittel zur Übermittlung dieser Fakten zu wählen.
Bedingungen für die Gültigkeit
Gültige Gitter haben keine Antworten (quer oder runter), die nur 1 Zeichen lang sind (zusätzliche Gutschrift, um die Mindestlänge zu einem Eingabeparameter zu machen) und weisen die übliche Symmetrie auf. Die übliche Symmetrie bedeutet, dass das Kreuzworträtsel danach gleich bleibt (drei äquivalente Beschreibungen derselben Operation):
- Reflexion durch das eigene Zentrum
- Reflexion sowohl vertikal als auch horizontal
- 180 Grad Drehung
Testeingabe und erwartete Ausgabe
Geht vorbei:
5 5
# ##
#
#
#
## #
Schlägt bei kurzer Antwort fehl:
5 5
## ##
#
#
#
## ##
Symmetrie scheitert:
5 5
# ##
#
#
# #
## #
Beiseite
Dies ist die zweite von mehreren Herausforderungen im Zusammenhang mit Kreuzworträtseln. Ich plane, durchgehend eine konsistente Reihe von Dateiformaten zu verwenden und dabei eine seriöse Suite von Kreuzworträtsel-bezogenen Dienstprogrammen aufzubauen. Zum Beispiel erfordert ein nachfolgendes Puzzle das Drucken einer ASCII-Version des Kreuzworträtsels basierend auf der Eingabe und Ausgabe dieses Puzzles.
Frühere Herausforderungen in dieser Reihe:
Antworten:
Ruby -
215207Ungolfed:
.
Dadurch wird im Grunde das letzte Zeichen (Zeilenumbruch) jeder Eingabezeile entfernt, indem die
chop
Methode für sie aufgerufen und ein Array der Ergebnisse zurückgegeben wird.h
nimmt das erste Element dieses Arrays und*g
nimmt den Rest. Am Ende haben wir also die erste Zeileh
und die Kreuzworträtselzeileng
.g*?#
verbindet (*
) das Arrayg
mit dem"#"
(?#
ist ein Zeichenliteral). Dies ist das gleiche wieg.*("#")
oderg.join("#")
. Dann wird jedes Nicht#
durch ein Leerzeichen ersetzt.Für die Symmetrieprüfung müssen wir nur prüfen, ob das Zeichen an jedem Index dem Zeichen am gegenüberliegenden Index in der Zeichenfolge entspricht:
In Ruby können wir Zeichenfolgen vom Ende mit negativen Indizes indizieren (beginnend mit
-1
statt0
), so dass diesg[-i-1]
das Gegenteil vong[i]
in der Zeichenfolge ist. Dies spart ein paar Zeichen:Wir können a
;
mit einer bedingten Anweisung speichern :In der Golfversion können wir noch ein paar Zeichen sparen:
In einer früheren Version habe ich die Rekursion zum Durchlaufen der Zeichenfolge verwendet:
Ein nicht gebundener Zugriff auf
g
gibt null zurück. Sobald erg[i]
zurückgegeben wirdnil
, wird die Iteration gestoppt.Ausgabeformat:
L für Längenfehler und R für Rotationsfehler (
L 1 2
bedeutet also Längenfehler in Zeile 1, Spalte 2)quelle
Referenzimplementierung
c99
quelle
C, 278 Zeichen
Wie zu erwarten, wurden die Fehlermeldungen selbst Golf gespielt. Sie haben folgende Form:
11L8
- zeigt einen Längenfehler in Zeile 11, Spalte 8 an4S10
- zeigt einen Symmetriefehler in Zeile 4, Spalte 10 anquelle
APL (115)
Wenn das Gitter nicht symmetrisch ist, wird es
Wenn das Raster kurze Antworten hat, werden die Ausgaben⍉
gefolgt von den Koordinaten ausgegeben, dh für das angegebene Beispiel∘
gefolgt von den Koordinaten ausgegeben, dh für das angegebene BeispielErläuterung:
d↑↑{'#'≠⍞}¨⍳⊃d←⎕
: Lesen Sie die erste Zeile als Liste von Zahlen und speichern Sie sied
, lesen Sie dann so viele Zeilen wie die erste Zahl und formen Sie sie als Matrix mit Größe umd
. 'Geschlossene' Quadrate werden als 0 und 'offene' Quadrate als 1 gespeichert.∨/,k←⍵≠⌽⊖⍵
: ank
Orten lagern, an denen das Gitter asymmetrisch ist. Wenn es so einen Ort gibt ...'⍉',(,k×⍳⍴k)~⊂2/0
: Geben Sie ein ⍉ gefolgt von den fehlerhaften Koordinaten aus⋄
: Andernfalls...~⊂2/0
: Entfernen Sie die Nullkoordinaten aus der folgenden Liste:¨⍵(⍉⍵)
: sowohl für das Gitter als auch für seine Transponierung ...¯1⌽¯1⊖⍵↑⍨2+k←⍴⍵
: umgeben Sie das Gitter mit Nullen (dh geschlossenen Quadraten)0 1 0⍷
: sehen, wo es ein 'offenes' Quadrat enthält, das von zwei 'geschlossenen' Quadraten umschlossen ist (= zu kurz)k↑1⌽1⊖
: Entfernen Sie den Ring der zusätzlichen Nullen erneut,⊃,/(g(⍉g←⍳⍴⍵))×
: Mit Koordinaten und transponierten Koordinaten multiplizieren und zusammenfügen, um eine Liste der störenden Koordinaten (und vieler Nullen, die wir entfernen) zu bilden.×⍴d←
: Speichern Sie die beleidigenden Koordinaten ind
, und wenn es welche gibt ...:'∘',d
: a ∘ gefolgt von den Koordinaten ausgeben.quelle