面白そうな問題があったので、PowerShellを使って解いてみました。
練習問題 - プログラミングスレまとめ in VIP
Caesar暗号解読
※ シーザー暗号って何?って方はこちら
■問題
Caesar暗号を解読するプログラムを作り,暗号を解読してください。 暗号鍵(何文字ずらすか)は不明ですが、文字列に"person"が含まれることがわかっています。
■暗号文
"qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi.qbubu zir -ibtqi-qp-qaai ripmymsqkir -ibtqi-qy dmxi ri.cnxuoi rruoumxakir -ibtqiqzmobyqzbkii-q.qmxi -imyqzpyqzbi rixmeaki -puzmzoqai -i-qscxmbu zaimzpir -i btq-iymbbq-a;iz -iatmxximzgi.q-a zinqiuzimzgiemgipuao-uyuzmbqpimsmuzabir -ia. za -uzsiacotiimi.qbubu zj" (最初と最後のダブルクォートは除く)
■使用される文字列
"abcdefghijklmnopqrstuvwxyz .,-" (ダブルクォートは除く。空白もあります。注意してください。暗号文にセミコロン";"が含まれています。これは置換するべき文字列に含まれていないので、そのままにしてください。)
最小単位の処理から考えてみる。
・入力
1バイトの文字 a
・処理
a が辞書に含まれる文字の場合、1つ後ろの文字に置換
・出力
置換した文字 a
単一の文字に対して辞書順に1つずらす処理を行うスクリプトを作るとこんな感じ
=======<Read-Caesar_char.ps1>========
param(
$char
)
# 使用する文字列
$dictionary = "abcdefghijklmnopqrstuvwxyz .,-"
if ($char -eq $dictionary[-1]){
# 入力された文字が使用する文字列の最後の文字だった場合先頭の文字に置換
$char = $dictionary[0]
}elseif ($dictionary.IndexOf($char) -eq -1){
# 入力された文字が使用する文字列に含まれない場合処理をしない
}else{
# それ以外の場合、文字を使用する文字列の1つ後の文字に置換
$char = $dictionary[($dictionary.IndexOf($char) + 1)]
}
Write-Output $char
=======<Read-Caesar_char.ps1>========
次はforステートメントを使って文字列に対して行う