Сканируйте дактильный гексаметр в уникальной головоломке

10

Будучи ужасным латинским студентом, в течение нескольких лет я научился ненавидеть многие вещи о латыни. Однако есть одна вещь, которую я люблю.

Латинская развертка.

Сканирование - это акт определения метра определенной строки стихов. Для латыни это означает разграничение каждого слога в строке как «легкий» или «тяжелый».

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

Прежде чем начать сканирование, вы должны пройти тестирование . Elision - это падающие слоги между словами, облегчающие произношение. (например, «он есть» -> «он»). В отличие от английского, латинский elision следует очень хорошим правилам.

  • Последний гласный слова, заканчивающийся гласным, опускается, если следующее слово начинается с гласного.

    НАУТА ЭСТ -> НАУТЕСТ

  • То же самое касается слов, оканчивающихся на гласную, за которой следует «m».

    ФИДУМ АГРИКОЛАМ -> ФИДАГРИКОЛАМ

  • Начальная буква «h», за которой следует гласная, считается единственной гласной в целях исключения и всегда исключается при исключении.

    MULTAE HORAE -> МУЛЬТОРА

    или

    МУЛЬТАМ ХОРАМ -> МУЛЬТОРАМ

После исключения мы можем начать сканирование. Сканирование производится на определенный метр. Метром для этой задачи является дактильный гексаметр . Дактильный гексаметр имеет шесть «футов», каждая нога состоит из двух или трех слогов. Слог может быть длинным или коротким в зависимости от гласного. Каждый из первых пяти футов будет либо дактилом, длинным слогом, за которым следуют два коротких, либо спондее, двумя длинными слогами. И последним шагом будет длинный, за которым следует анцепс (короткий или длинный, для этой проблемы вам не нужно будет определять, какой именно).

  • Гласный на латинском языке может быть коротким или длинным

  • «I», заключенное между двумя гласными (например, eiectum), является согласной. (то есть "J")

  • «Я», начинающее слово, за которым следует гласный (например, Iactus), также является согласной

  • «U» после «q» также является согласной (то есть «v»)

  • Дифтонги (ae, au, ei, eu, oe и ui) состоят из двух гласных, но считаются одним гласным и всегда длинные

  • Гласный с двумя или более согласными между ним и следующим гласным всегда длинный

  • Для предыдущего правила «l» или «r» после «b», «c», «d», «g», «p» или «t» не считаются согласными

  • «х» считается двумя согласными

  • "ch", "ph", "th" и "qu" считаются одним согласным

  • Слог "que" в конце слова (после пропуска) всегда короткий

  • Если гласная не навязывается одним из предыдущих правил, она может быть длинной или короткой, это будет зависеть от метра

Ваша задача - взять строку латиницы и произвести ее сканирование. Вы берете строку как строку через стандартный ввод и выводите строку, представляющую окончательное сканирование.

На входе будут только пробелы и символы AZ.

Для представления отсканированного изображения вы выведите все слоги с |разграничением ступней. Длинный слог будет представлен, в -то время как короткий слог будет отмечен как a, vа anceps (последний слог каждой строки) будет отмечен как 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
«I», идущее от другой гласной, является согласной (то есть «j»). В Lavinjaque ( --vv) это так, но в Italiam ( -vv-) в том же стихе это не так. Может поставить Js на входе? У вас действительно есть рабочее решение, генерирующее этот вывод?
Линн
О, предпоследняя ступня всегда классическая. Вы должны указать, могут ли ответы предполагать это.
Линн
@Lynn Так как предпоследняя нога не всегда является дактилем, я намеренно оставил это двусмысленным. Это может быть либо.
Специальный охотник за
@ Дейв 1) да, вы правы 2) должно закончиться все слово. Я исправлю это в ближайшее время
Ad Hoc Garf Hunter

Ответы:

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.
Дэйв