Uh, è un haiku?


19

Quindi vuoi creare un haiku, ma non sei sicuro che segua le regole della sillaba per un haiku.

Non potrei essere disturbato a scrivere un vero e proprio turbinio come faccio di solito, quindi dovrai accontentarti di questo. Rimaniamo bloccati dentro.

Alla ricerca di un haiku in natura

Ai fini di questa sfida, verificheremo se la data poesia soddisfa questi criteri:

  • Ci sono tre righe.
  • La prima riga ha 5 sillabe.
  • La seconda riga ha 7 sillabe.
  • La terza riga ha 5 sillabe.

Ogni riga è composta da una o più parole, separate da gruppi di spazi. Queste parole non sono necessariamente parole inglesi valide.

Ogni parola viene suddivisa in sillabe, e quindi quelle sillabe vengono contate per ottenere il conteggio delle sillabe totali della linea.

Una sillaba ha 2 o 3 parti: l'inizio, la fine e forse il centro. Ogni parte è un gruppo di consonanti (noto anche come un gruppo di consonanti, come s, sko spl) o un gruppo di vocali (come i, eao oui).

Se l'inizio è un gruppo di consonanti, il centro sarà un gruppo di vocali e la fine sarà un gruppo di consonanti. Se l'inizio è un gruppo di vocali, la fine sarà un gruppo di consonanti e non ci sarà alcun centro.

Ad esempio, la parola exampleè composta da tre sillabe ex, ame ple. plenon ha fine poiché è stato tagliato alla fine della parola.

Come altro esempio, la parola syllableha anche tre sillabe syll, able e, che non ha fine.

Per un ultimo esempio, la parola wordha una sillaba word, che termina con un gruppo di consonanti.

La sfida

Data una stringa, un elenco di stringhe, un elenco di elenchi o qualsiasi altro formato ragionevole che rappresenti una poesia con almeno una riga, determinare se soddisfa i criteri di un haiku descritto sopra e restituire il risultato.

È possibile restituire il risultato in uno di questi formati:

  • Un valore veritiero se la poesia è un haiku e una falsa altrimenti.
  • Un valore falso se la poesia è un haiku e una verità altrimenti.
  • Un valore da un intervallo finito di valori specificato nell'invio se il poema è un haiku e un valore da un intervallo finito di valori reciprocamente esclusivi specificato anche nell'invio.

Puoi anche supporre che la poesia non contenga caratteri non alfabetici, ma non puoi presumere che sia interamente in maiuscolo o minuscolo.

Ai fini di questa sfida, Yè una vocale.

Casi test

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

punteggio

Dato che si tratta di
La risposta più breve vincerà
Buona fortuna a tutti voi



Risposte:


4

Gelatina ,  25  23 byte

-2 grazie a Erik the Outgolfer (utilizzare un elenco di righe come input)

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

Un collegamento monadico che prende un elenco di elenchi di caratteri (le righe) e restituisce un elenco di elenchi di elenchi di zeri e di quelli. L'haiku valido sarà di lunghezza 3 e una volta che una delle liste più profonde che sono un singolo zero vengono sostituite da una singola, la somma delle liste appiattite sarà rispettivamente 5, 7 e 5. La formazione (se le serie di lettere sono consonanti e prende solo le prime 8 parole di ciascuna di un massimo di 4 righe) assicura che ci siano solo limiti di ciascuno degli intervalli validi e non validi.

Provalo online! o vedere la suite di test (ancora più confusa!)


Ecco una versione  32 a  30 byte molto più semplice da usare , semplicemente in uscita 1 o 0:

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

Prova questo o vedi la sua suite di test .


Non penso che la "gamma" di possibilità non-Haiku sia limitata: in queste puoi avere un numero illimitato di parole / righe.
Ørjan Johansen

Oh dannazione quando è stata apportata la modifica, ho pensato che fosse solo la gamma di haiku che doveva essere limitata. Ciò lo riporta al 32 byte penso.
Jonathan Allan,

OK indirizzato per quattro byte limitando le parole per riga a otto e le righe a quattro.
Jonathan Allan,

Penso che puoi rimuovere Ỵµ, in quanto puoi prendere un elenco di righe.
Erik the Outgolfer

3

JavaScript (ES6), 84 75 byte

Accetta input come un elenco di elenchi di parole. Restituisce trueper haiku o falseper non haiku.

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

Casi test


2

Retina , 49 byte

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

Provalo online!

Uscite 1per haiku, 0per non haiku.


@FryAmTheEggman Funzionava, tranne che dovevo aggiungere ^e $perché l' xhaikus di fila avrebbe dato xcome una stringa.
fireflame241

1
Penso che questo potrebbe funzionare per 45 byte.
Neil

2

Python 2 , 126 125 120 121 byte

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*

Provalo online!


L'ultima modifica ha infranto il requisito secondo cui le parole di sola consonanza contano come 1 sillaba.
Ørjan Johansen

@ Ørjan Johansen: risolto; grazie!
Chas Brown


1
Puoi liberare alcuni byte facili prendendo l'input come un elenco di linee e sostituendo s.split () con solos
Rɪᴋᴇʀ


1

Pulito , 162 ... 115 byte

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]

Definisce la funzione @, prendendo [[[Char]]](elenco di parole) e dando Bool.
Restituisce Truequando l'input è un haiku, Falsealtrimenti.

Provalo online!


Sembra fallire nel caso dell'angolo di parole di sola consonante.
Ørjan Johansen

@ ØrjanJohansen fixed
Οurous

1

Mathematica 119 byte

Ecco una versione conforme alle regole fornite per le sillabe:

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

Ecco una versione da 83 byte che conta effettivamente le sillabe:

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

per esempio

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

ritorna Falsepoiché la seconda riga ha sei sillabe anziché le sette richieste.


Ciò fallisce perché la sfida definisce esplicitamente il proprio conteggio delle sillabe, che non utilizza le normali regole inglesi.
Ørjan Johansen,

Bene grazie per non aver votato. Vedo un tentativo di definizione di una sillaba, ma non è chiaro. Immagino che "uno" abbia due sillabe con questa definizione. Sembra che le persone contino solo vocali contigue.
Kelly Lowder,

Quasi, ma le parole senza vocali valgono come una sillaba. Vedi i commenti alla domanda. Suppongo che sia solo confuso su cosa fare con i gruppi di consonanti, ma ciò non influisce sul conteggio finale.
Ørjan Johansen,

"uno" ha due vocali e non sono contigue.
Kelly Lowder,

Bene, quindi contano come due sillabe.
Ørjan Johansen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.