Pindai hexameter dactylic dalam teka-teki unik

10

Sebagai siswa Latin yang mengerikan selama beberapa tahun, saya telah belajar membenci banyak hal tentang bahasa Latin. Namun ada satu hal yang saya sukai.

Perluasan Latin.

Scansion adalah tindakan menentukan meter garis puisi tertentu. Untuk bahasa Latin ini berarti demarkasi setiap suku kata di baris sebagai "ringan" atau "berat".

Dalam bahasa Latin scansion memiliki banyak aturan. Namun tidak seperti perluasan bahasa Inggris Latin cukup teratur dan sering tidak memerlukan pengetahuan tentang kosakata bahasa Latin atau tata bahasa untuk dilakukan. Untuk masalah ini, kita akan menggunakan subset yang disederhanakan dari aturan-aturan tersebut (Latin nyata tidak memiliki spesifikasi yang rapi).

Sebelum memulai, Anda harus kawin lari . Elision adalah suku kata yang menurun di antara kata-kata untuk memudahkan pengucapan. (mis. "dia adalah" -> "dia"). Tidak seperti bahasa Inggris, elision Latin mengikuti aturan yang sangat bagus.

  • Vokal terakhir dari sebuah kata yang diakhiri dengan vokal dihilangkan jika kata berikutnya dimulai dengan vokal.

    NAUTA EST -> NAUTEST

  • Hal yang sama berlaku untuk kata-kata yang berakhir dengan vokal diikuti oleh "m".

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • Inisial-kata "h" diikuti oleh vokal dianggap sebagai vokal tunggal untuk keperluan elision dan selalu dijatuhkan ketika dielakkan.

    MULTAE HORAE -> MULTORAE

    atau

    MULTAM HORAM -> MULTORAM

Setelah elisi kita bisa mulai melakukan perluasan. Pembesaran dilakukan ke meteran tertentu. Meteran untuk tantangan ini adalah hexameter dactylic . Hexameter Dactylic memiliki enam "kaki" setiap kaki terdiri dari dua atau tiga suku kata. Suku kata bisa panjang atau pendek tergantung pada vokal. Masing-masing dari lima kaki pertama akan berupa daktil, suku kata yang panjang diikuti oleh dua yang pendek, atau spondee, dua suku kata yang panjang. Dan kaki terakhir akan menjadi panjang diikuti oleh ancep (pendek atau panjang, untuk masalah ini Anda tidak harus menentukan yang mana).

  • Vokal dalam bahasa latin bisa pendek atau panjang

  • "I" yang diapit di antara dua vokal (misalnya eiectum) adalah konsonan. (yaitu a "j")

  • "I" yang memulai kata diikuti dengan vokal (misalnya Iactus) juga merupakan konsonan

  • A "u" setelah "q" juga merupakan konsonan (yaitu "v")

  • Difftong (ae, au, ei, eu, oe, dan ui) terdiri dari dua vokal tetapi dihitung sebagai satu vokal dan selalu panjang

  • Vokal dengan dua atau lebih konsonan antara itu dan vokal berikutnya selalu panjang

  • Untuk aturan sebelumnya, "l" atau "r" setelah "b", "c", "d", "g", "p", atau "t" tidak dihitung sebagai konsonan

  • "x" dihitung sebagai dua konsonan

  • "ch", "ph", "th", dan "qu" dihitung sebagai satu konsonan

  • Suku kata "que" di akhir kata (setelah elision) selalu pendek

  • Jika vokal tidak dipaksakan oleh salah satu aturan sebelumnya, dapat berupa panjang atau pendek ini tergantung pada meter

Tugas Anda adalah mengambil garis bahasa latin dan menghasilkan perluasannya. Anda akan mengambil dalam garis sebagai string melalui input standar dan output string yang mewakili perluasan akhir.

Input hanya akan berisi spasi dan karakter AZ.

Untuk mewakili perluasan, Anda akan menampilkan semua suku kata dengan |membatasi pemisahan kaki. Suku kata panjang akan diwakili oleh -sementara suku kata pendek akan ditandai oleh a vdan suku kata (suku kata terakhir dari setiap baris) akan ditandai oleh a x. Jika ada beberapa solusi karena sering kali ada Anda dapat output siapa pun dari mereka.

Uji Kasus

Awal dari Virgil's Aeneid.

 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

Ketentuan lebih lanjut

Dengan cara yang tepat dari puisi Latin, semua jawaban harus dimulai dengan doa kepada orang-orang .

Bahasa Latin hanya memiliki dua kata satu huruf "e" dan "a". Anda dapat berasumsi bahwa tidak ada satu kata pun kata yang akan muncul sebagai input.

Ad Hoc Garf Hunter
sumber
2
Ya Tuhan, ini membawa kembali kenangan ...
ThreeFx
1
"I" melanjutkan vokal lain adalah konsonan (yaitu "j"). Dalam Lavinjaque ( --vv) itu, tetapi dalam Italiam ( -vv-) dalam ayat yang sama tidak. Mungkin memasukkan Js di input? Apakah Anda benar-benar memiliki solusi yang berfungsi menghasilkan output ini?
Lynn
Oh, kaki kedua dari belakang selalu daktil, klasik. Anda harus menentukan apakah jawaban dapat diasumsikan demikian.
Lynn
@ Lynn Karena kaki kedua dari belakang tidak selalu merupakan daktil, saya sengaja membiarkannya ambigu. Mungkin juga.
Ad Hoc Garf Hunter
@Dave 1) ya Anda benar 2) Ini harus mengakhiri seluruh kata. Saya akan segera memperbaikinya
Ad Hoc Garf Hunter

Jawaban:

5

sed, 402 392 374 359 363 334 333 byte

"Bernyanyi, dewi, kemarahan putra Peleus, Achilleus dan kehancurannya, yang membuat ribuan orang bersusah payah melanda orang-orang Achian, melemparkan banyak orang ke rumah para pahlawan pahlawan Hades yang kuat, tetapi memberikan tubuh mereka untuk menjadi pesta anjing yang rumit, dari semua burung, dan kehendak Zeus tercapai sejak saat itu ketika pertama kali ada perpecahan konflik putra Atreus penguasa manusia dan Achilleus yang cerdas. "

- Homer (The Iliad); bingung mengapa kutipan ini ada di sini? periksa aturannya.

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'

Tidak persis golf, tetapi ini mengimplementasikan semua aturan yang diberikan dalam bentuk ekspresi reguler, yang hanya berjalan satu per satu untuk mencapai solusi. Ini menangani setiap baris secara independen, sehingga dapat memproses seluruh input multi-jalur.

Pemakaian:

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 '<...>';

Kerusakan:

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
"

Hasil untuk kasus uji:

-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
Dave
sumber
Perlu dicatat bahwa saya mendapatkan hasil yang berbeda untuk kasus uji 2 & 3, yang tampaknya menjadi solusi alternatif yang tidak termasuk dalam pertanyaan. Bisa jadi saya salah menafsirkan aturan.
Dave
Saya tidak berpikir cakupan Anda untuk test case 2 berfungsi. "U" terakhir dalam "PROFUGUS" harus panjang karena ada dua konsonan ("S" dan "L") sebelum vokal berikutnya. Dalam scansion Anda, Anda memilikinya pendek. Saya sedang memeriksa yang ketiga sekarang. Jawaban yang bagus :)
Ad Hoc Garf Hunter
@WheatWizard ah ok, itu adalah aturan yang saya pikirkan (seharusnya ditanyakan) - Saya menganggapnya 2 konsonan tanpa spasi . Cukup mudah untuk diperbaiki. Saya akan segera mengirim pembaruan.
Dave
Sepertinya saya juga punya bug di mana vccvccvakan menjadi -??bukannya --?diperbaiki sekarang. Sepertinya itu setuju dengan sampel Anda pada semua tetapi kasus # 2 sekarang.
Dave