2012年1月7日土曜日

TopCoder SRM302 Div2 250Pts

この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 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計