フィンランド語でのSpooneriseの言葉


19

この課題は、私がアールト大学で受講したプログラミングコースに基づいており、そこからのテストケースが含まれています。素材は許可を得て使用されています。

2年半前に、英語でのスプーネリズムについての挑戦がありました。ただし、フィンランドでは、スポーネリズムははるかに複雑です。

フィンランドのスプーネリズム

フィンランド語では、母音がaeiouyäöあり、子音がありbcdfghjklmnpqrstvwxzます。(å技術的にはフィンランド語の一部ですが、ここでは考慮しません。)

最も基本的なspoonerismsは、各単語の最初の母音、およびそれらに先行する子音のみを取り、部分を交換します:

henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo

長母音

一部の単語には、同じ連続した母音が2つ含まれています。これらの場合、長さを同じに保つために、母音ペアを他の単語の最初の母音、短縮または延長母音と交換する必要があります。

haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi

2つの異なる連続した母音の場合、これは適用されません。

hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti

3つ以上の同じ連続文字が入力に表示されません

母音の調和

フィンランド語には、母音調和と呼ばれるこの素敵なものがあります。基本的に、後の母音 aou前の母音 äöyが同じ単語に表示されないことを意味します。

ワードに前面または背面の母音を交換する場合、単語の残りの部分で他の種類のすべての母音は、言葉の新たな始まりと一致するように変更する必要があります(a <-> äo <-> öu <-> y):

yhä kontti -> kouha ntti
hauva läähättää -> yvä haahattaa

eそしてi中立であり、他のすべての文字で表示されることがあります。それらを単語に入れ替えても、単語の残りの部分が変更されてなりません

特殊なケース

母音の調和は、多くの外来語や複合語を含む一部の単語には適用されません。これらのケースは「正しく」処理する必要はありません。

チャレンジ

2つの単語が与えられたら、spoonerised単語を出力します。

入力語には文字a-zとのみが含まれますäö。大文字または小文字を選択できますが、単語と入力/出力の両方で一貫性のある選択をする必要があります。

I / Oは任意の便利な形式で実行できます。(単語は文字列または文字の配列と見なされる必要があります。)

これはであるため、バイト単位の最短ソリューションが優先されます。

テストケース


入出力エンコーディングを選択できますか?また、入力で単一文字の代わりに発音区別記号を使用することを要求することは許容されますか?
ドアノブ

@Doorknob任意のエンコーディングを選択できますが、テキストはNFCになります(つまり、結合文字はありません)。エンコードは一部の言語との互換性の場合がありますが、NFC / NFDはおそらくそうではありません。(処理できるものU+0308 COMBINING DIAERESISU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
すべて正常に

1
以来ei、中性であるfihus keksyhuvu lehylesmä prihtiの許容解答kehys fiksulevy huhuおよびprisma lehtiそれぞれ?
アーナウルド

1
副次的なコメントとして:長い母音と母音の調和のために、フィンランドのスプーンは、不随意的な機能ではありません。たとえば、次のとおりpuoskari äyskäri --> äöskäri puuskari --> puoskari ääskäriです。
アーナルド

@Arnauldいいえ。質問を更新します。中立母音は変化しないはずです。
PurkkaKoodari

回答:


9

JavaScript(ES6)、196 175バイト

カリー化構文では、単語を2つの文字列として扱います(a)(b)。文字の2つの配列の配列を返します。

a=>b=>[(e=/(.*?)([eiäaöoyu])(\2?)(.*)/,g=(a,[,c,v])=>[...c+v+(a[3]&&v)+a[4]].map(c=>(j=e.search(v),i=e.search(c))>9&j>9?e[i&~1|j&1]:c))(a=e.exec(a),b=e.exec(b),e+=e),g(b,a)]

オンラインでお試しください!

どうやって?

各入力語は、4つのキャプチャグループを持つ正規表現eを介して渡されます。

e = /(.*?)([eiäaöoyu])(\2?)(.*)/    1: leading consonants (or empty)
     [ 1 ][     2    ][ 3 ][ 4]     2: first vowel
                                    3: doubled first vowel (or empty)
                                    4: all remaining characters

ヘルパー関数g()は、更新される単語のすべてのキャプチャグループをa []として、他の単語の最初と2番目のキャプチャグループをcおよびvとして受け取ります。

基本的なスプーネリズムを適用し、長母音を次のように処理します。

c + v + (a[3] && v) + a[4]

母音のハーモニーを適用するには、まず正規表現eをそれ自体に追加することで文字列に強制します。

e = "/(.*?)([eiäaöoyu])(\2?)(.*)//(.*?)([eiäaöoyu])(\2?)(.*)/"
     ^^^^^^^^^^^^^^^^
     0123456789ABCDEF (position as hexa)

調和させる必要がある母音は、結果の文字列で9より大きい位置にあります。さらに、表現は、前の母音äöyが偶数の位置にあり、後の母音aouが対応する隣の奇数の位置にあるように配置されました。

したがって、出力語の各文字cに適用される次の変換式:

(j = e.search(v), i = e.search(c)) > 9 & j > 9 ? e[i & ~1 | j & 1] : c

4

Pythonの3235の 231 225 221 217 215バイト

import re
S=F,B='äöy','aou'
def f(a,b,C=1):
 e,r,Q,W=re.findall(fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'*2,a+' '+b)[0][2:6]
 for c in zip(*S*(W in B)+(B,F)*(W in F)):r=r.replace(*c)
 return[Q+W*len(e)+r]+(C and f(b,a,[]))

オンラインでお試しください!


保存しました

  • -2バイト、Lynnのおかげ
  • -4バイト、ザカリーのおかげ

2
:2つのバイトを保存fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
リン・

1
さらに良い:あなたは、2番目の行を変更することができますS='äöy','aou'5行目で、その後、:(F,B)=> S(B,F)=> S[::-1](これは@Lynnが与えた提案と互換性がありません)
ザカリー

また、4行目を変更しe,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]て、さらに数バイトを保存することができます。
ザカリー

私が言いたいこと:2行目をS=F,B='aöy','aou'に、4行目をに変更(F,B)Sます。
ザカリー

S=F,B=...あなたが交換した場合、いくつかのバイトを保存する必要があります(F,B)S
ザカリー

0

Pyth、84バイト

.b++hY*W@N2JhtY2XW}JeA@DJc2"aouäöy"eNGH_Bmth:d:"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"4

オンラインでお試しください。 テストスイート。

ゴルフ言語ではそれほど難しくないことを証明します。スタックベースの言語のほうがさらに良いかもしれません。

PythはデフォルトでISO-8859-1を使用するため、äöそれぞれ1バイトです。

説明

  • Q、単語の入力ペアを含む、暗黙的に追加されます。
  • md入力内の各単語を以下にマップします。
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]":交換するAaeiouyäö]正規表現を取得するには、文字列に^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
    • :d:すべての一致を検索し、それらのキャプチャグループを返します。
    • h:最初の(そして唯一の)マッチを取ります。
    • t:一致全体を含む最初のグループを削除します。
  • _B:を取得するためにreverseとペアにします[[first, second], [second, first]]
  • .bN, Yその中の単語の各ペアを以下にマッピングします。
    • hY:2番目の単語の最初の子音を取ります。
    • @N2:最初の単語の長い最初の母音を取る、またはNone
    • htY:2番目の単語の最初の母音を取ります。
    • J:に保存しJます。
    • *W2:長母音があった場合、2番目の単語の母音を複製します。
    • +:子音に追加します。
    • c2"aouäöy"aouäöy2つに分割して取得し["aou", "äöy"]ます。
    • @DJ:2番目の単語の最初の母音との交差によってペアをソートします。これにより、ペアの最後に2番目の単語の最初の母音を含む半分が取得されます。
    • A:ペアをに保存しG, Hます。
    • e:後半を取る。
    • }J:2番目の単語の最初の母音が後半にあるかどうかを確認します。
    • XWeNGH:ある場合、最初の単語の接尾辞にマップGHます。そうでない場合、接尾辞をそのままにします。
    • +:サフィックスを追加します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.