Schreiben Sie ein Programm, um eine Datei mit einem Kreuzworträtsel zu erstellen, das der Benutzer ausdrucken und das Puzzle bearbeiten kann.
Eingang
Ein Dateiname, der eine Kreuzworträtsel-Rasterdatei darstellt, und optional ein zweiter Dateiname, der eine Kreuzworträtsel-Nummerierungsdatei darstellt. Die Eingabe sollte auf herkömmliche Weise für Ihre Programmierumgebung akzeptiert werden: Befehlszeilenargumente, Standardeingabe, Webformulare usw.
Sie können davon ausgehen, dass das Kreuzworträtsel validiert wurde und wenn Sie eine Nummerierungsdatei verwenden, die dem bereitgestellten Raster entspricht .
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.
Nummerierung des Dateiformats Zeilen, die mit '#' beginnen, werden ignoriert und können für Kommentare verwendet werden. Alle anderen Zeilen enthalten eine Lasche getrennt Triplett i
, m
, n
wobei i
eine Reihe auf dem Raster gedruckt werden soll , darstellt, und m
und n
die Zeile und Spalte des Quadrates darstellen , wo sie gedruckt werden sollen. Die Anzahl der Zeilen und Spalten beginnt bei 1.
Ausgabe
Die Ausgabe ist eine Datei, die der Benutzer ausdrucken und mit einem Kreuzworträtsel bearbeiten kann. ASCII, Postscript, PDF, PNG und jedes andere vernünftige Format werden akzeptiert, aber alle müssen diese Regeln einhalten:
- Es muss eine Regel für das gesamte Puzzle und zwischen jedem Quadratpaar geben.
- Blockierte Quadrate müssen dunkel ausgefüllt werden.
- In Spielfeldern, die den Beginn eines nummerierten (quer oder abwärts gerichteten) Hinweises darstellen, muss in der oberen linken Ecke des Quadrats eine Zahl angegeben werden, während der größte Teil des Quadrats leer bleibt, damit das Spiel darin schreiben kann. Beachten Sie das typische Raster In den Zeitungen veröffentlichte werden viele Dutzend Hinweise haben und können mehr als 100 haben.
Die Ausgabe erfolgt ausschließlich über das Raster ohne die Liste der Hinweise.
Die Ausgabe sollte an ein herkömmliches Ziel gesendet werden (eine Datei, deren Name vom Eingabedateinamen abgeleitet ist, die als Webseite erstellt wurde usw.)
Testfall
Bei einer Eingabe von
5 5
# ##
#
#
#
## #
Die Startecke einer akzeptablen ASCII-Ausgabe könnte folgendermaßen aussehen
+-----+-----+-----+---
|#####|1 |2 |###
|#####| | |###
|#####| | |###
+-----+-----+-----+---
|#####|3 | |4
|#####| | |
|#####| | |
+-----+-----+-----+---
|6 | |#####|
| | |#####|
Wer grafische Formate verwendet, sollte sich von den üblichen gedruckten Quellen inspirieren lassen.
Nummerierungsschema
Ein korrekt nummeriertes Raster hat die folgenden Eigenschaften:
- Die Nummerierung beginnt bei 1.
- Keine Spalte oder Spanne offener Quadrate ist nicht nummeriert.
- Zahlen werden in Zählreihenfolge gefunden, indem von der oberen bis zur unteren Reihe gescannt wird, wobei jede Reihe von links nach rechts genommen wird.
Beiseite
Dies ist die dritte von mehreren Kreuzworträtselherausforderungen. Ich plane, durchgehend eine konsistente Reihe von Dateiformaten zu verwenden und dabei eine seriöse Suite von Kreuzworträtsel-bezogenen Dienstprogrammen aufzubauen.
Frühere Herausforderungen in dieser Reihe:
quelle
Antworten:
Python, 379 Zeichen
quelle
next(f)
anstelle von verwendenf.readline()
. Das brauchst du da überhaupt nicht.readlines()
.Nachsatz
905 797 677 675 629 608 330 320308Dieses Programm ist als "Protokoll-Prolog" geschrieben, sodass Sie es einfach zusammen mit den Raster- und Zahlendateien (in dieser Reihenfolge, durch Leerzeilen getrennt) zusammenfassen und das gesamte Durcheinander an Ghostscript oder Distiller oder einen PS-Drucker weiterleiten. An die unten stehende Referenzversion ist ein NYT-Puzzle (ab 5. November 2011) mit Zahlen und einer Antwort angehängt, deren ich mir ziemlich sicher bin (Samstage sind schwer!).
Die neue Revision verwendet diese beiden Prozeduren, um binär codierte Systemnamen aus Zeichenfolgen auszuführen.
Eingedrückt und (etwas) kommentiert.
Datei.
Auf einem Drucker sollte es in Ordnung aussehen, aber auf dem Bildschirm braucht es ein wenig Hilfe. Diese Prozedur mit 19 Zeichen und 9 Zeichen zum Aufrufen an allen Punkten im Benutzerbereich trägt dazu bei, dass Linien mit gleichmäßigem Abstand gleichmäßiger aussehen. Also 308 + 19 + 9 = 337, verwendet, um dieses Bild zu erzeugen.
Postscript 608
Diese frühere Version (aus Revision 8 ) verwendet einen völlig anderen Ansatz und verwendet den Hauptzeilencode als "Lexikon", aus dem längere Token mithilfe von Zeichenfolgen indiziert werden können.
Es wurde mit dieser kommentierten Version geschrieben, die die Codierung des Lexikons veranschaulicht. Das erste Token
30
wird kommentiert und istspace
daher( )*
ein Synonym für30
. Nicht sehr vorteilhaft für30
, aber für längere Token ist (war) dies ein großer Gewinn (bis tiefere Codierungsmöglichkeiten entdeckt wurden (wurden)).quelle
C (Ausgabe an SVG), 553 Zeichen
Ich weiß, der Code ist riesig, aber dieses Problem verlangt nur nach einer SVG-Antwort.
Beim Ausführen werden die beiden Dateinamen in zwei separaten Zeilen der Standardeingabe angezeigt. zuerst die Rasterdatei, dann die Zahlendatei.
Die Logik in diesem ist eigentlich ganz einfach. Das Format der SVG ermöglicht es, alle Elemente in beliebiger Reihenfolge zu erstellen (anstatt wie bei der ASCII-Ausgabelösung von oben nach unten zu gehen). Die Größe ist fast ausschließlich auf SVG Boilerplate zurückzuführen.
Aber das resultierende Bild sieht gut aus!
Bearbeitet, um hinzuzufügen: Hier ist eine kürzere Version (517 Zeichen), die mit einer bestimmten Auflösung ausgegeben wird. Dadurch kann der Code mehr Standardeinstellungen verwenden, jedoch zu den (meiner Meinung nach) unerschwinglichen Kosten, die die SVG-Größe in Ihrem Webbrowser nicht mehr automatisch ändert.
quelle
Haskell, 328 Zeichen
quelle
C 375 Zeichen
Die beiden Eingabedateinamen werden bei der Standardeingabe jeweils in einer separaten Zeile eingegeben. Das Raster wird bei Standardausgabe in ASCII gerendert. Ja, es ist eine miese Benutzeroberfläche, aber alles, was besser ist, kostet Charaktere. Ich habe es so aufgerufen:
Das Programm sollte beispielsweise kommentierte Zeilen in der Nummerierungsdatei korrekt verarbeiten.
quelle
*r++-=b[i++]==35
(g
wird auf Nullen initialisiert).for(j=3*(f<r);j--;puts("|"))
spartif
.n&&j>1
->j/2*n
Scala 463, Ausgabeformat: HTML
Beispielausgabe
quelle
Nachsatz
(435)(434)Nicht mit Golf gespielt:
quelle
stopped
. ... Ich werde das Kopfgeld für einen Tag offen lassen, um Aufmerksamkeit zu erregen.Nachtrag, nicht kämpfend.
Inspiriert (noch einmal) von Ihrer verwandten Frage zu SO , habe ich eine Referenzversion in Postscript mit file-IO erstellt. Außerdem wird eine abgeleitete Schriftart mit fester Breite erstellt, sodass die Rasterdaten einfach an übergeben werden
show
.ist eine leere Box und
#
ist eine gefüllte Box. Jedes andere ASCII-Zeichen wird als kleines, malerisch-römisches Symbol gezeichnet, das von einer Box umgeben ist.Dieses Programm verwendet eine Ghostscript-Funktion, die möglicherweise nicht in allen Postscript-Interpreten vorhanden ist. Wenn Ghostscript mit dieser
--
Option aufgerufen wird , werden Befehlszeilenargumente in einem Array von Zeichenfolgen mit dem Namen / ARGUMENTS an das Postscript-Programm übergeben. Sie müssen das Programm also so aufrufengs -- xw-io.ps grid-file number-file
.quelle