我试图破解Python中的标准“a = 1,b = 2,c = 3 ......”密码,但我有点卡住了。我想要解密的消息是“他” - “8 5”,但由于我的if语句的排序,输出是“eh”。有人知道如何解决这个问题吗?
import re
import sys
message = " 8 5 ";
map(int, re.findall(r'\d+', message))
if "++" in message:
sys.stdout.write(" ")
if "--" in message:
print()
if " 1 " in message:
sys.stdout.write("a")
if " 2 " in message:
sys.stdout.write("b")
if " 3 " in message:
sys.stdout.write("c")
if " 4 " in message:
sys.stdout.write("d")
if " 5 " in message:
sys.stdout.write("e")
if " 6 " in message:
sys.stdout.write("f")
if " 7 " in message:
sys.stdout.write("g")
if " 8 " in message:
sys.stdout.write("h")
if " 9 " in message:
sys.stdout.write("i")
if " 10 " in message:
sys.stdout.write("j")
if " 11 " in message:
sys.stdout.write("k")
if " 12 " in message:
sys.stdout.write("l")
if " 13 " in message:
sys.stdout.write("m")
if " 14 " in message:
sys.stdout.write("n")
if " 15 " in message:
sys.stdout.write("o")
if " 16 " in message:
sys.stdout.write("p")
if " 17 " in message:
sys.stdout.write("q")
if " 18 " in message:
sys.stdout.write("r")
if " 19 " in message:
sys.stdout.write("s")
if " 20 " in message:
sys.stdout.write("t")
if " 21 " in message:
sys.stdout.write("u")
if " 22 " in message:
sys.stdout.write("v")
if " 23 " in message:
sys.stdout.write("w")
if " 24 " in message:
sys.stdout.write("x")
if " 25 " in message:
sys.stdout.write("y")
if " 26 " in message:
sys.stdout.write("z")
答案 0 :(得分:6)
如果您使用映射而不是一系列if
语句,这将变得更加容易:
>>> import string
>>> d = {str(x):y for x,y in enumerate(string.ascii_lowercase,1)}
>>> d['++'] = ' '
>>> d['--'] = '\n'
>>> message = ' 8 5 '
>>> ''.join(d[x] for x in message.split())
'he'
在这里,我使用所有字符串作为字典的键,因为你想支持'++'
和'--'
。
答案 1 :(得分:3)
您的解决方案不起作用,因为您不会从输入字符串的开头查看输入字符串中的每个数字,但是不会出现任何数字。
假设您的输入为8 5 8
,您的输出仍为eh
。
不应使用in
运算符,而是应该在所有数量的消息中都有一个循环:
for code in map(int, re.findall("\d+", message)):
if code == 1:
sys.stdout.write("a")
-- ... and so on until 26
您还应该使用其他人提供的提示,包括使用代码字典来避免所有这些if
语句。
答案 2 :(得分:2)
由于您似乎更感兴趣的是为什么您的方法不起作用以获得简洁的解决方案,我将尝试避免使用更复杂的方法来解决此问题(ASCII映射/字典,并提供一些指示如何你可以接近这个。
首先,您有一条消息是String。你想查看这个字符串的每个字母并找到它编码的正确字母,所以你需要解析字符串并从左到右一次查看一个字母。
您可以使用for
循环来抓取一封信,然后对该单个字母进行比较。一次执行一个字母并在每个阶段写出输出。
一旦你开始工作,你可以看看优化代码,但首先要了解基础知识非常重要。
答案 3 :(得分:0)
而不是做你现在正在做的事情,你会想要
message
字符串拆分为每个组件(8
和5
(或11
,等等))(顺便说一下,map(int
...行没有任何作用。)