python勉強9日目 chr()関数・ord()関数/シーザー暗号
コンピューターは数字はそのまま扱うことができるが、文字(や記号など)は直接扱うことができない。(?いまいちよく理解できない。この文章に使われている文字は一体何なのか。)
そこで、文字に数字を割り当てて、数字を介して文字などを扱えるのがchr()関数、逆に文字などを介して数字を扱えるのがold()関数。
どの文字などにどの数字が割り当てられているかは以下のサイトで確認可能。
アルファベットに限ると
A〜Zまでが65〜90
a〜zまでが97〜122
が割り振られている。
chr()関数
chr関数は例えば
print(chr(65))
# A
このように使う。
65番が割り振られた文字(など)を出力するという意味だ。
65番はAが割り振られているのでAが出力される。
ord()関数
ord()関数は
print(ord("A"))
# 65
のように使う。
文字列をクオテーションで囲み忘れないように注意。
ord()関数をfor文・range関数と組み合わせた後、chr()関数で型変換して出力することでアルファベットを順に出力できる。
for i in range (ord("A"),ord("Z") + 1 ))
print(chr(i))
#A
#B
…
#Z
上記コードをord()関数を使わずに書くとこうなる
for i in range (65,90 + 1):
print(chr(i))
"A"〜"Z" + 1までの数字(65〜90 + 1)をrangeとして変数iに代入し
変数iの値をchr()関数で文字に変換して出力している。
rangeの範囲(stop値)で+1しているのは、stop値に書いた値は変数に代入されないからだ。
for i in range(1,10):
print(i)
#1
#2
#3
#4
#5
#6
#7
#8
#9
シーザー暗号
chr()関数、ord()関数の使用例としてはシーザー暗号の作成・解読がある。
シーザー暗号とは、簡単に言うとアルファベットを3個前にズラしたもの。
ただし、ABC(abc)に関しては3個前にズラせないため、XYZ(xyz)にズラすものとする。
例えば「iPhone」をシーザー暗号化するには、最初の文字「i」の3つ前のアルファベットは「f」、2つ目の文字「P」の3つ前のアルファベットは「M」という風にずらしていく。すると「fMelkb」となる。これがシーザー暗号。
文字(アルファベット)に数字が割り当てられていることを利用して、まずアルファベットを数字に変換。数字から3引いてそれを再度文字(アルファベット)に変換して出力すればシーザー暗号の完成だ。
ただし、「ABC(abc)」に関しては、数字に変換後3引いて再度文字に変換するとアルファベットでは無くなってしまう。
そこで、これらのアルファベットの場合は、XYZ(xyz)にするコードを手動で書く。
S = input() #入力を受け取り、変数Sに代入する
def seather(c):
if c == "A":
return "X"
elif c == "B":
return "Y"
elif c == "C":
return "Z"
elif c == "a":
return "x"
elif c == "b":
return "y"
elif c == "c":
return "z"
else:
return chr(ord(c)-3)
code = ""
for c in S:
code += seather((c))
print(code)
そうしてできるのが上記のコード。
逆に、解読したい場合は文字(アルファベット)を数字に変換後3を足して再度、文字に変換して出力するコードを書けばいい。
つまりこうだ。
S = input() #入力を受け取り、変数Sに代入する
def seather(c):
if c == "X":
return "A"
elif c == "Y":
return "B"
elif c == "Z":
return "C"
elif c == "x":
return "a"
elif c == "y":
return "b"
elif c == "z":
return "c"
else:
return chr(ord(c)+3)
code = ""
for c in S:
code += seather((c))
print(code)
この記事が気に入ったらサポートをしてみませんか?