Coding_Gamesメモ_Encryption_Decryption_of_Enigma_Machine

javaの学習にCoding_Games を知り、学習の記録としてメモ。
To debug:

System.err.println( );

を使うとデバックしやすくなる。(エラー出力は評価に影響しない)

内容

第2次大戦中、ドイツで使われた暗号方式 Enigma に似た方法で暗号化、復号化を行う。

ルール

入力された文字はシフト数+N(0~1文字ごとに+1)分移動する。
例 入力文字 AAA シフト数= 4
A + 4 + 0 → E
A + 4 + 1 → F
A + 4 + 2 → G

次に3回ローターを使い文字を置換する
例 ローター BDFHJLCPRTXVZNYEIWGAKMUSQO

ABCDEFGHIJKLMNOPQRSTUVWXYZ
BDFHJLCPRTXVZNYEIWGAKMUSQO

EFG → JLC

インプット

1行目 "ENCODE"(暗号化) か "DECODE"(復号化)
2行目 シフト数
3行目 ローター1
4行目 ローター2
5行目 ローター3
6行目 暗号化、復号化を行う文字列

使用したクラス

String

(boolean) = String.equals(x);
String == x String は == では判定できないので代わりに使用する。

(int) = String.indexOf( x )
文字列の前方からxを探し、前方から数えて何文字目かを出力(見つからなかったら-1 を出力)

(char) = String.charAt( x )
x はint、 x番目の文字を出力

StringBuilder

(char) = StringBuilder.charAt( x )
x はint、 x番目の文字を出力

(int) = StringBuilder.length()
文字数を出力

考え方
暗号化と復号化を分けて考える
暗号化は英語で詳細な手順が説明されているのでそのとおりにプログラムする
文字のシフト部分はそのままではアルファベットの数を超えてしまうので、余りの計算(%)を行う

復号化は暗号化の手順を逆に行う
文字のシフト部分がマイナスになることがあるので注意が必要

Coding_Games:https://www.codingame.com/
String (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html
StringBuilder (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/StringBuilder.html