スポンサーサイト

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    Pythonでシーザー暗号実装

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    この間時間制限ありのPython問題集でシーザー暗号のプログラムを組むことがあったのですが、時間制限があるとだめだね。

    緊張して全然頭まわらない。

    プログラムの仕様としては
    • 文字列(変数名Message str型)
    • ずらす個数(変数名Key int型)
    • 暗号化した文字列(Result str型)
    • 暗号化する文字はa-zA-Zのみで,や:などの文字はそのまま表示する

    とりあえず、「文字をずらす!」ということをするので、ordで文字コードを取得して、a-zA-Zの間にあればKey分ずらすというものを書いたのだが、とても分かりづらいものになってしまった。

    後から考えてみると、
    小文字アルファベット、大文字アルファベットの文字列を用意しておき、その中から検索して、見つかればずらすとしたほうがスマートだったなと思ったので書いてみた。

    問題集では暗号化のみを扱っていたが、ついでなので複合もできるように拡張しておいた。

    import re
    
    def cryption_caesar(Message, Key, IsEncrypt):
        assert isinstance(Message, str), "Error"
        assert isinstance(Key, int), "Error"
        assert Key > -1, "Error"
        assert isinstance(IsEncrypt, bool), "Error"
        
        alf_s = "abcdefghijklmnopqrstuvwxyz"
        alf_l = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        
        result = ""
        
        if Key > 26:
            Key = Key % 26
        
        for e in Message:
            if re.search(r"[a-z]", e):
                if IsEncrypt:
                    if alf_s.find(e) + Key > 25:
                        result += alf_s[alf_s.find(e) + Key - 26]
                    else:
                        result += alf_s[alf_s.find(e) + Key]
                else:
                    if alf_s.find(e) - Key < 0:
                        result += alf_s[alf_s.find(e) - Key + 26]
                    else:
                        result += alf_s[alf_s.find(e) - Key]
            elif re.search(r"[A-Z]", e):
                if IsEncrypt:
                    if alf_l.find(e) + Key > 25:
                        result += alf_l[alf_l.find(e) + Key - 26]
                    else:
                        result += alf_l[alf_l.find(e) + Key]
                else:
                    if alf_l.find(e) - Key < 0:
                        result += alf_l[alf_l.find(e) - Key + 26]
                    else:
                        result += alf_l[alf_l.find(e) - Key]
            else:
                result += e
        
        return result
    

    cryption_caesarの3つ目の変数がTrueなら暗号化、Falseなら復号する。

    入力文字列 rin_jugatlaを暗号化すると
    sjo_kvhbumbとなる、これを復号すると
    rin_jugatlaに戻ると。

    あぁ、なぜ最初にこの方法を思いつかなかったんだろう・・・。
    assertのエラー文が雑とか、条件分岐も雑とかいろいろあるけど、まぁ動けばいいかな。
    スポンサーサイト
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。