2020-お姫様の日本語
Princess's Japanese | Aizu Online Judge
日本語難しいです
解法
頑張って問題文の指示通りに実装する
実装(C++)
#include <iostream> #include <vector> #include <algorithm> using namespace std; string voiceless_consonant[]={ "k","s","t","h","p", "ky","sy","ty","hy","py" }; //母音かどうかの判定 bool is_vowel(const char a){ return(a=='a'||a=='i'||a=='u'||a=='e'||a=='o'); } bool is_voiceless_consonant(const string &a){ return find(voiceless_consonant,voiceless_consonant+10,a)!=voiceless_consonant+10; } struct Beat{//拍 int type; string consonant; char vovel; }; string solve(const string &in){ vector<Beat> beat; string tmp; for(int i=0;i<(int)in.size();i++){ if(is_vowel(in[i])){//強制的に区切りになる if(i&&in[i-1]=='a'&&in[i]=='a'){ beat.push_back((Beat){6,"",'a'}); }else if(i&&in[i-1]=='i'&&in[i]=='i'){ beat.push_back((Beat){6,"",'i'}); }else if(i&&in[i-1]=='u'&&in[i]=='u'){ beat.push_back((Beat){6,"",'u'}); }else if(i&&in[i-1]=='e'&&in[i]=='i'){ beat.push_back((Beat){6,"",'i'}); }else if(i&&in[i-1]=='o'&&in[i]=='u'){ beat.push_back((Beat){6,"",'u'}); }else{ if(tmp==""){ beat.push_back((Beat){1,"",in[i]}); }else if(tmp.size()==1){ beat.push_back((Beat){2,tmp,in[i]}); }else if(tmp.size()==2){ beat.push_back((Beat){3,tmp,in[i]}); } } tmp=""; }else if(in[i]=='n'){ if(i+1<(int)in.size()&&in[i+1]=='\''){ i++; beat.push_back((Beat){5,"'",'n'}); }else if((i+1<(int)in.size()&&is_vowel(in[i+1])!=true&&in[i+1]!='y')||i+1==(int)in.size()){ beat.push_back((Beat){5,"",'n'}); }else{ tmp+=in[i]; } }else if(i+1<(int)in.size()&&in[i]==in[i+1]&&in[i]!='n'&&in[i]!='y'&&in[i]!='w'&&is_vowel(in[i])!=true){ beat.push_back((Beat){4,tmp+=in[i],in[i]}); tmp=""; }else{ tmp+=in[i]; } } string res; bool ok=true; for(int i=0;i<(int)beat.size();i++){ if(beat[i].type<=3){ bool used=false; if(ok&&is_voiceless_consonant(beat[i].consonant)&&(beat[i].vovel=='i'||beat[i].vovel=='u')){ //無声子音である if(i+1>=(int)beat.size()||is_voiceless_consonant(beat[i+1].consonant)){ used=true; res+=beat[i].consonant+"("+beat[i].vovel+")"; ok=false; }else{ res+=beat[i].consonant+beat[i].vovel; } }else if(ok&&is_voiceless_consonant(beat[i].consonant)&&(beat[i].vovel=='a'||beat[i].vovel=='o')&&i+1<(int)beat.size()&&(beat[i+1].vovel==beat[i].vovel)&&beat[i+1].type<=3&&is_voiceless_consonant(beat[i+1].consonant)){ used=true; res+=beat[i].consonant+"("+beat[i].vovel+")"; ok=false; }else{ res+=beat[i].consonant+beat[i].vovel; } if(used==false){ ok=true; } }else{ if(beat[i].type==5){ res+=beat[i].vovel+beat[i].consonant; }else if(beat[i].type==6){ res+=beat[i].vovel; }else{ res+=beat[i].vovel; } } } return res; } int main(){ string in; while(cin>>in){ if(in=="#")break; cout<<solve(in)<<endl; } }