Скануйте дактиловий гекзаметр в унікальній головоломці


10

Як страшний студент латинської мови за кілька років я навчився ненавидіти багато речей про латинську мову. Однак є одне, що я люблю.

Латинське сканування.

Сканування - це акт визначення метра певного рядка поезії. Для латинської це означає демаркацію кожного складу в рядку як "легкий" або "важкий".

У латинському скануванні є багато правил. Однак, на відміну від англійської, латинське сканування досить регулярне і часто не вимагає знання латинської лексики чи граматики. Для цієї проблеми ми будемо використовувати спрощений підмножина цих правил (справжня латинська мова не має чітких специфікацій).

Перш ніж розпочати перевірку, ви повинні зійти . Елісіон - це скидання складів між словами, щоб полегшити вимову. (наприклад, "він є" -> "він"). На відміну від англійської, латинський elision дотримується дуже приємних правил.

  • Кінцевий голосний слово, що закінчується на голосну, опускається, якщо наступне слово починається з голосного.

    NAUTA EST -> NAUTEST

  • Те саме стосується слів, що закінчуються на голосну з наступним "m".

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • Слово-початкове "h", яке супроводжується голосним, вважається єдиним голосним для цілей elision і завжди випадає, коли ухиляється.

    MULTAE HORAE -> MULTORAE

    або

    MULTAM HORAM -> MULTORAM

Після елізіону ми можемо розпочати сканування. Сканування робиться до конкретного метра. Вимірювачем для цього завдання є дактиловий гекзаметр . Дактиловий гекзаметр має шість «футів», кожна ступня складається з двох-трьох складів. Склади можуть бути довгими або короткими залежно від голосного. Кожен з перших п’яти футів буде або дактилом, довгим складом з двома короткими, або спондером, двома довгими складами. І остання стопа буде довгою, за якою слідують предки (короткі чи довгі, для цієї проблеми вам не доведеться визначати, яка).

  • Голосна латинська мова може бути короткою або довгою

  • "Я", що між двома голосними (наприклад, eiectum), є приголосним. (тобто "j")

  • "Я", що починає слово, що супроводжується голосною (наприклад, Iactus), також є приголосним

  • "U" після "q" також є приголосним (тобто "v")

  • Дифтонги (ae, au, ei, eu, oe і ui) складаються з двох голосних, але рахуються як одна голосна і завжди довгі

  • Голосний з двома або більше приголосних між ним та наступним голосним завжди довгий

  • Для попереднього правила "l" або "r" після "b", "c", "d", "g", "p" або "t" не вважаються приголосними

  • "х" вважається двома приголосними

  • "ch", "ph", "th" і "qu" вважаються одним приголосним

  • Склад "черга" в кінці слова (після елісії) завжди короткий

  • Якщо голосну силу не примушує жодне з попередніх правил, вона може бути довгою або короткою, це залежатиме від метра

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

Вхід буде містити лише пробіли та символи AZ.

Щоб представити сканування, ви виведете всі склади з |обмеженням поділу ніг. Довгий склад буде представлений через деякий -час, а короткий склад буде позначений символом a, vа попередник (останній склад кожного рядка) буде позначений символом a x. Якщо є декілька рішень, як це часто є, ви можете вивести когось із них.

Випробування

Початок Енеїди Вергілія.

 ARMA VIRUMQUE CANO TROIAE QUI PRIMUS AB ORIS     -> -vv|-vv|--|--|-vv|-x (or -vv|-vv|--|-vv|--|-x)
 ITALIAM FATO PROFUGUS LAVINIAQUE VENIT           -> -vv|--|-vv|-vv|-vv|-x
 LITORA MULTUM ILLE ET TERRIS IACTATUS ET ALTO    -> -vv|--|--|--|-vv|-x
 VI SUPERUM SAEVAE MEMOREM IUNONIS OB IRAM        -> -vv|--|-vv|--|-vv|-x (or -vv|--|-vv|-vv|--|-x)
 MULTA QUOQUE ET BELLO PASSUS DUM CONDERET URBEM  -> -vv|--|--|--|-vv|-x
 INFERRETQUE DEOS LATIO GENUS UNDE LATINUM        -> --|-vv|-vv|-vv|-vv|-x
 ALBANIQUE PATRES ATQUE ALTAE MOENIA ROMAE        -> --|-vv|--|--|-vv|-x

Подальші умови

Відповідно до латинської поезії, всі відповіді повинні починатися з призову до муз .

У латині є лише два слова з однієї літери "е" і "а". Ви можете припустити, що жодні інші слова з однієї літери не відображатимуться як вхідні дані.


2
О боже, це повертає спогади ...
ThreeFx

1
"Я", що переходить до іншої голосної, є приголосним (тобто "j"). У Lavinjaque ( --vv) є, але в Italiam ( -vv-) у тому ж вірші це не так. Може, покласти Js у вхід? Чи справді у вас є робоче рішення, що генерує цей вихід?
Лінн

О, передостанна стопа - це завжди дактиль, класично. Ви повинні вказати, чи можна відповідати на відповіді.
Лінн

@Lynn Оскільки передостання стопа - це не завжди дактиль, я навмисно залишив це неоднозначним. Це може бути будь-яке.
Ad Hoc Hunter Hunter

@Dave 1) так, ти маєш рацію 2) Це має закінчити все слово. Я
виправлю

Відповіді:


5

sed, 402 392 374 359 363 334 333 байт

"Співайте, богиню, гнів Пелеєвого сина Ахіллея та його спустошення, що наносило болі тисячі разів на ахійців, кидалися в їхньому наборі до будинку Гадеса сильними душами героїв, але віддавали їхні тіла, щоб вони були ніжним бенкетуванням собак, з усіх птахів, і воля Зевса була здійснена з того часу, коли вперше виступив у поділі конфліктний син Атрея, володар чоловіків і геніальний Ахілєй ».

- Гомер («Іліада»); плутати, чому ця цитата тут? перевірити правила.

sed -E 's/[AEIOU]M? H?([AEIOU])/\1/g;s/X/cc/g;s/(^|[ AEIOU])I([AEIOU])/\1c\2/g;s/QUE( |$)/cv/g;s/A[EU]|E[IU]|OE|UI/-/g;s/[CPT]H|[BCDGPT][LR]|QU|[^-vAEIOU ]/c/g;s/ //g;s/ucc+/-/g;s/c//g;s/^[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u].$/-\1|-\2|-\3|-\4|-\5|-x/;s/[uv]/-/g;s/---/-vv/g'

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

Використання:

printf 'ARMA VIRUMQUE CANO TROIAE QUI PRIMUS AB ORIS
ITALIAM FATO PROFUGUS LAVINIAQUE VENIT
LITORA MULTUM ILLE ET TERRIS IACTATUS ET ALTO
VI SUPERUM SAEVAE MEMOREM IUNONIS OB IRAM
MULTA QUOQUE ET BELLO PASSUS DUM CONDERET URBEM
INFERRETQUE DEOS LATIO GENUS UNDE LATINUM
ALBANIQUE PATRES ATQUE ALTAE MOENIA ROMAE' | sed -E '<...>';

Зламатися:

sed -E "
# Apply Elision
 s/[AEIOU]M? H?([AEIOU])/\1/g;

# Convert into vowels (u, v or -) and consonants (c) according to the rules given
 s/X/cc/g;
 s/(^|[ AEIOU])I([AEIOU])/\1c\2/g;
 s/QUE( |\$)/cv/g;
 s/A[EU]|E[IU]|OE|UI/-/g;
 s/[CPT]H|[BCDGPT][LR]|QU|[^-vAEIOU ]/c/g;
 s/[A-Z]/u/g; # all remaining vowels are unknown

# Remove all spaces
 s/ //g;

# A vowel followed by 2 consonants before the next vowel is long
# (and we don't care if the last vowel is long or short)
 s/ucc+/-/g;

# Remove all consonants
 s/c//g;

# Look for a matching dactylic hexameter and insert pipe separators
 s/^\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u].\$/-\1|-\2|-\3|-\4|-\5|-x/;

# Substitute identified feet with the necessary long/short vowels
 s/[uv]/-/g;
 s/---/-vv/g
"

Результати для тестових випадків:

-vv|-vv|--|--|-vv|-x
-vv|-vv|--|-vv|-vv|-x
-vv|--|--|--|-vv|-x
-vv|--|-vv|-vv|--|-x
-vv|--|--|--|-vv|-x
--|-vv|-vv|-vv|-vv|-x
--|-vv|--|--|-vv|-x

Варто зазначити, що я отримую різні результати для тестових випадків 2 та 3, які, як видається, є альтернативними рішеннями, не включеними у запитання. Можливо, я неправильно трактував правило.
Дейв

Я не думаю, що ваше дослідження на тестовий випадок 2 працює. Останнє "U" в "PROFUGUS" повинно бути довгим, оскільки перед наступною голосною є два приголосні ("S" і "L"). У вашому огляді це вам коротко. Я зараз перевіряю третю. Приємна відповідь у будь-якому випадку
Ad Hoc Garf Hunter

@WheatWizard ага гаразд, це правило, про яке я цікавився (мав би запитати) - я вважав, що це означає 2 приголосні без пробілів . Досить просто виправити. Я скоро опублікую оновлення.
Дейв

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