Problem:
シーザー暗号

問題

ガイウス・ユリウス・カエサル（Gaius Julius Caesar)，英語読みでジュリアス・シーザー（Julius Caesar）は，古代ローマの軍人であり政治家である．カエサルは，秘密の手紙を書くときに， 'A' を 'D' に， 'B' を 'E' に， 'C' を 'F' に，というように3つずらして表記したという記録が残っている．

大文字のアルファベット26文字だけからなる文字列を，カエサルがしたように3文字ずつずらす変換を施し得られた文字列がある．このような文字列を元の文字列に戻すプログラムを作成せよ．

各文字の変換前と変換後の対応は次のようになる．

変換前

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

変換後

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

A

B

C

例えば，この方法で文字列 JOI を変換すると MRL が得られ，この方法で変換された文字列 FURDWLD の元の文字列は CROATIA である．

入力

入力は1行だけからなり，その1行は大文字のアルファベットのみで構成される文字列を1つ含む．

入力される文字列の長さは 1000 以下である．

出力

入力された文字列を元に戻した文字列だけを含む1行を出力する。

入出力例

入力例 1

MRL

出力例 1

JOI

入力例 2

FURDWLD

出力例 2

CROATIA

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main{

	Scanner sc=new Scanner(System.in);

	int INF=1<<28;
	double EPS=1e-9;

	void run(){
		String s=sc.next();
		for(char c : s.toCharArray()){
			int k='Z'-'A'+1;
			print(""+(char)((c-'A'-3+k)%k+'A'));
		}
		println("");
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

	public static void main(String[] args){
		// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
		new Main().run();
	}
}