フレッシャーズの皆さん、教育担当の皆さんジャンボ!!!!
最近、全然ブログ書けてなかった。。。
今回は、連想配列を使ってほしくてROT13という単換字式暗号(シーザー暗号)を課題として出してみました。
課題
/**************************************************
* 課題2: ROT13関数を作成
*
* ・起動引数で入力した文字列をROT13の仕様で暗号化する
* https://ja.wikipedia.org/wiki/ROT13
* ・str_rot13は、使ってはなりませぬ
* ・try-catch、throw Exceptionを使用する
**************************************************/
私が書いた模範?解答です
<?php
try {
// エラーチェック
if (!isset($argv[1])) {
throw new Exception('引数が不正です');
}
echo "IN : \n";
echo "OUT: ".new_rot13($argv[1])."\n";
} catch (Exception $e) {
// 異常終了
echo "*** Error: ".$e->getMessage()."\n";
exit(1);
}
// 正常終了
exit(0);
// ROT13
function new_rot13($in) {
// 変換テーブル
$_convert_table = [
'a' => 'n', 'b' => 'o', 'c' => 'p', 'd' => 'q', 'e' => 'r',
'f' => 's', 'g' => 't', 'h' => 'u', 'i' => 'v', 'j' => 'w',
'k' => 'x', 'l' => 'y', 'm' => 'z', 'n' => 'a', 'o' => 'b',
'p' => 'c', 'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g',
'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 'y' => 'l',
'z' => 'm',
'A' => 'N', 'B' => 'O', 'C' => 'P', 'D' => 'Q', 'E' => 'R',
'F' => 'S', 'G' => 'T', 'H' => 'U', 'I' => 'V', 'J' => 'W',
'K' => 'X', 'L' => 'Y', 'M' => 'Z', 'N' => 'A', 'O' => 'B',
'P' => 'C', 'Q' => 'D', 'R' => 'E', 'S' => 'F', 'T' => 'G',
'U' => 'H', 'V' => 'I', 'W' => 'J', 'X' => 'K', 'Y' => 'L',
'Z' => 'M',
];
try {
$ary = str_split($in);
$out = "";
foreach ($ary as $chr) {
if (preg_match('/[a-zA-Z]/', $chr)) {
$out .= $_convert_table[$chr];
} else {
$out .= $chr;
}
}
return $out;
} catch(Exception $e) {
throw $e;
}
}
?>
動作検証
$ php ./rot13.php asdhfakj34829sakjfkdjah
asdhfakj34829sakjfkdjah
nfqusnxw34829fnxwsxqwnu
$ php ./rot13.php AAAAAAA111111KJAFDHJKjsahfkjsahsf1892341579
AAAAAAA111111KJAFDHJKjsahfkjsahsf1892341579
NNNNNNN111111XWNSQUWXwfnusxwfnufs1892341579
$ php ./rot13.php あいうえお
あいうえお
あいうえお
$ php ./rot13.php あいうえおsaldkjfalsdkjfJKFDLKJ47588738
あいうえおsaldkjfalsdkjfJKFDLKJ47588738
あいうえおfnyqxwsnyfqxwsWXSQYXW47588738
現場からは以上です。