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;
	}
}