コンピューターサイエンス入門:理論編
コード → 文字
この回でやること
番号から文字への対応を読み解き、アルファベットを余りで折り返す計算を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
番号は出せても、画面には出せない
前回は文字に対応する番号を見ました。計算した結果の68を人に見せても、それが D と分かるとは限りません。番号を文字に戻す道具も対にして考えます。
対応表の同じ場所を逆向きに読む点は、そのとおりです。ただし、計算した番号が想定した文字の範囲に入っているかも確かめます。文字を返せても、欲しい文字とは限りません。
往復させると、元へ戻る
Pythonでは ord が文字を番号へ、chr が番号を文字へ変えます。ここでは1つのUnicodeの番号で表せる文字を扱います。
Python
print(ord('D')) # 68
print(chr(68)) # D
print(chr(ord('D'))) # D有効な番号と文字の間で往復すれば、元へ戻ります。途中の計算を整数として追えるのが利点です。A の65に0から25を足すと、A から Z の26文字になります。
現場の話 Excelの列名も、AからZを並べたあとAAへ進みます。番号と文字を対応させる考え方は共通ですが、Zの次をAへ戻す規則とは違います。
対応はASCIIの外にもあります。chr(0x3042) の結果は あ です。0x は16進数の印で、0x3042は10進数で12354です。ただし、この番号とUTF-8で保存するバイトの並びは別です。
26で折り返す
文字をずらす暗号を読みます。A を3つ進めるなら、65 + 3 = 68で D です。ところが Z の90に3を足すと93になり、] の記号になります。アルファベットの中だけで進めたいなら、折り返しが必要です。
A を0番目とし、そこからの距離に移動量を足します。それを26で割った余りにして、最後に65を足します。Pythonの % は割り算の余りを求める記号です。
Python
base = 65
position = 23 # XはAから23番目
print((position + 3) % 26) # 0
print(chr(base + (position + 3) % 26)) # A23 + 3 = 26、26を26で割った余りは0なので、先頭へ戻ります。
戻せる番号と、欲しい範囲は別
chr(93) はエラーにならず記号を返します。道具は「英大文字が欲しかった」という意図までは知りません。負の数など、道具が受け付けない値もあります。
例題で確かめる
Y を4文字先へずらします。Y は A から24番目なので、24 + 4 = 28です。28を26で割った余りは2。65 + 2 = 67を文字に戻すと C です。輪の中をY、Z、A、B、Cと4歩進んでも、同じ結果になります。