所以我正在研究麻省理工学院开放课件的问题集4。我尝试引用他们的解决方案,但由于某种原因它不存在。他们发布了错误的答案。所以,这是我的问题。
它应该做的描述是:“这个函数采用字符串文本和元组移位列表。移位中的元组表示移位的位置,以及移位本身。例如元组( 0,2)表示移位开始于字符串中的位置0并且是凯撒移位2.此外,移位是分层的。这意味着一组移位[(0,2),(5,3)]首先将凯撒2的变换应用于整个弦,然后从字母“
中的第6个字母开始应用3的凯撒变换所以这就是我写的:
def apply_shifts(text, shifts):
encryptedText = text
for t in shifts:
encryptedText = apply_shift(encryptedText[t[0]:len(encryptedText)], t[1])
print encryptedText
return encryptedText
所以,我知道我告诉它每次迭代循环时替换我引用的变量。我只是不知道如何设置它所以我没有那个问题。这是我的测试:
print apply_shifts("Do Androids Dream of Electric Sheep?", [(0,6), (3, 18), (12, 16)])
print 'JufYkaolfapxQdrnzmasmRyrpfdvpmEurrb?'
第一个print语句是我的测试,第二个是输出应该是什么。有什么想法吗?
答案 0 :(得分:1)
这是我推荐递归函数的少数几个函数之一!
import string
def apply_shift(text,shift):
ciphertext = string.ascii_uppercase+string.ascii_lowercase
cipherdict = {char:idx for idx,char in enumerate(string.ascii_uppercase+string.ascii_lowercase)}
loop_amt = len(ciphertext)
start,shift = shift
text = list(text)
for idx,char in enumerate(text[start:]):
idx = start+idx
if char not in cipherdict: continue
else: text[idx] = ciphertext[(cipherdict[char]+shift)%loop_amt]
return ''.join(text)
def apply_shifts(text,shifts):
start,shift = shifts.pop(-1)
if shifts:
return apply_shifts(apply_shift(text,(start,shift)),shifts)
else:
return apply_shift(text,(start,shift))
答案 1 :(得分:0)
在每次迭代时将apply_shift的结果与非移位部分前置:
您可以使用切片短语法从开头s [:i]或结束s [i:]
获取字符串切片encryptedText = encryptedText [:t [0]] + apply_shift(encryptedText [t [0]:],t [1])