(追記)fsdさんからコメントをいただき、それを参考にしたら、3行でコードが書けた。下のコメント欄に載せました。
(元記事)
ITエンジニア向け転職・就活・学習サービスサイトのスキルチェック問題に挑戦するなかで、「単一換字式暗号」がでてきた。(単一換字式暗号については、ググってください。)
最初に提出したコードはfor
、if
を多用していたので、満足のいくものはでなかった。そこで何種類か考えたなかで、次のコードは初心者なりにうまくできたと思った。
plain = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz' # 平字
cipher = 'czQPHLsU rneVdEKfvyWSwIGCZqgoFBxtTiklDaOJRjNbAhmYMupX' # 暗字
# 換字表の作成
table = [i for i in range(128)]
for i in range(len(plain)):
table[ord(plain[i])] = ord(cipher[i])
# 暗号化
text = ''
for c in input():
text += chr(table[ord(c)])
print(text)
# 入力例
# This is a pen
# 出力例
# WikAqkAqgqjxJ
(復号するときは、7行目のplain
とcipher
を入れ替えて、table[ord(cipher[i])] = ord(plain[i])
に変更する。)
しかし、@KatsunoriNakamuraさんの「Pythonのテキスト作りました」からテキストをダウンロードさせていただき、勉強するなかで、str.maketrans()
とstr.translate()
を使えば、4行でコードが書けることに気づきました。自己流はだめですね。
plain = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz' # 平字
cipher = 'czQPHLsU rneVdEKfvyWSwIGCZqgoFBxtTiklDaOJRjNbAhmYMupX' # 暗字
table = str.maketrans(plain, cipher) # 換字表
print(input().translate(table)) # 暗号化
(やはり、復号するときは、3行目のplain
とcipher
を入れ替えて、table = str.maketrans(cipher, plain)
に変更する。)