如何使shift('w','f')return'b'?
How to make shift('w','f') return 'b'?
使用此程序去除空格、标点符号并将字母变为小写...
def pre_process(s): #Enter: "Jim's secret password."
s= s.replace("'","")
s= s.replace('.','')
s= s.lower()
s= s.replace(" ","")
return s
如何加密消息,使每个字母的移动量等于字母表中的相应字母?例如 m 移位 5 次变成 r,但是 w 移位 5 次变成 b。这是我当前的代码:
def shift(ch,k):
return chr(ord('a')+(ord(ch)-ord('a')+k) % 26)
你改变了问题。
按照老问题:How to make shift('w','f') return 'b'?
- 从 alpha
a
中获取第二个参数的差异,代码是 diff = a2-start
- 第一个参数相差得到下一个值,代码为
next = a1+diff
- 检查下一个值是否大于 alpha
z
。
- 如果不大于
z
,则新值是下一个值。
- 如果大于则从 alpha 获取新值
a
- Return值字符。
代码:
def shift(ch,k):
start = ord("a")
end = ord("z")
a1 = ord(ch)
a2 = ord(k)
diff = a2-start
print "\ndiff:", diff
next = a1+diff
print "next value:", next
if next>end:
new = next-end-1
print "new1:", new
new = start + new
else:
new = next
print "new value:", new
return chr(new)
rs = shift("w", "f")
print "w and f:", rs
rs = shift("e", "b")
print "e and b:", rs
rs = shift("z", "b")
print "z and b:", rs
rs = shift("x", "b")
print "x and b:", rs
输出:
vivek@vivek:~/Desktop/Whosebug$ python 26.py
diff: 5
next value: 124
new1: 1
new value: 98
w and f: b
diff: 1
next value: 102
new value: 102
e and b: f
diff: 1
next value: 123
new1: 0
new value: 97
z and b: a
diff: 1
next value: 121
new value: 121
x and b: y
vivek@vivek:~/D
def shift(ch, k):
return chr(ord('a') + ((ord(ch) - ord('a')) +
(ord(k) - ord('a'))) % 26)
某种解释:
def shift(ch, k):
#
# k_delta
# ────>
#
# ch_delta k_delta
# ────────────────────────>────>
# a....f.........m....r....w..zab
# ──────────────>────> ┊
# ch_delta k_delta ┊
# ┊
# %26
ch_delta = ord(ch) - ord('a')
k_delta = ord(k) - ord('a')
return chr(ord('a') + (ch_delta + k_delta) % 26)
除非k
有所不同,否则您可以使用str.translate
来加速加密:
import string
message = 'mw'
key = 'f'
enc_table = string.maketrans(
string.ascii_lowercase,
''.join(shift(c, key) for c in string.ascii_lowercase)
)
message.translate(enc_table) # -> 'rb'
例如,我还建议将 magic number 26
替换为 len(string.ascii_lowercase)
。
解密可以使用相同的函数,但使用不同的密钥。它们之间的关系是enc_delta + dec_delta = 0 modulo 26
。由此得出 dec_delta = -enc_delta % 26
。因此:
dec_k = chr(ord('a') + ((ord(enc_k) - ord('a'))) % 26)
Decrytion/Encryption Python
代码:
def shift(ch, k):
return chr(ord('a') + ((ord(ch) - ord('a')) + (ord(k) - ord('a'))) % 26)
def reshift(ch, k):
tmp = (ord(ch) - (ord(k) - ord('a')))
if tmp<ord('a'):
tmp = ord("a") +(26 - (ord("a") - tmp))
return chr(tmp)
print "w and f:"
re = shift("w", "f")
print "Encryption:", re
re = reshift(re, "f")
print "Decrytion:", re
print "----------"
print "e and b"
re = shift("e", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
print "----------"
print "z and b"
re = shift("z", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
print "----------"
print "x and b"
re = shift("x", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
输出:
vivek@vivek:~/Desktop/Whosebug$ python 26.py
w and f:
Encryption: b
Decrytion: w
----------
e and b
Encryption: f
Decrytion: e
----------
z and b
Encryption: a
Decrytion: z
----------
x and b
Encryption: y
Decrytion: x
vivek@vivek:~/Desktop/Whosebug$
使用此程序去除空格、标点符号并将字母变为小写...
def pre_process(s): #Enter: "Jim's secret password."
s= s.replace("'","")
s= s.replace('.','')
s= s.lower()
s= s.replace(" ","")
return s
如何加密消息,使每个字母的移动量等于字母表中的相应字母?例如 m 移位 5 次变成 r,但是 w 移位 5 次变成 b。这是我当前的代码:
def shift(ch,k):
return chr(ord('a')+(ord(ch)-ord('a')+k) % 26)
你改变了问题。
按照老问题:How to make shift('w','f') return 'b'?
- 从 alpha
a
中获取第二个参数的差异,代码是diff = a2-start
- 第一个参数相差得到下一个值,代码为
next = a1+diff
- 检查下一个值是否大于 alpha
z
。 - 如果不大于
z
,则新值是下一个值。 - 如果大于则从 alpha 获取新值
a
- Return值字符。
代码:
def shift(ch,k):
start = ord("a")
end = ord("z")
a1 = ord(ch)
a2 = ord(k)
diff = a2-start
print "\ndiff:", diff
next = a1+diff
print "next value:", next
if next>end:
new = next-end-1
print "new1:", new
new = start + new
else:
new = next
print "new value:", new
return chr(new)
rs = shift("w", "f")
print "w and f:", rs
rs = shift("e", "b")
print "e and b:", rs
rs = shift("z", "b")
print "z and b:", rs
rs = shift("x", "b")
print "x and b:", rs
输出:
vivek@vivek:~/Desktop/Whosebug$ python 26.py
diff: 5
next value: 124
new1: 1
new value: 98
w and f: b
diff: 1
next value: 102
new value: 102
e and b: f
diff: 1
next value: 123
new1: 0
new value: 97
z and b: a
diff: 1
next value: 121
new value: 121
x and b: y
vivek@vivek:~/D
def shift(ch, k):
return chr(ord('a') + ((ord(ch) - ord('a')) +
(ord(k) - ord('a'))) % 26)
某种解释:
def shift(ch, k):
#
# k_delta
# ────>
#
# ch_delta k_delta
# ────────────────────────>────>
# a....f.........m....r....w..zab
# ──────────────>────> ┊
# ch_delta k_delta ┊
# ┊
# %26
ch_delta = ord(ch) - ord('a')
k_delta = ord(k) - ord('a')
return chr(ord('a') + (ch_delta + k_delta) % 26)
除非k
有所不同,否则您可以使用str.translate
来加速加密:
import string
message = 'mw'
key = 'f'
enc_table = string.maketrans(
string.ascii_lowercase,
''.join(shift(c, key) for c in string.ascii_lowercase)
)
message.translate(enc_table) # -> 'rb'
例如,我还建议将 magic number 26
替换为 len(string.ascii_lowercase)
。
解密可以使用相同的函数,但使用不同的密钥。它们之间的关系是enc_delta + dec_delta = 0 modulo 26
。由此得出 dec_delta = -enc_delta % 26
。因此:
dec_k = chr(ord('a') + ((ord(enc_k) - ord('a'))) % 26)
Decrytion/Encryption Python
代码:
def shift(ch, k):
return chr(ord('a') + ((ord(ch) - ord('a')) + (ord(k) - ord('a'))) % 26)
def reshift(ch, k):
tmp = (ord(ch) - (ord(k) - ord('a')))
if tmp<ord('a'):
tmp = ord("a") +(26 - (ord("a") - tmp))
return chr(tmp)
print "w and f:"
re = shift("w", "f")
print "Encryption:", re
re = reshift(re, "f")
print "Decrytion:", re
print "----------"
print "e and b"
re = shift("e", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
print "----------"
print "z and b"
re = shift("z", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
print "----------"
print "x and b"
re = shift("x", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re
输出:
vivek@vivek:~/Desktop/Whosebug$ python 26.py
w and f:
Encryption: b
Decrytion: w
----------
e and b
Encryption: f
Decrytion: e
----------
z and b
Encryption: a
Decrytion: z
----------
x and b
Encryption: y
Decrytion: x
vivek@vivek:~/Desktop/Whosebug$