1

我试图在 Python 中破译标准的“a = 1, b = 2, c = 3 ...”密码,但我有点卡住了。我要解密的消息是“he”——“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")
4

4 回答 4

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'

在这里,我使用所有字符串作为字典的键,因为您想支持'++''--'.

于 2013-05-23T15:56:33.207 回答
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语句。

于 2013-05-23T16:08:06.490 回答
2

因为看起来你对为什么你的方法不起作用更感兴趣,所以得到一个简洁的解决方案我会尽量避免使用更复杂的方法来解决这个问题(ASCII 映射/字典,并给你一些关于如何处理的指示这。

首先,您有一个字符串消息。您想查看该字符串的每个字母并找到它编码的正确字母,因此您需要解析该字符串并从左到右一次查看一个字母。

您可以使用for循环来抓取一个字母,然后对该单个字母进行比较。一次做一个字母,并在每个阶段写下输出。

一旦你得到这个工作,你可以考虑优化你的代码,但首先了解基础知识很重要。

于 2013-05-23T16:01:25.117 回答
0

而不是做你现在正在做的事情,你会想要

  • message将字符串拆分为每个组件(85(或11就此而言,等等))
  • 按顺序遍历每个组件...
  • ...并将其价值“破译”成一封信。

(顺便说一句,那map(int... 行什么也没做。)

于 2013-05-23T15:56:39.850 回答