CUBE SUGAR CONTAINER

技術系のこと書きます。

Python で ROT13 (シーザー暗号) を書いてみる

Golang で ROT13 を書いたので、ついでに Python 版も書いてみる。

blog.amedama.jp

先に断っておくと、Python の場合 ROT13 は言語に組み込みで実装があるので、本来は自分で書く必要がない。

>>> import codecs
>>> codecs.decode('Uryyb, Jbeyq!', 'rot13')
'Hello, World!'

自分で書いたバージョンは次の通り。 ジェネレータ内包表記で文字列に ROT13 を適用しているところがポイントかな。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


def _rot13(c):
    if 'A' <= c and c <= 'Z':
        # 13 文字分ずらす
        return chr((ord(c) - ord('A') + 13) % 26 + ord('A'))

    if 'a' <= c and c <= 'z':
        # 13 文字分ずらす
        return chr((ord(c) - ord('a') + 13) % 26 + ord('a'))

    # その他の文字は対象外
    return c


def rot13(s):
    # ジェネレータ内包表記で文字列に ROT13 を適用する
    g = (_rot13(c) for c in s)
    # 文字列に直す
    return ''.join(g)


def main():
    s = 'Uryyb, Jbeyq!'
    print(rot13(s))


if __name__ == '__main__':
    main()

実行結果は次の通り。

$ python rot13.py
Hello, World!

ばっちり。