Uh, é um haiku?


19

Então, você deseja criar um haiku, mas não tem certeza se ele segue as regras da sílaba para um haiku.

Não me incomodei em escrever uma sinopse adequada, como normalmente faço, então você terá que se contentar com isso. Vamos ficar presos.

Encontrar um haiku na natureza

Para os propósitos deste desafio, verificaremos se o poema fornecido atende a estes critérios:

  • Existem três linhas.
  • A primeira linha possui 5 sílabas.
  • A segunda linha possui 7 sílabas.
  • A terceira linha possui 5 sílabas.

Cada linha é composta por uma ou mais palavras, separadas por grupos de espaços. Essas palavras não são necessariamente válidas em inglês.

Cada palavra é dividida em sílabas e, em seguida, essas sílabas são contadas para obter a contagem total de sílabas da linha.

Uma sílaba tem 2 ou 3 partes: o começo, o fim e, possivelmente, o meio. Cada parte é um grupo de consoantes (também conhecido como cluster de consoantes, como s, skou spl) ou um grupo de vogais (como i, eaou oui).

Se o começo é um grupo de consoantes, o meio será um grupo de vogais e o final será um grupo de consoantes. Se o começo é um grupo de vogais, o fim será um grupo de consoantes e não haverá meio.

Por exemplo, a palavra exampleé composta de três sílabas, ex, ame ple. plenão tem final, pois foi interrompido no final da palavra.

Como outro exemplo, a palavra syllabletambém tem três sílabas, syll, able e, que também não tem fim.

Para um exemplo final, a palavra wordtem uma sílaba word, que termina com um grupo de consoantes.

O desafio

Dada uma sequência, lista de sequências, lista de listas ou qualquer outro formato razoável que represente um poema com pelo menos uma linha, determine se ele atende aos critérios de um haiku descritos acima e retorne o resultado.

Você pode retornar o resultado em qualquer um destes formatos:

  • Um valor verdadeiro, se o poema é um haiku e, caso contrário, um falso.
  • Um valor falso se o poema for um haiku e, de outra forma, um verdadeiro.
  • Um valor de um intervalo finito de valores especificado na submissão se o poema for um haiku e um valor de um intervalo finito mutuamente exclusivo de valores também especificado na submissão.

Você também pode assumir que o poema não contém caracteres não alfabéticos, mas não pode assumir que esteja inteiramente em maiúsculas ou minúsculas.

Para os propósitos deste desafio, Yé uma vogal.

Casos de teste

Truthy

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

Falsy

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

Pontuação

Uma vez que este é o
A resposta mais curta ganhará
Boa sorte para todos vocês



Respostas:


4

Geléia ,  25  23 bytes

-2 graças a Erik the Outgolfer (use uma lista de linhas como entrada)

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

Um link monádico que obtém uma lista de listas de caracteres (as linhas) e retorna uma lista de listas de listas de zeros e uns. O haiku válido terá o comprimento 3 e, quando uma das listas mais profundas, que é um único zero, for substituída por uma única, a soma das listas niveladas será 5, 7 e 5, respectivamente. A formação (se as corridas de letras são consoantes e apenas as 8 primeiras palavras de cada uma das 4 linhas) garante que haja apenas finito para cada um dos intervalos válidos e inválidos.

Experimente online! ou veja o (ainda mais confuso!) conjunto de testes


A seguir, é muito mais fácil usar a versão de  32 bytes de 32  , simplesmente produzindo 1 ou 0:

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

Experimente este ou veja sua suíte de testes .


Eu não acho que o "leque" de possibilidades não-haicais seja finito - você pode ter um número ilimitado de palavras / linhas nessas.
Ørjan Johansen

Oh, caramba, quando a mudança foi feita, pensei que era apenas o alcance do haiku que precisava ser finito. Isso coloca de volta ao 32 byter, eu acho.
Jonathan Allan

OK endereçado por quatro bytes, limitando as palavras por linha a oito e as linhas a quatro.
Jonathan Allan

Eu acho que você pode remover Ỵµ, como você pode ter uma lista de linhas.
Erik the Outgolfer

3

JavaScript (ES6), 84 75 bytes

Recebe a entrada como uma lista de listas de palavras. Retorna truepara haiku ou falsenão-haiku.

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

Casos de teste


2

Retina , 49 bytes

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

Experimente online!

Saídas 1para haiku, 0para não haiku.


@FryAmTheEggman Isso funcionou, exceto que eu tive que adicionar ^e $porque os xhaikus seguidos dariam xcomo uma string.
Fireflame241

11
Eu acho que isso pode 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*

Experimente online!


Sua última edição quebrou o requisito de que palavras apenas consoantes contam como 1 sílaba.
Ørjan Johansen

@ Ørjan Johansen: Fixo; valeu!
Chas Brown


11
Você pode golfe alguns bytes fácil fora, tomando entrada como uma lista de linhas, e substituindo s.split () com apenass
Rɪᴋᴇʀ


1

Limpo , 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 a função @, levando [[[Char]]](lista de lista de palavras) e dando Bool.
Retorna Truequando a entrada é um haiku, Falsecaso contrário.

Experimente online!


Parece falhar na caixa de canto da palavra apenas consoante.
Ørjan Johansen

@ ØrjanJohansen corrigido
Οurous

1

Mathematica 119 Bytes

Aqui está uma versão que está em conformidade com as regras fornecidas para sílabas:

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

Aqui está uma versão de 83 bytes que realmente conta sílabas:

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

por exemplo

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

retorna Falsedesde que a segunda linha possui seis sílabas, em vez das sete necessárias.


Isso falha porque o desafio define explicitamente sua própria contagem de sílabas, que não usa regras comuns em inglês.
Ørjan Johansen

Bem, obrigado por não reduzir a votação. Vejo uma tentativa de definir uma sílaba, mas não está claro. Eu estou supondo que "um" tem duas sílabas por esta definição. Parece que as pessoas estão apenas contando vogais contíguas.
Low

Quase, mas palavras sem vogais contam como uma sílaba. Veja os comentários da pergunta. Suponho que seja confuso o que fazer com grupos consoantes, mas isso não afeta a contagem final.
Ørjan Johansen

"one" possui duas vogais e elas não são contíguas.
21418 Kelly Kellyderder

Certo, então eles contam como duas sílabas.
Ørjan Johansen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.