AOJ1240 Unreliable Message
問題リンク Unreliable Message
- 概要
王様と、6人の家臣J, C, E, A, P, Mがいる。
王様に対するメッセージSが6人の家臣を伝って王様に届くが、彼らは受け取ったメッセージを少し変えてしまい、王様は変わってしまったメッセージTを受け取る。
王様は元のメッセージが読みたい。
どういう順番で家臣を伝って王様に届いたかとTが入力で与えられるので、メッセージを復元してSを答えよ。
- 解法
6人の変更を打ち消す処理をそれぞれ書いて、王様に伝った順番を逆にして打ち消し処理をしていきます。
- ソース
import java.util.Scanner; //Unreliable Message public class AOJ1240 { String J(String s){ return s.charAt(s.length()-1)+s.substring(0, s.length()-1); } String C(String s){ return s.substring(1)+s.charAt(0); } String E(String s){ return s.length()%2==0?s.substring(s.length()/2, s.length())+s.substring(0, s.length()/2): s.substring(s.length()/2+1, s.length())+s.charAt(s.length()/2)+s.substring(0, s.length()/2); } String A(String s){ return new StringBuilder(s).reverse().toString(); } String P(String s){ String res = ""; for(char c:s.toCharArray()){ if(!Character.isDigit(c))res+=c; else res += (char)((c-'0'+9)%10+'0'); } return res; } String M(String s){ String res = ""; for(char c:s.toCharArray()){ if(!Character.isDigit(c))res+=c; else res += (char)((c-'0'+1)%10+'0'); } return res; } void run(){ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while(t--!=0){ char[] c = sc.next().toCharArray(); String s = sc.next(); for(int i=c.length-1;i>=0;i--)s=c[i]=='J'?J(s):c[i]=='C'?C(s):c[i]=='E'?E(s):c[i]=='A'?A(s):c[i]=='P'?P(s):M(s); System.out.println(s); } } public static void main(String[] args) { new AOJ1240().run(); } }