つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

AOJ 2020 - Princess's Japanese

Princess's Japanese | Aizu Online Judge

問題

御姫様が日本語を勉強する。ローマ字が与えられる。無声化する母音を求める。文字列処理。





注意した点

M <- 無声子音
M <- 直前が無声子音の y
P <- 促音
I <- i, u
A <- a
O <- o
E <- e
N <- other
  • 語句の末尾にMをつける。
  • 長音や撥音は個別に処理する必要がない。
  • a, o は"同一の母音が無声子音とともに連続する2つ以上の拍で現れた"ときにのみ無声化するので個別で認識する必要がある。
  • e は"直近の母音が無声化されなかった場合"を識別するために使用する。

このルールに基づいて語句を変換する

kusa        -> MIMAM
hakata      -> MAMAMAM
kippu       -> MIPMIM
sasakisan   -> MAMAMIMAN
hottokouhii -> MOPMOMOIMIIM
totyo       -> MOMMOM
zen'i       -> NENNIM
turane      -> MINANEM

以上のように変換したうえで母音を探す。

FOR(i, 1, scc.length() - 1){
 switch (scc[i]){
   case 'I':
......

検索結果が以下のリストの一文字目の母音にあたりかつ直前の母音が無声音でない場合は、見つかった母音を無声音とする。

  • MIM
  • MIPM
  • MAMA
  • MAMMA
  • MOMO
  • MOMMO

i番目の文字が無声音かどうかはvbによって管理した。

        vb result(scc.length(), false);

pmは直前の母音が無声音であったかどうかである。

        bool pm = false;

MIMのケースに関してはyの存在を意識し、問題がないことを確認したが、MAMA, MOMOに関してはyを失念していたのでそこでなかなかの時間を要した。