Python 100本ノックを始めました。 8本目

経緯

Pythonのコードを書く練習がしたかったので、以下の100本ノックを始めることにしました。 全部をやるかはわかりませんが、コツコツやっていきたいと思います。

ブログには、少し詰まった個所などをアウトプットしていきます。

08. 暗号文

問題

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

イメージした処理の流れ

①対象の文字列をリスト化
②英子文字のみに絞るためフィルター
③英子文字の暗号化
④暗号化した文字を複合化
⑤複合化した文字を文字列として再生成

作成したコード

import string

def cipher(n):
    #変数
    str_list = []
    enc_str =""

    #暗号化対象の文字列をリストに追加(①)
    for x in n:
        str_list.append(x)

    #暗号化
    for x in range(len(str_list)): 
        #英小文字のみフィルターし、暗号化→複合化
        if str_list[x] in string.ascii_lowercase: #(②) 
            str_list[x] = chr(219 - ord(str_list[x])) #(③,④)
    
    #文字列を生成(⑤)
    print("".join(str_list))

cipher("あAa1Bb2Cc3Dd4Ee5いFf6Gg7Hh8Ii9Jj10うKk11Ll12Mm13Nn14Oo15えPp16Qq17Rr18Ss19Tt20おUu21Vv22Ww23Xx24Yy25Zz26")

実行結果

あAz1By2Cx3Dw4Ev5いFu6Gt7Hs8Ir9Jq10うKp11Lo12Mn13Nm14Ol15えPk16Qj17Ri18Sh19Tg20おUf21Ve22Wd23Xc24Yb25Za26

感想

そもそも問題文の「英小文字ならば(219 - 文字コード)の文字に置換 」が理解できなくて、219に該当する文字コードは何かを調べていました。

認識の間違いに気が付いても、次は複合化の意味を取り違えて、折角暗号化した文字列を元の状態に戻して出力させようとしていました。。

他には、処理の③,④で使用している ordchrアスキーコード(ascii)から文字列へ相互に変換できることは知りませんでした。勉強になりました。