テキストの文字列内の単語をハイフンで区切って音節化するプログラムを作成する必要があります。それは大変な作業になるので、主に完璧なアルゴリズムに必要な発音の表を持ちたくないので、いくつかの部分をスキップしたいでしょう。また、この割り当てを与えられたときの復venとして、可能な限り短く(したがって、読み取り不能および保守不能に)したいと考えています。
次の2つの選択肢があります。
- STDINから文字列を取得し、その結果をSTDOUTに出力するプログラムを作成します。
- 文字列を単一のパラメーターとして受け取り、結果を返す関数を作成します。
仕様
- この場合、文字列とは、選択した言語の文字列に似た構造(バイト配列、文字配列、文字列など)を意味します。
- 母音は
a, e, i, o, u - 指定された文字列には
1 <= n <= 10単語があり、各単語は1 - 30文字間の長さを含みます。 - すべての文字は小文字であり、単語は常にスペースで区切られます。したがって、入力は文字で構成されます
[a-z ] - 重要度の順にルールを適用します。
- 単語が分割されたら、単語の右半分から再び始めます。
音節化のルール、重要度順
2つの連続する同じ母音は1つとしてカウントされます(つまりfeet、母音は1つだけですがbeat、finding2つあります)。すべての音節には1つの母音があるため、各母音には1つの音節があります。
- 単語全体に 4文字しか含まれていない場合は、変更せずに返します。(残りの単語はこれをスキップします)
- 単語に母音が1つしかない場合は、単語を変更せずに返します。
- 単語に2つの連続した母音がある場合、それらを分割します(つまり
diaspora->di-as-po-ra) - 2つ以上の子音が(同じまたは異なる)2つの母音の間に来る
sis-ter場合、子音部分がckである場合を除き、最初の子音の後に分割します(つまり、その場合、その後の単語を分割します)。(つまりnickel->nick-el) - a
yが2つの母音の間にある場合、その単語をその後に分割します(例paying->pay-ing)。 - 1つの子音が2つの母音(同じまたは異なる)の間に来る場合、子音の前で分割します(つまり、
dra-gon) - 分割できない場合は、単語を変更せずに返します。
これらのルールは問題なく再帰的に適用でき、発音テーブルを必要としないため、これらのルールを選択しました。したがって、それらは正確ではなく、たとえばルール5はしばしば正しくありません。ただし、一般的な場合はそうです。
例
In: hello world
Out: hel-lo world
In: have a nice day
Out: have a nice day
In: pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re
lua
x-e-non?ルール#4の参照?