2018年01月31日

言語処理100本ノックでPython入門 #08 - 文字と数字の相互変換

   このエントリーをはてなブックマークに追加 Clip to Evernote

言語処理100本ノック 2015
の問題08を解きました。

■ 問題 
08. 暗号文
与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
・英小文字ならば(219 - 文字コード)の文字に置換
・その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.



■ 書いたコード
def cipher(s):
    r = ''
    for c in s:
        r += chr(219 - ord(c)) if c.islower() else c
    return r

def main():
    x = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
    r = cipher(x)
    print(r)
    print(cipher(r))

main()

■ 実行結果
Nld I mvvw z wirmp, zoxlslorx lu xlfihv, zugvi gsv svzeb ovxgfivh rmeloermt jfzmgfn nvxszmrxh.
Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.

なるほど。
'a'のコードが10進数で97, 'z'のコードが10進数で122なので、219(=97+122)から引けば、a-zの英小文字が逆転して、z-aの英小文字に変換されるんですね。
で、同じ操作をすれば、元に戻るということですね。
まあ、すぐに解読できちゃうのでまったく実用的ではないですが...


■ 今回学んだこと

文字を数字に変換
ord(c)

数字を文字に変換
chr(n)
文字列の連結

C#と同じですね。
s += additional

条件式

他の言語の三項演算子の代わりですね。条件式と言うらしいです。
x if c else y
上のコードで条件Cが成り立てばx、成り立たなければyがその式の値になります。