08. 暗号文
与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. - 英小文字ならば(219 - 文字コード)の文字に置換 - その他の文字はそのまま出力 この関数を用い,英語のメッセージを暗号化・復号化せよ.
回答
#!/bin/usr/env python ''' # 08. 暗号文 与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. - 英小文字ならば(219 - 文字コード)の文字に置換 - その他の文字はそのまま出力 この関数を用い,英語のメッセージを暗号化・復号化せよ. ''' import re def chipher(clearText): ''' clearText内の英小文字をアルファベットの逆順の英小文字に変換する ''' chipherList = list() for c in list(clearText): if re.search(r'[a-z]', c): chipherList.append(chr(219-ord(c))) else: chipherList.append(c) return ''.join(chipherList) print(chipher('aziIUK9043')) # zarIUK9043
これより下は、上のソースを書くまでの流れ
どうやってやるか考える
- 英小文字の文字は
(219 - 文字コード)の文字に置換
- それ以外はそのまま
英小文字の文字コードを調べてみたら、以下のようになっていた
a → 97、b → 98、...、121 → y、122 → z
(219 - 文字コード)をやってみると
219-97=122 -> z、 219-98=121 → y、...、219-121=98 → b、219-122=97 → a
英小文字はアルファベットを逆順(?)にするってことがわかった(a → z、b → y...)
Pythonにはそれぞれ、変換をする関数が用意されている
処理の流れは
ord()
関数で英小文字をUnicodeコードポイントに変換chr()
関数に219-(1で取得した数値)
で暗号処理を行う。
この2つの処理を文字の1つ1つに対して行う
こちらのサイトでは小文字の判定をstr.islower()
メソッドで行っていた
また、色々判定するメソッドがあるらしいため、メモしておく
- islower()
- isupper()
- isalpha()
- isdigit()
- isalnum()
str.islower()
文字列に英大文字が含まれていない場合、Trueを返すメソッド
日本語が入っていても無視されているようにみえる
>>> 'aaa'.islower() True >>> 'a1a'.islower() True # 数値が入っていても問題なし >>> 'a1A'.islower() False >>> 'a1Aあ'.islower() False >>> 'a1aあ'.islower() True
str.isupper()
文字列に英小文字が含まれていない場合、Trueを返すメソッド
日本語が入っていても無視されているようにみえる
>>> 'AAA'.isupper() True >>> 'A1A'.isupper() True >>> 'A1a'.isupper() False >>> 'A1aあ'.isupper() False >>> 'A1Aあ'.isupper() True
str.isalpha()
アルファベットのみの場合、Trueを返すメソッド
日本語が入っていても無視されているようにみえる
>>> 'alp'.isalpha() True >>> 'alP'.isalpha() True >>> 'a1P'.isalpha() False >>> 'alPあ'.isalpha() True
str.isdigit()
数値のみの場合、Trueを返すメソッド
日本語が無視されない!?
>>> '123'.isdigit() True >>> '12a'.isdigit() False >>> '12A'.isdigit() False >>> '123あ'.isdigit() False
str.isalnum()
英数字のみの場合、Trueを返すメソッド
>>> '12a'.isalnum() True >>> '12A'.isalnum() True >>> '12Aa'.isalnum() True >>> '12Aaあ'.isalnum() True >>> '12Aaあ&'.isalnum() False