このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についてざっくりと説明する。
小文字と空白のみからなる文字列messageを暗号化する。まずaからzまでの26文字の並びを先頭からfirstSize番目の文字で切って、二つのグループに分ける。次に対応表を作る。先頭のグループはfirstRoteteだけ後ろにずらし(最後方の文字は先頭に移動する)、後半のグループはsecondRoteteだけ後ろにずらす。messageはこのずらしたあとの対応表を基に暗号化する。例えばfirstSize=3、firstRotete=1、secondRotete=0、message="abcde"であれば、abcはbcaとずれることになるので、"abcde"は"bcade"となる(deはsecondRoteteが0なので文字の暗号化は行われない)。暗号化対象のmessage、アルファベット26文字をグループに分ける際に用いられるfirstSize、2つの文字のグループで文字を移動させるfirstRotete、secondRoteteが与えられたとき、messageを暗号化した結果を文字列で返せ。
私の解答はこちら。
public class TwoRotationCypher {
public String encrypt(int firstSize, int firstRotate, int secondRotate, String message) {
StringBuilder sb = new StringBuilder();
for( int i=0 ; i<message.length() ; i++ ){
char c = message.charAt(i);
if( c == ' ' ){
sb.append(' ');
continue;
}
if( c-'a' < firstSize ){ // cがfirst groupに入る場合
int pos = (c-'a'+firstRotate) % firstSize;
sb.append((char)('a'+pos));
}else{
int pos = (c-'a'-firstSize-1+secondRotate) % (26-firstSize) + firstSize + 1;
if( pos == 26 ) pos = firstSize;
sb.append((char)('a'+pos));
}
}
return sb.toString();
}
}得点は108.91/250、1回のsubmitでシステムテストクリア。境界値で嵌りました。pos==26という行が後付の箇所です。余りを利用して綺麗に書けないかなとは思うのですが...
0 件のコメント:
コメントを投稿