こんにちはー!ニアです。
今回は、私が所属している研究室の研究分野に関連して、俳句をシーザー暗号化してしまうプログラムを作成してみました。
1. シーザー暗号とは
暗号といってもいろいろ種類がありますが、ここでは古代ローマの軍事的指導者ガイウス・ユリエル・カエサル氏が使用していたシーザー暗号(Caesar cipher)を使用していきます。
シーザー暗号とは換字式暗号の1つであり、平文の各文字を辞書順(コンピューター上では、文字コードの順)に3文字ずつずらしていく暗号方式です。ずらす文字数は3以外でもよく、例えば13文字ずつずらすROT13などがあります。
暗号文から平文へ復号するには、ずらした文字数分だけ逆方向にずらせばOKです。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain( int argc, _TCHAR* argv[] ) {
string p, e, d;
cout << "平文 :";
cin >> p;
// 平文をシーザー暗号化します。
for( string::iterator i = p.begin(); i != p.end(); i++ )
e += *i + 3;
cout << "暗号文:" << e << endl;
// 暗号文から平文に復号します。
for( string::iterator i = e.begin(); i != e.end(); i++ )
d += *i - 3;
cout << "復号文:" << d << endl;
return 0;
}
プログラムの動作としては 、文字列をイテレーターで1文字ずつ取り出して(取り出した文字はchar型です)、暗号化・復号しています。
2. F#で俳句をシーザー暗号化してみました
お次は、F#で俳句を暗号化するプログラムを作っていきます(C++の標準入力では半角スペースの扱いがちょっと煩わしいので・・・)。
[<EntryPoint>]
let main argv =
// 入力した俳句をシーザー暗号化します。
// 但し、区切り文字として、半角スペースとカンマはそのままにします。
printf "平文 :"
System.Console.ReadLine()
|> String.map( fun c -> if c = ',' || c = ' ' then c else c + char( 3 ) )
|> printfn "暗号文:%s"
0
※GitHubではこちらです → https://gist.github.com/Nia-TN1012/3892f08bb0641bcb09d4
動作としては、コンソール画面から入力した俳句をString.map関数で各文字(char型)をずらしていき、暗号文を表示します。但し、句の区切り文字として、半角スペースとカンマはそのままにしています。
松尾芭蕉さんの「初桜折しも今日はよき日なり」をシーザー暗号化すると、「删桟抛ず・・・ゅ・・・」
※「初」(文字コード:0x521D)を3文字分ずらした文字は「删」(文字コード:0x5220)でした。
こちらに、paiza.IOで作成したプログラムのブログパーツを埋め込みました。
入力欄に俳句(カンマ区切り)を入力して実行ボタンをクリックすると、暗号化した文字列が出力されます。
色々な俳句をシーザー暗号化したら、面白い文字列が出てくるかも。
[END]
コメント