Betrachten Sie das folgende Standard-15 × 15- Kreuzworträtselraster .
Wir können dies in der ASCII-Kunst darstellen, indem wir #
für Blöcke und (Leerzeichen) für weiße Quadrate verwenden.
# #
# #
#
# #
### ## ##
## #
# #
# ##
## ## ###
# #
#
# #
# #
Bestimmen Sie anhand eines Kreuzworträtsels im obigen ASCII-Grafikformat, wie viele Wörter es enthält. (Das obige Raster enthält 78 Wörter. Es ist zufällig das New York Times- Puzzle vom letzten Montag .)
Ein Wort ist eine Gruppe von zwei oder mehr aufeinanderfolgenden Leerzeichen, die vertikal oder horizontal verlaufen. Ein Wort beginnt und endet entweder mit einem Block oder der Kante des Gitters und verläuft immer von oben nach unten oder von links nach rechts, niemals diagonal oder rückwärts. Beachten Sie, dass Wörter die gesamte Breite des Puzzles umfassen können, wie in der sechsten Zeile des Puzzles oben. Ein Wort muss nicht mit einem anderen Wort verbunden sein.
Einzelheiten
- Die Eingabe ist immer ein Rechteck mit den Zeichen
#
oder(Leerzeichen), wobei die Zeilen durch eine neue Zeile (
\n
) getrennt sind. Sie können davon ausgehen, dass das Raster aus 2 verschiedenen druckbaren ASCII- Zeichen anstelle von#
und besteht.
- Sie können davon ausgehen, dass es eine optionale nachfolgende Newline gibt. Nachgestellte Leerzeichen zählen, da sie die Anzahl der Wörter beeinflussen.
- Das Gitter ist nicht immer symmetrisch und es können alle Leerzeichen oder alle Blöcke sein.
- Ihr Programm sollte theoretisch in der Lage sein, an einem Raster beliebiger Größe zu arbeiten, aber für diese Herausforderung wird es niemals größer als 21 × 21 sein.
- Sie können das Raster selbst als Eingabe oder den Namen einer Datei verwenden, die das Raster enthält.
- Nehmen Sie Eingaben von stdin oder Befehlszeilenargumenten und geben Sie sie an stdout aus.
- Wenn Sie möchten, können Sie anstelle eines Programms eine benannte Funktion verwenden, das Raster als Zeichenfolgenargument verwenden und eine Ganzzahl oder Zeichenfolge über stdout oder Funktionsrückgabe ausgeben.
Testfälle
Eingang:
# # #
Ausgabe:
7
(Vor jedem stehen vier Leerzeichen#
. Das Ergebnis wäre dasselbe, wenn jedes Zahlenzeichen entfernt würde, aber Markdown entfernt Leerzeichen von ansonsten leeren Zeilen.)Eingang:
## # ##
Ausgabe:
0
(Ein-Buchstaben-Wörter zählen nicht.)Eingang:
###### # # #### # ## # # ## # #### #
Ausgabe:
4
Eingabe: (Sonntag, 10. Mai, Rätsel der NY Times )
# ## # # # # # # # ### ## # # ## # # # ## # ## # ## # # ### ## # ## ## # ## ### # # ## # ## # ## # # # ## # # ## ### # # # # # # # ## #
Ausgabe:
140
Wertung
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist der älteste Beitrag.
py -3 slip.py regex.txt input.txt
undpy -3 slip.py regex.txt input.txt no
, das sind drei Bytes (einschließlich des Leerzeichens vorn
)Haskell, 81 Bytes
Verwendet Leerzeichen
als Blockzeichen und jedes andere Zeichen (kein Leerzeichen) als leere Zelle.
So funktioniert es: Teilen Sie die Eingabe in eine Liste von Wörtern an Leerzeichen auf. Nehmen Sie
1
für jedes Wort ein mit mindestens 2 Zeichen und addieren Sie diese1
s. Wenden Sie das gleiche Verfahren auf die Transposition (Split at\n
) des Eingangs an. Fügen Sie beide Ergebnisse hinzu.quelle
JavaScript ( ES6 ) 87
121 147Erstellen Sie die Transposition der Eingabezeichenfolge, hängen Sie sie an die Eingabe an und zählen Sie dann die Zeichenfolgen mit 2 oder mehr Leerzeichen.
Führen Sie das Snippet in Firefox aus, um es zu testen.
Credits @IsmaelMiguel, eine Lösung für ES5 (122 Bytes):
quelle
F=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}
? Es ist 113 Bytes lang. Ihr regulärer Ausdruck wurde durch/ +/
(2 Leerzeichen) ersetzt. Derj=0
wurde in der übergeordnetenfor
Schleife hinzugefügt. Statt die Syntax zu verwendenobj.length
, habe ich die Verwendung geändertL='length'; ... obj[L]
, die dreimal wiederholt wird.F=z=>
musste ich es verwendenvar F=(z,i,L,j,r)=>
). Ich habe es auf IE11 getestet und es funktioniert!/\n/
eine Vorlagenzeichenfolge mit einer echten neuen Zeile dazwischen ersetzen. Das spart 1 Byte, da Sie die Escape-Sequenz nicht schreiben müssen.Pyth,
151413 BytesIch verwende
als Trennzeichen und
#
als Füllzeichen anstelle ihrer entgegengesetzten Bedeutung aus dem OP. Probieren Sie es online aus: DemonstrationAnstelle eines
#
Füllzeichens werden auch Buchstaben akzeptiert. Sie könnten also tatsächlich das gelöste Kreuzworträtsel lösen und die Anzahl der Wörter drucken. Wenn Sie denl
Befehl entfernen , werden sogar alle Wörter gedruckt. Testen Sie es hier: Das Sunday NY Times-Puzzle vom 10. MaiErläuterung
quelle