¿Es un haiku?

19

Por lo tanto, desea crear un haiku, pero no está seguro si sigue las reglas de sílaba para un haiku.

No podría molestarme en escribir una propaganda adecuada como lo hago habitualmente, así que tendrás que arreglártelas con esto. Vamos a quedarnos atrapados.

Encontrar un haiku en la naturaleza

Para los propósitos de este desafío, verificaremos si el poema dado cumple estos criterios:

  • Hay tres lineas.
  • La primera línea tiene 5 sílabas.
  • La segunda línea tiene 7 sílabas.
  • La tercera línea tiene 5 sílabas.

Cada línea está compuesta de una o más palabras, separadas por grupos de espacios. Estas palabras no son necesariamente palabras inglesas válidas.

Cada palabra se divide en sílabas, y luego esas sílabas se cuentan para obtener el recuento total de sílabas de la línea.

Una sílaba tiene 2 o 3 partes: el principio, el final y posiblemente el medio. Cada parte es un grupo de consonantes (también conocido como un grupo de consonantes, como s, sko spl) o un grupo de vocales (como i, eao oui).

Si el comienzo es un grupo de consonantes, el medio será un grupo de vocales y el final será un grupo de consonantes. Si el comienzo es un grupo de vocales, el final será un grupo de consonantes y no habrá medio.

Por ejemplo, la palabra examplese compone de tres sílabas ex, amy ple. pleno tiene final ya que fue interrumpido al final de la palabra.

Como otro ejemplo, la palabra syllabletambién tiene tres sílabas syll, ably e, que tampoco tiene final.

Para un ejemplo final, la palabra wordtiene una sílaba word, que termina con un grupo de consonantes.

El reto

Dada una cadena, una lista de cadenas, una lista de listas o cualquier otro formato razonable que represente un poema con al menos una línea, determine si cumple con los criterios de un haiku descritos anteriormente y devuelva el resultado.

Puede devolver el resultado en cualquiera de estos formatos:

  • Un valor verdadero si el poema es un haiku y uno falso de lo contrario.
  • Un valor falso si el poema es un haiku y uno verdadero de lo contrario.
  • Un valor de un rango finito de valores especificado en el envío si el poema es un haiku y un valor de un rango finito de valores mutuamente excluyentes también especificado en el envío.

También puede suponer que el poema no contiene caracteres no alfabéticos, pero no puede suponer que está completamente en mayúscula o minúscula.

A los efectos de este desafío, Yes una vocal.

Casos de prueba

Verdad

This is a haiku
Yes it truly is one
See what I did man

I am so tired
of writing this already
when can I stop this

Writing another
Of these horrific things
Come on please

Consonant only
Counts as one syllable
ghjk tgh knmb wrts vbc

Falsa

oh boy writing non haiku is so much easier

This is
so good
on my
poor dear brain

The syllables do not match
at least I do not think so
I have not checked

It does not really matter
these test cases will help
At least I think they will

I am done here
This is enough
Goodbye

Puntuación

Dado que este es el
la respuesta más corta ganará.
Buena suerte a todos.

LyricLy
fuente
Sandbox
LyricLy
Relacionado
LyricLy

Respuestas:

4

Jalea ,  25  23 bytes

-2 gracias a Erik the Outgolfer (use una lista de líneas como entrada)

e€Øy0;ŒgP€
ḲLÐfÇ€ḣ8µ€ḣ4

Un enlace monádico que toma una lista de listas de caracteres (las líneas) y devuelve una lista de listas de listas de ceros y unos. El haiku válido será de longitud 3 y una vez que cualquiera de las listas más profundas que sean un solo cero sean reemplazadas por una sola, la suma de las listas planas será 5, 7 y 5 respectivamente. La formación (si las series de letras son consonantes y solo toman las primeras 8 palabras de cada una de hasta 4 líneas) asegura que solo haya límites finitos de cada uno de los rangos válidos e inválidos.

Pruébalo en línea! o vea la suite de pruebas (¡aún más confusa!)


Aquí hay una versión de  32  30 bytes mucho más fácil de usar , simplemente generando 1 o 0:

e€Øy0;ŒgP€SȯL$
ḲLÐfÇ€Sµ€⁼5,7,5

Pruebe este o vea su conjunto de pruebas .

Jonathan Allan
fuente
No creo que el "rango" de posibilidades que no sean Haiku sea finito: puede tener un número ilimitado de palabras / líneas en ellas.
Ørjan Johansen
Oh, maldita sea, cuando se hizo el cambio, pensé que solo era el rango de haiku lo que necesitaba ser finito. Eso lo devuelve al 32 byter, creo.
Jonathan Allan
OK dirigido por cuatro bytes limitando las palabras por línea a ocho y las líneas a cuatro.
Jonathan Allan
Creo que puede eliminar Ỵµ, ya que puede tomar una lista de líneas.
Erik the Outgolfer
3

JavaScript (ES6), 84 75 bytes

Toma entrada como una lista de listas de palabras. Devoluciones truepara haiku o falsepara no haiku.

a=>a.map(s=>(s.map(w=>w.match(/[aeiouy]+/gi))+'').split`,`.length)=='5,7,5'

Casos de prueba

Arnauld
fuente
2

Retina , 49 bytes

i`[aeiouy]+
1
T`lL`2
2*12+
3
[12]+
3
%M`3
^5¶7¶5$

Pruébalo en línea!

Salidas 1para haiku, 0para no haiku.

fireflame241
fuente
@FryAmTheEggman Eso funcionó, excepto que tuve que agregar ^y $porque los xhaikus seguidos darían xcomo una cadena.
fireflame241
1
Creo que esto podría funcionar para 45 bytes.
Neil
2

Python 2 , 126 125 120 121 bytes

lambda s:[len(split('\s+',sub('[aeiouy][^aeiouy ]+','X ',t,0,I).strip()))for t in s.split('\n')]==[5,7,5]
from re import*

Pruébalo en línea!

Chas Brown
fuente
Su última edición incumplió el requisito de que las palabras de solo consonantes cuenten como 1 sílaba.
Ørjan Johansen
@ Ørjan Johansen: fijo; ¡Gracias!
Chas Brown
en 116B
Traut
1
Puede eliminar algunos bytes fáciles tomando la entrada como una lista de líneas y reemplazando s.split () con solos
Rɪᴋᴇʀ
1

Limpio , 162 ... 115 bytes

import StdEnv,StdLib
@t=[sum[max(sum(map hd(group[sum[1\\v<-:"AaEeIiOoUuYy"|c==v]\\c<-w])))1\\w<-l]\\l<-t]==[5,7,5]

Define la función @, tomar [[[Char]]](lista de la lista de palabras) y dar Bool.
Devuelve Truecuando la entrada es un haiku, de lo Falsecontrario.

Pruébalo en línea!

Οurous
fuente
Parece fallar en el caso de la esquina de la palabra de solo consonantes.
Ørjan Johansen
@ ØrjanJohansen solucionado
Οurous el
1

Mathematica 119 Bytes

Aquí hay una versión que se ajusta a las reglas dadas para las sílabas:

Tr/@Map[Length@StringCases[#,("a"|"e"|"i"|"o"|"u"|"y")..]/. 0->1&,(s=StringSplit)/@s[ToLowerCase@#,"\n"],{2}]=={5,7,5}&

Aquí hay una versión de 83 bytes que realmente cuenta sílabas:

Tr/@Map[Length@WordData[#,"Hyphenation"]&,(s=StringSplit)/@s[#,"\n"],{2}]=={5,7,5}&

p.ej

%@"This is a haiku
Yes it truly is one
See what I did man"

vuelve Falseya que la segunda línea tiene seis sílabas en lugar de las siete requeridas.

Kelly Lowder
fuente
Esto falla porque el desafío define explícitamente su propio recuento de sílabas, que no utiliza reglas comunes en inglés.
Ørjan Johansen el
Bueno, gracias por no votar. Veo un intento de definir una sílaba, pero no está claro. Supongo que "uno" tiene dos sílabas por esta definición. Parece que las personas solo cuentan vocales contiguas.
Kelly Lowder
Casi, pero las palabras sin vocales cuentan como una sílaba. Ver los comentarios de la pregunta. Supongo que es confuso sobre qué hacer con los grupos de consonantes, pero eso en realidad no afecta el conteo final.
Ørjan Johansen
"uno" tiene dos vocales, y no son contiguas.
Kelly Lowder
Correcto, entonces cuentan como dos sílabas.
Ørjan Johansen el