Pythonで簡単なデコーダリングを作ろうとしています。
例:
a=b, `b=c, c=d, etc.
スクリプトがエンコードされたメッセージを取得し、デコードされたメッセージを出力するようにします。
たとえば、入力"ifmmp"
すると出力されます"hello"
。
すべての文字を分割してループし、chr()
またはord()
値を変更する必要があると考えていました。
これに関するPythonのドキュメントはないようです。
Pythonで簡単なデコーダリングを作ろうとしています。
例:
a=b, `b=c, c=d, etc.
スクリプトがエンコードされたメッセージを取得し、デコードされたメッセージを出力するようにします。
たとえば、入力"ifmmp"
すると出力されます"hello"
。
すべての文字を分割してループし、chr()
またはord()
値を変更する必要があると考えていました。
これに関するPythonのドキュメントはないようです。
どうですか:
s = 'ifmmp'
new_s = ''
for c in s:
n = ord(c)
n = n - 1
if n < ord('a'):
# 'a' -> 'z'
n = ord('z')
new_s += chr(n)
# print('new_s = %r' % new_s) -> new_s = 'hello'
もちろん大文字ではなく小文字のみの扱いです。
ループを忘れて、可能な限り Python に組み込まれている機能を使用します。
from string import maketrans, translate, ascii_lowercase
import functools
translation = maketrans(ascii_lowercase, ascii_lowercase[-1]+ascii_lowercase[:-1])
decipher = functools.partial(string.translate, table=translation)
print(decipher("ifmmp")) # 'hello'
from string import maketrans
table = maketrans('abcdefghijklmnopqrstuvwxyz/','zabcdefghijklmnopqrstuvwxy ')
for x in ('pdfbo','qipophsbqi','cmvf/nppo/jo/b/sfe/tlz'):
print x,' -> ',x.translate(table)
結果
pdfbo -> ocean
qipophsbqi -> phonograph
cmvf/nppo/jo/b/sfe/tlz -> blue moon in a red sky
.
Joachim (function better() ) のアルゴリズムを書き直し、 maketrans() ( yop() )を使用しない独自のソリューションを作成しました。
s = '{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'
def bof(s):
new_s = ''
for c in s:
n = ord(c)
n = n - 1
if n < ord('a'):
# 'a' -> 'z'
n = ord('z')
new_s += chr(n)
return new_s
def better(s):
li = []
for c in s:
n = ord(c)-1
if n == 96:
li.append('z')
elif 96<n<122:
li.append(chr(n))
else:
li.append(c)
return ''.join(li)
def yop(s):
gen = ((c,ord(c)-1) for c in s)
return ''.join('z' if y==96 else chr(y) if 96<y<122 else x for x,y in gen)
def better_yop(s):
def gen(h):
for c in h:
n = ord(c)-1
if n == 96:
yield 'z'
elif 96<n<122:
yield chr(n)
else:
yield c
return ''.join(gen(s))
for truc in (s,bof(s),better(s),yop(s),better_yop(s)):
print '%r\n%s\n' % (truc,truc)
結果
'{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'
{ifmmp} cmvf-nppo
SUNNY ~ ajhabh 14568
'zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz'
zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello} blue-moon
SUNNY ~ zigzag 14568
ただし、私の関数yop()は関数better()よりも遅いです
.
これで、関数better_yop()の速度はbetter()の速度と同等になりましたが
、better()はbetter_yop()よりわずかに速いようです。こちらもシンプルなのでbetter()がベスト
デコーダリングを辞書にすることをお勧めします。次に、読み取り用に入力ファイルを開き、ファイルを読み取り、一度に 1 文字ずつループし、辞書を使用して出力文字列に変換します。最後に、その文字列をファイルに書き込みます。