このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
英語では名刺の複数形は多くのややこしい規則からなるが、大部分は4つのルールから複数形が生成される。次のようなルールである。
- s,z,x,ch,shで終わる場合はesを語尾につける
- ay,ey,iy,uy,oyで終わる場合はsを語尾につける
- yで終わるが上のルールを満たさない場合、最後のyを除いたうえでiesをつける
- それ以外はsを語尾につける
nouns[]という複数形に変化させる前の文字列が与えられたときに、上の4つのルールに従って複数形に変化させた時の結果を配列で返せ。
私の解答はこちら。
public class NounReform {
public String[] makePlural(String[] nouns) {
String[] rule1 = {"s", "z", "x", "ch", "sh"};
String[] rule2 = {"ay", "ey", "iy", "oy", "uy"};
String[] ret = new String[nouns.length];
LOOP : for( int i=0 ; i<nouns.length ; i++ ){
System.out.println(nouns[i]);
for( int j=0 ; j<rule1.length ; j++ ){
if( nouns[i].endsWith(rule1[j]) ){
ret[i] = nouns[i] + "es";
continue LOOP;
}
}
for( int j=0 ; j<rule2.length ; j++ ){
if( nouns[i].endsWith(rule2[j]) ){
ret[i] = nouns[i] + "s";
continue LOOP;
}
}
if( nouns[i].endsWith("y") ){ // rule3にしてもよいかな?
ret[i] = nouns[i].substring(0, nouns[i].length()-1) + "ies";
}else{
ret[i] = nouns[i] + "s"; // rule4に該当
}
}
return ret;
}
}得点は159.48/250、中央値は約190点。C言語のgotoに相当することがしたくて、調べものをしたら時間がかかってしまった。

0 件のコメント:
コメントを投稿