Ein Haiku ist ein Gedicht mit drei Zeilen und einer Silbenzahl von 5/7/5 .
Ein haiku-w ist Dichtung mit drei Zeilen, mit einer 5/7/5 Wortzählung, respectively.
Herausforderung
Schreiben Sie ein Programm, das true zurückgibt, wenn die Eingabe ein Haiku-w ist, und false, wenn nicht.
Eine gültige Haiku-w-Eingabe muss aus 3 Zeilen bestehen, die durch eine neue Zeile getrennt sind.
- Zeile 1 muss aus 5 Wörtern bestehen, wobei jedes Wort durch ein Leerzeichen getrennt sein muss.
- Zeile 2 muss aus 7 Wörtern bestehen, wobei jedes Wort durch ein Leerzeichen getrennt sein muss.
- Zeile 3 muss aus 5 Wörtern bestehen, wobei jedes Wort durch ein Leerzeichen getrennt sein muss.
Beispiele
The man in the suit
is the same man from the store.
He is a cool guy.
Ergebnis: Richtig
Whitecaps on the bay:
A broken signboard banging
In the April wind.
Ergebnis: Falsch
Regeln
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
- Es gelten Standard-Code-Golf-Regelungslücken. Schummeln ist verboten.
- Andere boolesche Rückgabewerte wie
1
und0
sind akzeptabel. - Eine Liste mit Zeichenfolgen der Länge 3 als Eingabe ist ebenfalls zulässig.
- Gültige Haiku-w-Eingaben sollten keine führenden oder nachfolgenden Leerzeichen oder mehrere Leerzeichen zwischen Wörtern enthalten.
code-golf
decision-problem
DomTheDeveloper
quelle
quelle
Antworten:
JavaScript (ES6),
73726463544239 ByteVielen Dank an Neil für das Speichern von 13 Bytes
Erläuterung
Dies ist eine Fettpfeil-Funktion, die ein Array von Zeichenfolgen als Argument verwendet. Es ersetzt jede Zeile durch ihre Wortzahl. Wenn es ein Haiku-w ist,
a
enthält es jetzt wieder eine Reihe von fünf, sieben und fünf. Da wir mit JavaScript nicht zwei Arrays gleichzeitig vergleichen können, wird das Array zuerst in einen String konvertiert und dann verglichen. Dies führt zu einem Booleschen Wert, der zurückgegeben wird.quelle
%
und*
haben die gleiche Priorität, so dass Sie die()
s nicht benötigen , obwohl ich denke,(d*2|5)
könnte auch funktionieren. Sie können auch mit einer Single davonkommen&
, obwohl ich denke, Sie können sogar das verbessern, indem Sie verwenden(b...).length==3>b.some(...length-...)
.a=>a.map(c=>c.split
.length)=='5,7,5'
.+''
- immer noch nicht,==
wenn das andere Argument eine Zeichenfolge ist.AWK (GNU Awk),
24,30,2820 BytesGolf gespielt
Gibt "517253" für True und eine leere Zeichenfolge für False aus .
Das GNU Awk Benutzerhandbuch
Wie es funktioniert
Jede awk-Anweisung (Regel) besteht aus einem Muster (oder Ausdruck) mit einer zugehörigen Aktion:
Awk liest die Eingabe Zeile für Zeile (Datensatz für Datensatz) und wertet den Musterausdruck aus, um festzustellen, ob eine entsprechende Aktion aufgerufen werden soll.
Der obige Code ist ein eigenständiger Awk-Ausdruck (Muster) ohne den Aktionsblock, der
{print $0}
in diesem Fall impliziert wird.Es sollte von rechts nach links gelesen werden:
q=q NF NR
Anfügen einer N umber von F ields (Wörter) und N umber von R ecords (dh die aktuelle Zeilennummer) auf die Variable q .
Auf diese Weise wird bei der Verarbeitung eines richtigen Haiku-w q festgelegt auf:
$0=q
Ordnen Sie den neu berechneten Wert von q zu $ 0 (die die gesamte aktuelle Zeile / Aufzeichnung standardmäßig hält).
517253==$0
Vergleichen Sie es mit einer "Signatur" für ein richtiges Haiku-w (517253). Wenn eine Übereinstimmung vorliegt, wird der gesamte Ausdruck mit "true" ausgewertet und eine entsprechende Aktion (implizit
print $0
) ausgeführt, wobei "517253" an stdout (True) gesendet wird. Andernfalls ist die Ausgabe leer (False).Beachten Sie, dass dies ein Haiku-w richtig erkennt, auch wenn es von einer beliebigen Anzahl von Mülleimern gefolgt wird, aber ich halte das für in Ordnung, als:
(dh wir können davon ausgehen, dass die Eingabe 3 Zeilen lang ist)
Prüfung
Probieren Sie es online!
quelle
Python , 42 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Liste von Zeilen entgegen, wobei die Wörter durch einzelne Leerzeichen getrennt sind.
Da garantiert keine führenden oder nachfolgenden Leerzeichen vorhanden sind und nur einzelne Leerzeichen jedes Wort trennen, können wir ein W-Haiku überprüfen, indem wir einfach die Leerzeichen in jeder Zeile zählen.
Wir tun dies in einem Listenverständnis, um eine Liste der Raumzählungen zu erstellen. Wenn es ein korrektes Haiku ist, sollte es so aussehen
[4, 6, 4]
, also vergleichen wir es damit und geben das Ergebnis zurück.quelle
map(str.count,l,' ')
.Gelee ,
109 BytesProbieren Sie es online!
Erläuterung
quelle
ċ€⁶⁼4,6,4
undċ€⁶⁼464D¤
... ich kann nichts kürzeres finden. (Oh, man kann es drehen, auch:464D⁼ċ€⁶$
)ċ€⁶Ḍ=464
Funktioniert gut für 8.Batch, 102 Bytes
Beendet mit einer Fehlerstufe ungleich Null, sobald eine Zeile mit der falschen Anzahl von Wörtern gelesen wird.
quelle
Mathematica, 21 Bytes
Unbenannte Funktion, die eine Liste von Zeichenlisten als Eingabe und Rückgabe verwendet
True
oderFalse
. Zählt einfach, wie viele Leerzeichen sich in jeder Liste von Zeichen befinden, die nach den Regeln der Herausforderung perfekt mit der Anzahl der Wörter in jeder Zeile korrelieren.Vorherige Einreichung:
Mathematica, 31 Bytes
Unbenannte Funktion, die eine Liste von Zeichenfolgen als Eingabe verwendet und
True
oder zurückgibtFalse
.quelle
Haskell,
3433 BytesProbieren Sie es online! .
Edit: Danke an @xnor für ein Byte!
quelle
f l=[sum[1|' '<-c]|c<-l]==[4,6,4]
.Retina , 12 Bytes
(Nach der ersten Zeile steht ein Leerzeichen)
Probieren Sie es online!
M%`
- Zählen Sie die Anzahl der Leerzeichen in jeder Zeile.M
- Übereinstimmungsmodus - Gibt die Anzahl der Übereinstimmungen aus.%
- für jede Zeile`
- Separate Konfiguration und Regex-Muster^4¶6¶4$
- Es sollten 4, 6 und 4 Leerzeichen und genau drei Zeilen vorhanden sein.¶
passt zu Zeilenumbrüchen. Der Rest ist ein einfacher regulärer Ausdruck.Druckt
1
für eine gültige Eingabe,0
für eine ungültige.quelle
Python,
5844 Bytes-14 von tbodt
quelle
split("\n")
.lambda h:[len(l.split())for l in h]==[5,7,5]
Perl , 26 Bytes
24 Byte Code + 2 Byte für
-ap
Flags.Probieren Sie es online!
quelle
Pyth, 9 Bytes
Ein Programm, das eine Liste von Einträgen aufnimmt
"quoted strings"
und drucktTrue
oderFalse
nach Bedarf.Testsuite
Wie es funktioniert
quelle
Japt , 11 Bytes
Dank @ETHproductions wurden viele Bytes gespeichert
Hierfür wird ein Array mit drei Zeichenfolgen als Eingabe verwendet.
Lass es online laufen!
quelle
PowerShell , 43 Byte
Probieren Sie es online!
Erläuterung
Übernimmt die Eingabe als durch Zeilenumbrüche getrennte Zeichenfolge.
Entfernt alle Nicht-Leerzeichen und prüft dann mithilfe eines regulären Ausdrucks, ob sie genau mit "4 Leerzeichen, Zeilenumbruch, 6 Leerzeichen, Zeilenumbruch, 4 Leerzeichen Zeilenumbruch" übereinstimmen.
Die Erfassungsgruppe entspricht 4 Leerzeichen, der Rückverweis
\1
bezieht sich darauf. Zeilenumbrüche werden in die Zeichenfolge eingebettet. Beachten Sie, dass die zweite Zeile des regulären Ausdrucks zwei Leerzeichen nach dem Rückverweis enthält.quelle
Pyke,
119 BytesProbieren Sie es hier aus!
Nach dem
u
Byte stehen folgende Bytes:0x03 0x04 0x06 0x04
quelle
J, 12 Bytes
Die Eingabe ist eine Box-Liste von Zeichenfolgen.
Erläuterung
Dies ist eine Gabel mit einem konstanten linken Zinken. Dies prüft das Ergebnis der richtigen Zeit
#@;:@>
auf Gleichheit mit4 6 4
. Die richtige Zeit setzt jedes (>
) außer Kraft , dann@
konvertiert ( ) jede Zeichenkette in Wörter (;:
), dann nimmt (@
) die Länge von jedem (#
) an.quelle
R, 48 Bytes
Liest einen Vektor mit 3 Zeichen aus stdin und zählt die Anzahl der Leerzeichen. Um die Anzahl der Leerzeichen zu zählen, verwenden wir die
str_count
aus demstringr
Paket, die Vorkommen basierend auf einem regulären Ausdrucksmuster zählen können.Ein alternativer Ansatz ohne Verwendung von Paketen könnte sein:
quelle
el
, danke dafür.C 142 Bytes
Ungolfed-Version:
Gibt 1 für die 5/7/5 Sequenz zurück, sonst 0.
Ein positiver Testfall:
quelle
C ++, 357 Bytes
Ein bisschen neu im Code Golf, aber das ist das Beste, was ich schnell tun kann
quelle
Ruby 1.9.3
Nicht golfen, sondern selbst ein Haiku-w
oder...
Funktioniert leider nicht mit führenden Whitespaces in irgendwelchen Zeilen, kommt aber mit Trailing zurecht.
quelle
Python 2 ,
5764 BytesEdit Korrigiert mit der Hinzufügung von 7 Bytes nach Rückmeldung von @Dada. Vielen Dank!
Probieren Sie es online!
Bei weitem nicht die kürzeste Antwort von Python, sondern ich wollte nur den neuen Trick verwenden, den ich kürzlich gelernt habe
input()
, um die Ausgabe anzuzeigen und eineprint
Anweisung zu speichern . Nimmt eine Liste von Zeilen als Eingabe. Erfordert Strg + C (oder einen anderen Tastendruck), um das Programm (mit einer Ausnahme) in einem Terminal zu beenden, funktioniert jedoch ohne TIO.quelle
MATL, 16 Bytes
Die Eingabe ist ein Zellenarray von Zeichenfolgen und gibt ein wahrheitsgemäßes oder falsches Array zurück .
Probieren Sie es online
Erläuterung
quelle
MATLAB / Octave, 38 Bytes
Diese Lösung akzeptiert ein Zellenarray von Zeichenfolgen als Eingabe, zählt die Anzahl der Leerzeichen in jeder Zeile und vergleicht dann das Ergebnis mit dem Array
[4 6 4]
und ergibt ein wahres (alle Werte sind 1) oder falsches (jeder Wert ist Null) Array.Online-Demo
quelle
Perl 6 , 25 Bytes
quelle
Clojure, 44 Bytes
Die Eingabe ist eine Liste von Zeichenfolgen. Funktion findet nur Leerzeichen und zählt sie. Diese Erklärung ist ein Haiku. :)
quelle
Java 7, 154 Bytes
Die Programmanforderung und das Potenzial, weniger oder mehr als drei Zeilen zu haben, sowie Javas Ausführlichkeit selbst, führen dazu, dass dieser 'Golf'-Code ziemlich groß ist.
Ungolfed:
Probieren Sie es hier aus.
quelle
SimpleTemplate, 77 Byte
Leider ist der Ansatz für reguläre Ausdrücke der kürzeste.
Erfordert, dass der Text als erstes Argument mit * NIX-Zeilenumbrüchen angegeben wird. Dies funktioniert nicht mit Newlines im Windows-Stil.
Ungolfed:
Nicht auf Regex basierend, 114 Byes
Dies setzt voraus, dass jede Zeile als Argument für die Funktion angegeben wird.
Ungolfed:
quelle
Gestapelt, 22 Bytes
Übernimmt die Eingabe vom oberen Rand des Stapels als Liste von Zeichenfolgen:
Erläuterung
quelle
Java (OpenJDK) , 82 Byte
-2 Bytes dank @ corvus_192!
Probieren Sie es online!
Es sieht so gut aus, aber ohne eine eingebaute Kartenfunktion kann ich keinen guten Weg finden. Das Durchlaufen des Arrays ist einige Bytes länger, ebenso wie das Schreiben einer Map-Funktion unter Verwendung von Streams.
Lambda-Ausdruck nimmt ein Array von Strings und gibt einen Booleschen Wert zurück.
quelle
Arrays.stream
Arrays
&
anstelle von&&
zwei Bytes speichernSmileBASIC,
9694 Bytesquelle
R, 100 Bytes
Nimmt als Argument eine Länge-3-Liste von Zeichenfolgen. Wahrscheinlich wird nicht weiter Golf gespielt, da es durch weiteres Golfen zu einer Antwort von @ Billywob wird.
quelle