多级凯撒密码加密

时间:2014-03-07 22:46:51

标签: python

所以我正在研究麻省理工学院开放课件的问题集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语句是我的测试,第二个是输出应该是什么。有什么想法吗?

2 个答案:

答案 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])