前書き
英語とは異なり、ドイツ語は音素表記システムが非常に優れていると考えられています。これは、スペルと発音の対応が近いことを意味します。なじみのない単語を考えても、スペルシステムのために、その単語の発音方法を知っているでしょう。これは、コンピューターでも正しく実行できるはずだということですか?
チャレンジ
ドイツ語の単語を表す文字列を入力として受け取り、その発音を国際音声文字(IPA)で出力または返すプログラムまたは関数を作成します。
もちろん、ドイツ語や完全なIPAを学ばせるつもりはありません。この1つのWikipediaのセクションでは、あなたが必要とするルール、と私はungolfed C#のコード化されてきたIPAにほぼすべてのドイツ語を提供リファレンス実装を。
このリンクには、400の一般的なドイツ語の単語とそのIPAの発音のリストも提供されています(検証に必要です)。そのリストから例を挙げると、入力がのsolltest
場合、正しい出力はˈzɔltəst
です。
参照実装は、Wikipediaセクションで言及されていない2つの有用なルールを追加します:単語のストレスが最初の音節(ドイツ語である可能性が非常に高い)にあると想定し、文字「e」がシュワ音/ə/を表すタイミングを決定するために、より良いヒューリスティックを使用します。プレフィックスの特別な処理も実装しますが、思ったほど結果が改善されませんでした。
詳細
有効なエントリと見なされるには、プログラムが次の要件を満たしている必要があります。
- IPA出力は、参照語リストの 400語のうち少なくとも300語と完全に一致する必要があります(参照実装は333正しいです)
- あなたのプログラムは、もっともらしいドイツ語を推測する必要があります。したがって、技術的な要件があります。これは、正規表現に一致し、
[a-zA-ZäÄöÖüÜ][a-zäöüß]*
少なくとも1つの母音(aeiouyäöü)を持つ入力については、空白以外の出力を生成し、エラーを出力しないことを意味します。 - プログラムは決定論的である必要があります(同じ入力に対して常に同じ出力を生成します)
- それ以外の場合、標準的な抜け穴は禁止されています(特に、オフサイトリソースの取得に関するもの)
許可されているその他のこと:
- 必要に応じて、出力に先頭と末尾の空白を含める
- 出力に既存の文字エンコーディングを使用します(Unicode以外がうまく機能することは想像できませんが、可能であればおめでとうございます)
- 入力は、ユニコード正規化形式NFD、NFCなどのような正規化された形式であると仮定します。たとえば、äは単一の文字またはベース文字+結合文字として書かれていますか?
- 標準の入出力方法を使用する
スコアリングとIPAキャラクター
スコアリングはバイト単位です。ドイツ語の文字とIPAの文字はUTF-8で2バイトであることに注意してください。また、IPA文字U + 0327 COMBINING INVERTED BREVE BELOW(̯)はUnicode結合文字であり、2バイトのUTF-8文字そのものです。つまり、ɐ̯のようなものはUTF-8では4バイトとしてカウントされます。好奇心の強い人のために、この記号は母音が音節核を形成しないことを意味します(前のものは代わりに形成します)。
また、一部のフォントでは他のASCII文字のように見えるこれらのIPA文字に注意してください。
参照語リストの作成方法
このセクションは、チャレンジには不要な追加情報です。
単語リストはこのウィクショナリーの単語頻度リストから取得され、大文字と小文字の違いと、英語のウィクショナリーにドイツ語のエントリがない2つの単語(oh&hey)のために繰り返しを削除しました。IPAは、英語とドイツ語の両方のウィクショナリーを見ていた。複数の発音が提供された場合、より正式で標準的なものを選びました。これが明確でない場合は、一般的なルールに最も適合するものを選択しました。
また、文字「r」の発音方法を標準化する必要がありました。この文字がどのように発音されるかは地域に大きく依存しており、ウィクショナリーは選択したものとまったく一貫していませんでした。私はそれが次の傾向があると感じました:「r」は長い母音が続き、母音が続かないとき発音される/ɐ̯/、そうでなければ、それはʁです。したがって、非常に一貫性のある/(f)ɛɐ̯/であるver-およびer-プレフィックスを除き、すべてのルールをそのルールに従うように変更しました。同様に、「eu」を/ɔʏ̯/として標準化しました。
#~WordData~"PhoneticForm"&
)が、英語の単語に対してのみ機能します。