12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonでアルファベット文字列をN文字分ずらす

Last updated at Posted at 2020-03-30

AtCoderのABC146 B問題で、Unicodeに慣れ親しむ機会がありました。

アルファベット文字列を「N文字分ずらす」とは「アルファベット順でN文字後ろのものに変換する」動作を表し、'Z'の次は'A'に戻るとします。上述のB問題でも同様の定義です。

組み込み関数ord()chr()

Python3には組み込み関数ord()chr()が実装されており、文字とそのUnicodeコードポイントを互いに変換して返してくれます。
参考:[Python3.8公式ドキュメント#ord]
(https://docs.python.org/ja/3/library/functions.html#ord)

sample
>>> ord('A')
65
>>> ord('D')
68

>>> chr(65)
'A'
>>> chr(70)
'F'

分かったように「Unicodeコードポイント」とか言ってますが、「いろんな文字記号を数字と1対1対応させて表してる世界なんやな」ぐらいの認識で突破です。
日本語が、とかいろんな表し方が、とかは奥が深い世界なので良さそうな本に丸投げします。

どうやら大文字のアルファベットに関しては'A'がコード65で、そこから10進数の連番になっていますね。
ちなみに大文字と小文字の間には

sample

>>> ord('Z')
90
>>> chr(91)
'['
>>> chr(92)
'\\'
>>> chr(93)
']'
>>> chr(94)
'^'
>>> chr(95)
'_'
>>> chr(96)
'`'
>>> chr(97)
'a'

と、いくつか記号が挟まってました。へー。

実装の注意点

引数でお気づきかもしれませんがord()chr()も一文字の変換を想定しています。
文字列Sを変換する際には空文字列''に、for文で一文字づつ変換しては結合してを繰り返します。

そして'Z'から'A'に戻る時も考慮するため、元の文字コードポイントにN加えた整数を26で割った余りを、'A'のコードポイントに足し合わせることで変換後の文字コードポイントを算出します。

rot_n.py

def rot_n(s, n):
    answer = ''
    for letter in s:
        answer += chr(ord('A') + (ord(letter)-ord('A')+n) % 26)

    return answer

確認してみます。

test_rot

>>> rot_n('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 13)
'NOPQRSTUVWXYZABCDEFGHIJKLM'

AtCoder B問題での提出はコチラ↓

b.py

def rot_n():
    n = int(input())
    s = input()

    answer = ''
    for letter in s:
        answer += chr(ord('A') + (ord(letter)-ord('A')+n) % 26)

    print(answer)


if __name__ == '__main__':
    rot_n()

ちなみに変換後の文字列Sを元に戻す(N文字前にずらす)関数は

derot_n.py

def derot_n(s, n):
    answer = ''
    for letter in s:
        answer += chr(ord('Z') - (ord('Z')-ord(letter)+n) % 26)
        
    return answer

となります。

test_derot

>>> derot_n('NOPQRSTUVWXYZABCDEFGHIJKLM', 13)
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

雑記:ROT N?

冒頭で書いたAtCoderの問題で知りました。
13文字後ろにずらす簡単な暗号であるROT13を一般化してたんですね。

12
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?