Ага, це хайку?


19

Отже, ви хочете створити хайку, але ви не впевнені, чи дотримується він правил для хайку.

Мені не можна було заважати писати належну розмитість, як я зазвичай роблю, тому вам доведеться робити це з цим. Давайте застряжемо прямо.

Пошук хайку в дикій природі

Для цілей цього виклику ми перевіримо, чи відповідає даний вірш цим критеріям:

  • Є три лінії.
  • Перший рядок містить 5 складів.
  • Другий рядок має 7 складів.
  • Третій рядок містить 5 складів.

Кожен рядок складається з одного або декількох слів, розділених групами пробілів. Ці слова не обов'язково є дійсними англійськими словами.

Кожне слово розбивається на склади, а потім ці склади підраховуються, щоб отримати загальний кількість складів рядка.

Склад має 2 або 3 частини до нього: початок, кінець і, можливо, середина. Кожна частина є або групою приголосних (також відомих як згусток приголосних, таких як s, skабо spl), або групою голосних (таких як i, eaабо oui).

Якщо початок - це група приголосних, то в середині буде група голосних, а кінець - група приголосних. Якщо початок - група голосних, кінець буде групою приголосних, а середини не буде.

Наприклад, слово exampleскладається з трьох складів ex, amі ple. pleне має закінчення, оскільки його було скорочено до кінця слова.

Як інший приклад, слово syllableтакож має три склади syll, ablі e, які також не мають закінчення.

Для одного заключного прикладу слово wordмає один склад word, який закінчується групою приголосних.

Змагання

Враховуючи рядок, список рядків, список списків або будь-який інший розумний формат, що представляє вірш хоча б з одним рядком, визначте, чи відповідає він критеріям хайку, викладеним вище, і поверніть результат.

Ви можете повернути результат у будь-якому з цих форматів:

  • Достовірне значення, якщо вірш - хайку, а в іншому - помилковий.
  • Неправдиве значення, якщо вірш - хайку, а інакше - правда.
  • Значення з кінцевого діапазону значень, зазначених у поданні, якщо поема є хайку, а значення з взаємно виключаючого кінцевого діапазону значень, також зазначених у поданні.

Ви також можете припустити, що вірш не містить не алфавітних символів, але ви можете не припускати, що він повністю у верхньому чи малому регістрі.

Для цілей цього виклику Yє голосний.

Тестові справи

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

Фальсі

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

Оцінка балів

Оскільки це
найкоротша відповідь виграє
Удачу вам усім



Відповіді:


4

Желе ,  25  23 байт

-2 завдяки Еріку Попелу (використовуйте список рядків як вхідний)

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

Монадічне посилання, що містить список списків символів (рядків) та повертає список списків нулів та одиниць. Дійсний хайку буде тривалістю 3, і як тільки будь-який із найглибших списків, що є єдиним нулем, буде замінений на один, сума сплющених списків складе відповідно 5, 7 та 5. Формування (будь то пробігами листів є приголосними і тільки приймаючи перші 8 слів кожного з тільки до 4 ліній) гарантує , що тільки кінцеве кожен з допустимих і неприпустимих діапазонів.

Спробуйте в Інтернеті! або побачити (ще більш заплутаний!) тестовий набір


Тут набагато простіше використовувати  32  30-байтну версію, просто виводячи 1 або 0:

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

Спробуйте це або подивіться його тестовий набір .


Я не думаю, що "діапазон" можливостей, що не стосуються хайку, є обмеженим - у них може бути необмежена кількість слів / рядків.
Ørjan Johansen

О чорт, коли зміни були здійснені, я подумав, що лише діапазон хайку повинен бути кінцевим. Це повертає його до 32-х байт, я думаю.
Джонатан Аллан

ОК, адресований чотирма байтами, обмежуючи слова на рядок до восьми та рядки на чотири.
Джонатан Аллан

Я думаю, ви можете видалити Ỵµ, як ви можете взяти список рядків.
Ерік Аутгольфер

3

JavaScript (ES6), 84 75 байт

Вводиться як список списків слів. Повернення trueдля хайку або falseдля не хайку.

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

Тестові справи


2

Сітківка , 49 байт

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

Спробуйте в Інтернеті!

Виходи 1для хайку, 0для не хайку.


@FryAmTheEggman Це спрацювало, за винятком того, що я повинен був додати ^і $тому, що xхайкус в ряду давав би xяк рядок.
fireflame241

1
Я думаю, що це може працювати на 45 байт.
Ніл

2

Python 2 , 126 125 120 121 байт

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*

Спробуйте в Інтернеті!


Ваша остання редакція порушила вимогу, що слова, що стосуються лише приголосних, вважаються одним складом.
Ørjan Johansen

@ Ørjan Johansen: Виправлено; Дякую!
Час Браун


1
Ви можете відіграти кілька простих байтів, взявши в якості списку рядки та замінивши s.split () простоs
R just


1

Чистота , 162 ... 115 байт

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]

Визначає функцію @, беручи [[[Char]]](список списку слів) та даючи Bool.
Повертається, Trueколи вхідним Falseспособом є хайку .

Спробуйте в Інтернеті!


Здається, провал у справі кутового слова лише для приголосних.
Ørjan Johansen

@ ØrjanJohansen зафіксовано
Οurous

1

Математика 119 байт

Ось версія, яка відповідає заданим правилам для складів:

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

Ось 83-байтна версія, яка насправді рахує склади:

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

напр

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

повертається, Falseоскільки другий рядок містить шість складів, а не потрібні сім.


Це не вдається, оскільки виклик чітко визначає власне число складів, у яких не використовуються звичайні англійські правила.
Ørjan Johansen

Добре дякую, що не заборонили. Я бачу спробу визначити склад, але це не ясно. Я здогадуюсь, що "один" має два склади за цим визначенням. Схоже, люди просто підраховують суміжні голосні.
Келлі Лоудер

Майже, але слова без голосних вважаються одним складом. Дивіться коментарі до питання. Я припускаю, що це просто заплутано, що робити з приголосними групами, але це насправді не впливає на підсумковий підрахунок.
Ørjan Johansen

"Один" має два голосні, і вони не є суміжними.
Келлі Лоудер

Правильно, тому вони рахуються як два склади.
Ørjan Johansen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.