我正在写一个加密程序,其过程如下:
- 消息中的空格替换为
'X' - 原始消息中的每个单词都颠倒了
- 连续的单词序列,称为“ block ”,具有单词的顺序 逆转。这些 block 的大小是加密函数的一个参数,并作为 作为“ key ”。例如,如果消息是
'THE PRICE OF FREEDOM IS ETERNAL VIGILENCE'block 大小为四,然后每个 block 包含四个单词 将被逆转,产生'FREEDOM OF PRICE THE VIGILENCE ETERNAL IS'(忽略上面的其他两个步骤)。请注意,最后一个 block 只有三个 在这种情况下的话,但它仍然是相反的。
现在我已经能够替换空格并反转所有内容,但最后一步让我很困惑。
以下代码是我目前所拥有的。
def encrypt (words, block):
words = words [::-1]
midpoint = len(words)/block
first_half = words[0:midpoint]
second_half = words[midpoint:]
words = first_half + second_half
words = words.replace(' ', 'X')
return words
def decrypt (wordsde, block):
wordsde = wordsde[::-1]
midpoint = len(wordsde) / block
first_half = wordsde[:midpoint]
second_half = wordsde[midpoint:]
wordsde = first_half + second_half
wordsde = wordsde.replace('X', ' ')
wordsde = wordsde.strip()
return wordsde
但每次,它都无法读取 block 或其他内容:
File "__main__", line 18, in __main__
Failed example:
encrypt('WHO WATCHES THE WATCHERS', 2) # Test 4
Expected:
'SEHCTAWXOHWXSREHCTAWXEHT'
Got:
'SREHCTAWXEHTXSEHCTAWXOHW'
Trying:
encrypt('PARANOIA IS OUR PROFESSION', 3) # Test 5
Expecting:
'RUOXSIXAIONARAPXNOISSEFORP'
**********************************************************************
File "__main__", line 22, in __main__
Failed example:
encrypt('PARANOIA IS OUR PROFESSION', 3) # Test 5
Expected:
'RUOXSIXAIONARAPXNOISSEFORP'
Got:
'NOISSEFORPXRUOXSIXAIONARAP'
Trying:
encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 4) # Test 6
Expecting:
'MODEERFXFOXECIRPXEHTXECNELIGIVXLANRETEXSI'
**********************************************************************
File "__main__", line 26, in __main__
Failed example:
encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 4) # Test 6
Expected:
'MODEERFXFOXECIRPXEHTXECNELIGIVXLANRETEXSI'
Got:
'ECNELIGIVXLANRETEXSIXMODEERFXFOXECIRPXEHT'
请您参考如下方法:
这是一个很好回答的问题。
sentence = 'WHO WATCHES THE WATCHERS'
def chunker(seq, size):
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size)) # Thanks to http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to-iterate-over-a-list-in-chunks/434328#434328
def encrypt(phrase,block):
l = []
for g in chunker(phrase.split(),block):
l.extend(i[::-1] for i in reversed(g))
return 'X'.join(l)
测试时:
>>> encrypt(sentence,2)
'SEHCTAWXOHWXSREHCTAWXEHT'
>>> 'RUOXSIXAIONARAPXNOISSEFORP' == encrypt('PARANOIA IS OUR PROFESSION', 3)
True
# Strings mentioned above and below were your expected answers
# mentioned in the question
>>> 'MODEERFXFOXECIRPXEHTXECNELIGIVXLANRETEXSI' == encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 4)=
True
