シーザーパスワード史上一番難しい問題です。

3190 ワード

史上最も難しい問題
Time Limit: 1000 MS
 
メモリLimit: 100000 K
Total Submissions: 2260
 
Acceepted: 1265
Description
ユリウス・カエサルは危険と陰謀に満ちた時代を生きていました。そこで彼は軍のメッセージ伝達のための最初の暗号システムの一つを発明した。
 
あなたがシーザー軍団の将校であると仮定して、シーザーが送ったメッセージを解読して将軍に提供する必要があります。メッセージの暗号化の方法は、メッセージの本文の各文字に対して、それぞれアルファベットの後の5番目の文字で置換することである(例えば、メッセージの本文のアルファベットAはそれぞれアルファベットFに置換する)。ニュースの原文を獲得するには、このプロセスを逆にすることです。
 
暗号文字:A B C D_E_F_H_I_J_L_M_P_Q R S_U_V_X_Z
 
译文アルファベット:V W X Y Z_A_B_D_G_H I_J_L_M_P_Q R_T_U
 
注意:アルファベットのみが置換されます。他のアルファベットではなく、メッセージの原文のすべての文字が大文字です。
Input
最大100個以上のデータセットで構成されていません。各データセットの間に空行はありません。各データセットは3つの部分から構成されています。
 
  1.スタートライン:START
 
  2.パスワードメッセージ:1から200までの文字で一行を構成し、シーザーからのメッセージを表します。
 
  3.終了行:END
最後のデータセットの後、他の行です。ENDOFINPUT
Output
各データセットは1行に対応し、シーザーのオリジナルメッセージである。
Sample Input
START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT
Sample Output
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
 
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void printPass(ArrayList<String> password) {
        for (int i = 0; i < password.size(); i++) {
            if ("START".equalsIgnoreCase(password.get(i)) || "END".equalsIgnoreCase(password.get(i))) {
                System.out.print("");
            } else {
                System.out.println(translate(password.get(i)));
            }

        }
    }

    public static String translate(String password) {
        char[] ch = password.toCharArray();
        // A 65 V86 U 85 Z 90
        for (int i = 0; i < ch.length; i++) {
            if (ch[i]>='A'&&ch[i]<='Z') {
                if ((char) (ch[i] - 5) < 'A') {
                    ch[i] = (char) (ch[i] + 21);
                } else {
                    ch[i] = (char) (ch[i] - 5);
                }
            }
        }
        return new String(ch);
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        String password = "";
        ArrayList<String> pass = new ArrayList<String>();
        while (cin.hasNext()) {
            password = cin.nextLine();
            if ("ENDOFINPUT".equalsIgnoreCase(password)) {
                printPass(pass);
            } else {
                pass.add(password);
            }
        }
    }
}
 
注:ACMがCodeを提出する時、クラス名はMainでなければなりません。