Un haiku es un poema con tres líneas, con un conteo de sílabas 5/7/5 , respectivamente.
Un haiku-w es un poema con tres líneas, con un recuento de palabras 5/7/5 , respectivamente.
Reto
Escriba un programa que devuelva verdadero si la entrada es un haiku-w, y falso si no.
Una entrada de haiku-w válida debe constar de 3 líneas, separadas por una nueva línea.
- La línea 1 debe constar de 5 palabras, cada palabra separada por un espacio.
- La línea 2 debe constar de 7 palabras, cada palabra separada por un espacio.
- La línea 3 debe constar de 5 palabras, cada palabra separada por un espacio.
Ejemplos
The man in the suit
is the same man from the store.
He is a cool guy.
Resultado: verdadero
Whitecaps on the bay:
A broken signboard banging
In the April wind.
Resultado: falso
Reglas
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
- Se aplican las lagunas de código estándar de golf. Hacer trampa está prohibido.
- Otros valores de retorno booleanos, como
1
y0
, son aceptables. - Una lista de longitud 3 de cadenas como entrada también es aceptable.
- Las entradas válidas de haiku-w no deben tener espacios iniciales o finales, ni espacios múltiples que separen las palabras.
code-golf
decision-problem
DomTheDeveloper
fuente
fuente
Respuestas:
JavaScript (ES6),
73726463544239 bytesGracias a Neil por guardar 13 bytes
Explicación
Esta es una función de flecha gruesa que toma una serie de cadenas como argumento. Reemplaza cada línea por su número de palabras. Si es un haiku-w,
a
ahora contiene una matriz de cinco, siete y cinco nuevamente. Como JavaScript no nos permite comparar 2 matrices al mismo tiempo, la matriz se convierte primero en una cadena y luego se compara. Esto da como resultado un valor booleano que se devuelve.fuente
%
y*
tiene la misma precedencia, por lo que no necesita el()
s, aunque creo(d*2|5)
que también podría funcionar. También puedes salirte con la tuya&
, aunque creo que puedes mejorar incluso usando eso(b...).length==3>b.some(...length-...)
.a=>a.map(c=>c.split
.length)=='5,7,5'
.+''
-==
stringifica si el otro argumento es un string.AWK (GNU Awk),
24,30,28, 20 bytesGolfed
Producirá "517253" para True y una cadena vacía para False .
La guía del usuario de GNU Awk
Cómo funciona
Cada instrucción awk (regla) consiste en un patrón (o expresión) con una acción asociada:
Awk leerá la entrada línea por línea (registro por registro) y evaluará la expresión del patrón para ver si se debe invocar una acción correspondiente.
El código anterior es una expresión (patrón) Awk independiente sin el bloque de acción, que se supone que es
{print $0}
en ese caso.Debe leerse de derecha a izquierda:
q=q NF NR
Anexar un N umber de F ields (palabras) y N umber de R ecords (es decir, el número de línea de corriente), a la variable q .
De esta manera, al procesar un Haiku-w adecuado, q se establecerá en:
$0=q
Asigne el valor recién calculado de q a $ 0 (que contiene toda la línea / registro actual de forma predeterminada).
517253==$0
Compárelo con una "firma" para un Haiku-w adecuado (517253), si hay una coincidencia, toda la expresión se evalúa como "verdadera" y
print $0
se ejecuta una acción correspondiente (implícita ), enviando "517253" a stdout (Verdadero) , de lo contrario, la salida estará vacía (Falso).Tenga en cuenta que esto reconocerá correctamente un Haiku-w, incluso si es seguido por un número arbitrario de líneas de basura, pero creo que está bien, ya que:
(es decir, podemos suponer que la entrada tiene 3 líneas de largo)
Prueba
¡Pruébelo en línea!
fuente
Python , 42 bytes
Pruébalo en línea!
Toma la entrada como una lista de líneas, con las palabras separadas por espacios individuales.
Como estamos garantizados que no habrá espacios iniciales o finales, y solo espacios individuales separarán cada palabra, podemos verificar un w-haiku simplemente contando los espacios en cada línea.
Hacemos esto en una lista de comprensión, para crear una lista de los recuentos de espacios. Si es un haiku correcto, debería verse así
[4, 6, 4]
, así que lo comparamos con esto y devolvemos el resultado.fuente
map(str.count,l,' ')
.Jalea ,
109 bytesPruébalo en línea!
Explicación
fuente
ċ€⁶⁼4,6,4
yċ€⁶⁼464D¤
... no puedo encontrar nada más corto, sin embargo. (Oh, usted puede darle la vuelta, también:464D⁼ċ€⁶$
)ċ€⁶Ḍ=464
funciona bien para 8.Lote, 102 bytes
Sale con un nivel de error distinto de cero en cuanto lee una línea con el número incorrecto de palabras.
fuente
Mathematica, 21 bytes
Función sin nombre que toma una lista de listas de caracteres como entrada y regresa
True
oFalse
. Simplemente cuenta cuántos espacios hay en cada lista de caracteres, que según las reglas del desafío se correlacionan perfectamente con el número de palabras en cada línea.Presentación previa:
Mathematica, 31 bytes
Función sin nombre que toma una lista de cadenas como entrada y regresa
True
oFalse
.fuente
Haskell,
3433 bytesPruébalo en línea! .
Editar: gracias a @xnor por un byte!
fuente
f l=[sum[1|' '<-c]|c<-l]==[4,6,4]
.Retina , 12 bytes
(hay un espacio final después de la primera línea)
Pruébalo en línea!
M%`
- Cuente el número de espacios en cada línea.M
- Modo de coincidencia: imprime el número de coincidencias.%
- para cada línea`
- configuración separada y patrón regex^4¶6¶4$
- Debe haber 4, 6 y 4 espacios, y exactamente tres líneas.¶
coincide con las nuevas líneas. El resto es una simple expresión regular.Imprime
1
para entradas válidas,0
para inválidas.fuente
Python,
5844 bytes-14 por tbodt
fuente
split("\n")
.lambda h:[len(l.split())for l in h]==[5,7,5]
Perl , 26 bytes
24 bytes de código + 2 bytes para
-ap
banderas.Pruébalo en línea!
fuente
Pyth, 9 bytes
Un programa que toma la entrada de una lista
"quoted strings"
e imprimeTrue
oFalse
según correspondaBanco de pruebas
Cómo funciona
fuente
Japt , 11 bytes
Ahorró muchos bytes gracias a @ETHproductions
Esto toma una matriz de tres cadenas como entrada.
Ejecútalo en línea!
fuente
PowerShell , 43 bytes
Pruébalo en línea!
Explicación
Toma la entrada como una cadena separada de nueva línea.
Elimina todos los espacios que no son espacios en blanco, luego verifica que coincidan "4 espacios, nueva línea, 6 espacios, nueva línea, 4 espacios nueva línea" exactamente, utilizando una expresión regular.
El grupo de captura coincide con 4 espacios, la
\1
referencia inversa se refiere a eso. Las nuevas líneas están incrustadas en la cadena. Tenga en cuenta que la segunda línea de la expresión regular contiene dos espacios después de la referencia inversa.fuente
Pyke,
119 bytesPruébalo aquí!
Después del
u
byte hay los siguientes bytes:0x03 0x04 0x06 0x04
fuente
J, 12 bytes
La entrada es una lista en caja de cadenas.
Explicación
Este es un tenedor con un diente izquierdo constante. Esto comprueba el resultado del diente correcto,,
#@;:@>
para la igualdad con4 6 4
. El momento correcto desempaqueta cada (>
), luego (@
) convierte cada cadena en palabras (;:
), luego (@
) toma la longitud de cada (#
).fuente
R, 48 bytes
Lee un vector de caracteres de 3 longitudes de stdin y funciona contando el número de espacios. Para contar el número de espacios, usamos el
str_count
delstringr
paquete que puede contar las ocurrencias según un patrón de expresiones regulares.Un enfoque alternativo sin usar paquetes podría ser:
fuente
el
antes, gracias por eso.C 142 bytes
Versión sin golf:
Devuelve 1 para 5/7/5 secuencia más 0.
Un caso de prueba positivo:
fuente
C ++, 357 bytes
Algo nuevo en el código de golf, pero esto es lo mejor que puedo hacer rápidamente
fuente
Ruby 1.9.3
No es golf, pero es en sí un haiku-w
o...
Desafortunadamente, no funciona con espacios en blanco iniciales en ninguna línea, pero hace frente al seguimiento.
fuente
Python 2 ,
5764 bytesEdición corregida con la adición de 7 bytes después de los comentarios de @Dada. ¡Gracias!
Pruébalo en línea!
No es la respuesta más corta de Python por un largo camino, pero solo quería usar el nuevo truco que aprendí recientemente
input()
para mostrar la salida y guardar unaprint
declaración. Toma una lista de líneas como entrada. Requiere Ctrl C (o cualquier otra pulsación de tecla) para finalizar el programa (con una excepción) en un terminal, pero funciona bien sin TIO.fuente
MATL, 16 bytes
La entrada es un conjunto de celdas de cadenas y devuelve un conjunto verdadero o falso .
Pruébalo en línea
Explicación
fuente
MATLAB / Octave, 38 bytes
Esta solución acepta un conjunto de celdas de cadenas como entrada, cuenta el número de espacios en cada línea y luego compara el resultado con el conjunto
[4 6 4]
y produce un conjunto verdadero (todos los valores son 1) o falsey (cualquier valor es cero).Demostración en línea
fuente
Perl 6 , 25 bytes
fuente
Clojure, 44 bytes
La entrada es una lista de cadenas. La función encuentra solo espacios y los cuenta. Esta explicación es un Haiku. :)
fuente
Java 7, 154 bytes
El requisito del programa y el potencial de tener menos o más de tres líneas, sin mencionar la verbosidad de Java en sí, hace que este código 'golfizado' sea bastante grande.
Sin golf:
Pruébalo aquí
fuente
SimpleTemplate, 77 bytes
Lamentablemente, el enfoque de expresión regular es el más corto.
Requiere que el texto se proporcione como primer argumento, con líneas nuevas al estilo * NIX. Esto no funcionará con las nuevas líneas al estilo de Windows.
Sin golf:
No basado en expresiones regulares, 114 byes
Esto requiere que cada línea se proporcione como un argumento para la función.
Sin golf:
fuente
Apilado, 22 bytes
Toma la entrada desde la parte superior de la pila como una lista de cadenas de caracteres, como tal:
Explicación
fuente
Java (OpenJDK) , 82 bytes
-2 bytes gracias a @ corvus_192!
Pruébalo en línea!
Se ve tan golfable pero sin una función de mapa incorporada, no puedo encontrar una buena manera. La iteración a través de la matriz es de unos pocos bytes más, al igual que escribir una función de mapa utilizando secuencias.
La expresión lambda toma una matriz de cadenas y devuelve un booleano.
fuente
Arrays.stream
, pero es lo suficientemente largo como para que no valga la pena usarla (especialmente si necesita importarArrays
)&
lugar de&&
guardar dos bytesSmileBASIC,
9694 bytesfuente
R, 100 bytes
Toma como argumento una lista de cadenas de longitud 3. Probablemente no se jugará más golf ya que jugar más golf lo convierte en la respuesta de @ Billywob.
fuente