はじめに
競プロとかアルゴリズムのお勉強をしていると、文字列をleet文字列に変換するプログラムを書く機会がありました。ちょっと調べてみるだけでも6通りほどの書き方を見つけて、結構知らない知識を得られたので備忘録として記事に残します。
leet文字とは
以下の表の変換規則に則って文字列を書き換えるものです。簡単にいうとアルファベットを似た形の別の文字に置き換えることです。
入力文字 | 変換後文字 |
---|---|
O | 0 |
I | 1 |
Z | 2 |
E | 3 |
A | 4 |
S | 5 |
G | 6 |
T | 7 |
B | 8 |
P | 9 |
実装
実装1 : 力技
s = str(input())
ans = ''
for i in s:
if i == 'O':
ans += '0'
elif i == 'I':
ans += '1'
elif i == 'Z':
ans += '2'
elif i == 'E':
ans += '3'
elif i == 'A':
ans += '4'
elif i == 'S':
ans += '5'
elif i == 'G':
ans += '6'
elif i == 'T':
ans += '7'
elif i == 'B':
ans += '8'
elif i == 'P':
ans += '9'
else:
ans += i
print(ans)
多分一番最初に思いつくであろうif文でゴリ押す方法です。
実装2 : リストとreplaceを用いる。
s = str(input())
leets = [['O', '0'],['I', '1'],['Z', '2'],['E', '3'],['A','4'],['S', '5'],['G', '6'],['T', '7'],['B','8'],['P','9']]
for leet in leets:
s = s.replace(leet[0], leet[1])
print(s)
リストに対応関係を入れてそれをreplaceを用いて入力された文字列に対して適応していく方法です。
僕が最初に書いたのはこれでした。
実装3 : 辞書とtranlateを用いる。
s = str(input())
leets = {'O': '0', 'I': '1', 'Z': '2', 'E': '3', 'A':'4', 'S': '5', 'G': '6', 'T': '7', 'B':'8', 'P':'9'}
s = s.translate(str.maketrans(leets))
print(s)
実装4 : joinとget、内包表記
s = str(input())
leets = {'O': '0', 'I': '1', 'Z': '2', 'E': '3', 'A':'4', 'S': '5', 'G': '6', 'T': '7', 'B':'8', 'P':'9'}
s = ''.join(leets.get(i, i) for i in s)
print(s)
get(a, b)はaで指定したものがkeyとして存在していればvalueを、存在していなかったらbの値を返す辞書型のメソッドです。
実装5 : mapと自作関数
def make_leet(c):
leets = {'O': '0', 'I': '1', 'Z': '2', 'E': '3', 'A':'4', 'S': '5', 'G': '6', 'T': '7', 'B':'8', 'P':'9'}
return leets.get(c, c)
s = str(input())
s = ''.join(list(map(make_leet, s)))
print(s)
実装6 : lambda式を使う方法
実質5番と同じ。
s = str(input())
leets = {'O': '0', 'I': '1', 'Z': '2', 'E': '3', 'A':'4', 'S': '5', 'G': '6', 'T': '7', 'B':'8', 'P':'9'}
s = ''.join(list(map(lambda c: leets.get(c, c), s)))
print(s)
最後に
他にも実装方法はあるかと思うので、面白いものがあればコメント等で教えてください〜!!