ユニークなパズルで触覚ヘキサメーターをスキャン


10

ラテン系のひどい学生として数年間、私はラテン語について多くのことを嫌うことを学びました。しかし、私が好きなことが1つあります。

ラテン語のスキャンション。

スキャンとは、詩の特定のラインのメーターを決定する行為です。ラテン語の場合、これは、行の各音節を「軽い」または「重い」として区別することを意味します。

ラテン語のスキャンでは多くのルールがあります。ただし、英語とは異なり、ラテン語のスキャンはかなり規則的であり、ラテン語の語彙や文法の知識を実行する必要はありません。この問題については、これらのルールの簡略化されたサブセットを使用します(実際のラテン語にはきちんとした仕様がありません)。

あなたがしなければならないscansion始める前Elideのを。Elisionは、発音を簡単にするために単語間に音節をドロップすることです。(例:「彼は」->「彼は」)。英語とは異なり、ラテン語の省略は非常に優れた規則に従います。

  • 次の単語が母音で始まる場合、母音で終わる単語の最後の母音は省略されます。

    NAUTA EST-> NAUTEST

  • 同じことが母音で終わり、その後に "m"が続く単語にも当てはまります。

    FIDUM AGRICOLAM-> FIDAGRICOLAM

  • 語頭の "h"の後に母音が続く場合は、省略のために1つの母音として数えられ、省略時には常に削除されます。

    MULTAE HORAE-> MULTORAE

    または

    MULTAM HORAM-> MULTORAM

省略後、スキャンを開始できます。スキャンは特定のメーターに対して行われます。この挑戦のためのメートルは、dactylic hexameterです。Dactylic hexameterには6つの「足」があり、各足は2つまたは3つの音節で構成されています。音節は、母音に応じて長い場合と短い場合があります。最初の5フィートのそれぞれは、dactyl、長い音節、それに続く2つの短い音節、またはspondee、2つの長い音節のいずれかになります。そして、最後の足は、先祖が後に続く長いものになります(この問題では、先祖を特定する必要はありません)。

  • ラテン語の母音は短くても長くてもかまいません

  • 2つの母音(例:ectectum)の間に挟まれた "i"は子音です。(つまり「j」)

  • 母音が続く単語「i」、たとえば「Iactus」も子音です

  • 「q」の後の「u」も子音です(つまり「v」)

  • 二母音(ae、au、ei、eu、oe、ui)は2つの母音で構成されますが、1つの母音として数えられ、常に長くなります。

  • 母音と次の母音の間に2つ以上の子音がある母音は常に長い

  • 前のルールでは、「b」、「c」、「d」、「g」、「p」、または「t」の後の「l」または「r」は子音としてカウントされません

  • 「x」は2つの子音としてカウントされます

  • 「ch」、「ph」、「th」、および「qu」は1つの子音としてカウントされます

  • 単語の最後の(省略後の)音節「que」は常に短い

  • 母音が前の規則のいずれかによって強制されていない場合、長さも短さも、これはメーターによって異なります。

あなたの仕事は、ラテン語の行を取り、それをスキャンすることです。標準入力を介して行を文字列として取り込み、最終的なスキャンを表す文字列を出力します。

入力には、スペースと文字AZのみが含まれます。

スキャンを表すために|、足の間隔を区切ってすべての音節を出力します。長い音節はaで表され、-短い音節はaでマークされv、先祖(すべての行の最後の音節)はでマークされます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

その他の規定

ラテン詩の適切な方法で、すべての答えは、ミューズへの呼び出しで始まる必要があります。

ラテン語には、「e」と「a」の2文字の単語しかありません。他の1文字の単語は入力として表示されないと想定できます。


2
ああ、これで思い出が
よみがえる

1
別の母音に続く「i」は子音です(つまり「j」)。Lavinjaque--vv)それはですが、中Italiam-vv-)と同じ詩にはそうではありません。たぶん入力にJsを入れますか?この出力を生成する実際のソリューションはありますか?
Lynn

ああ、最後から2番目の足は、古典的には常にダクティルです。回答がそうであると想定できるかどうかを指定する必要があります。
Lynn

@Lynn最後から2番目の足は常にダクティルではないので、意図的にあいまいにしています。それはどちらかです。
アドホックガーフハンター2016

@デイブ1)はい、あなたは正しい2)それは言葉全体を終わらせなければならない。これらはまもなく修正します
アドホックガーフハンター2016

回答:


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は1つずつ実行されてソリューションに到達します。これは各行を個別に処理するため、複数行の入力全体を処理できます。

使用法:

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で異なる結果が得られることは注目に値します。これは、質問に含まれていない代替ソリューションのようです。ルールを間違って解釈したのかもしれません。
Dave

テストケース2のスキャンは機能しないと思います。次の母音の前に2つの子音( "S"と "L")があるため、 "PROFUGUS"の最後の "U"は長くなければなりません。あなたのスキャンではそれが不足しています。今3枚目チェック中です。とにかくいい答え:)
アドホックガーフハンター

@WheatWizardああ、それは私が疑問に思っていた規則でした(質問するべきでした)— スペースのない 2つの子音を意味すると解釈しました。簡単に修正できます。近日中にアップデートを投稿します。
Dave

代わりにバグが発生vccvccvしたよう-??です--?—修正しました。ケース2以外のすべてのサンプルと一致しているようです。
Dave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.