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