TIL

Today I Leaned. 仕事で知ったことや、つまづいたことを時間のある時にメモしておく

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にはそれぞれ、変換をする関数が用意されている

処理の流れは

  1. ord()関数で英小文字をUnicodeコードポイントに変換
  2. 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

言語処理100本ノック 2015


参考文献