首页 > 试题广场 >

一个粗心的发报员在发送莫尔斯电码(Morse Code)的时

[问答题]
一个粗心的发报员在发送莫尔斯电码(Morse Code)的时候,忘记在发送字母和单词之间停顿,结果收报系统收到的是下面这样的一个没有分隔符的点(.)划(-)的序列(请忽略换行符)。
.-.-....-.-...--.-...-....--...-.-...-.--.------..-...-..-.-.---...-..-..---..-..
....--..-.--.-...-.--......-.........-..-.----.-.....-....--.-.-.--.-..---..-....
..-...-..-.--.-.----......-.--.-----..-------.-.-..---.-.-.--..-.-...............
--...--....--..-....-.-----.....-...-------.-......-.........-..-..--.-....-...--
....-.--.-.....--..-.....--..-.---.--...-.-.-..-.-.....---.-.-.-.----....-..-....
.--..----......-...-.--.-...--.....--.....-.......-....---..-..--...-------.--...
.---..---.....-.-.-....-.-...--..-....---..--.--...-.-.-..-.-.....---.-.-.-.----.
...-..-.....--..----.
(1)已知这份报文的原始内容是一部著名英文小说的片段,请问,这部小说的作者是:

(A) H. G. Wells

(B) J. K. Rowling

(C) Isaac Asimov

(D) Lewis Carroll

(E) Jack London

(F) Stephen King

(G) J. R. R. Tolkien

(H) Edgar Rice Burroughs

(2)  请写出本题解题的主要思路,以及解题时使用的主要代码片段。



先建立一个字典,将英文字母作为key,其莫尔斯编码作为value。然后对每个作家的名作中的关键字生成莫尔斯电码,比如J.K.Rowling的harry或者potter之类的关键字,然后检查给出的电码里是否含有这些关键字来确定是不是此作者。既然是用片段就能猜到作者,片段中应该包含其代表作品名字之类的决定性信息。所以这个方法应该有效,经过测试,给定的莫尔斯电码中含有love和life,所以猜测是Jack London的热爱生命。(以上解析纯属胡乱猜测,大家看看就好~)
发表于 2019-04-09 12:16:50 回复(2)
由题意可知,小说由英文书写,也就是26个英文字母组成。
每个英文字母的编码可以通过霍夫曼树对每个字母进行编码,所有的字母都由0和1表示,对应的是上述中的“.”和“-”。
我们通过这个将其转换成一个字符串。并且通过这组0和1组成的字符串存入内存,通过霍夫曼树的编码进行匹配,
得到对应的编码的对应的字母。

Morse_code = “0101000.....”
array_HFM = [000000,0000001,.....]
code = len(array_HFM[0])
context = ""
for i in range(0,len(Morse_code),code):
    for j in range(len(array_HFM)):
        if array_HFM[j] == Morse_code[i:i+code]:
            如果想等则得到对应的字母存入列表中
            context = context + 对应的字母
print(context)
发表于 2019-04-08 17:05:19 回复(3)

2) 将匹配问题转化成深度优先搜索问题:
     摩斯代码是将26个英文字母映射成.)划(-)的序列,所以我们可以从第一个字符开始,尝试最长匹配,如果匹配成功就进入下一层,如果下一层没有能匹配的字母,就返回上一层,改成稍短一点的可行映射。直到所有的序列都能匹配成英文字母。这样就把摩斯代码翻译成了英文字母串

发表于 2019-06-01 08:42:38 回复(0)
(D) Lewis Carroll
刘易斯 《爱丽丝梦游仙境》
开头是 Alice .- .-.. .. -.-. .
发表于 2019-05-27 22:04:17 回复(0)
(E) Jack London
发表于 2019-05-05 17:13:36 回复(0)
(1) (D)
(2) 有非常多不同方式的讲解,比如比较经典的,用动态规划思路的解法。而且,网上还可以找到实际可以用来解码的源代码。考试时如果会搜索,几乎是不用自己编程序的。

当然,如果不想这么麻烦的话,试着用手工穷举方式,解码前面 4~5 个英文字符,这个复杂度是可以接受的,因为原文的第一个字母是 “A”,所以,前面 4~5 个字符最早出现的一组候选项里,很快就可以见到 “Alice” 这样醒目的单词——然后,直接就可以猜到那本小说是——《爱丽丝漫游奇境》。

发表于 2019-04-27 11:33:07 回复(0)
无空格摩尔斯电码问题,最经典的求解方式是动态规划。
起始的若干字符“.-.-....-.-..”代表“Alice”,应该是刘易斯的《爱丽丝梦游仙境》。
发表于 2019-04-25 09:41:08 回复(0)
E(第一次做牛客网试题,思考过程)

法1:
1.将英语使用频率最高的100词,用摩斯码表示,建立莫斯密码的对应关系列表,
2.用模板匹配法,把每个模版带入到这段密码中,
3.出现重复的地方,选择单词长度较长的词,出现重复代表正确率低
4.将正确率高的文字之间,将之间摩斯码,取前八个,a-z :26个字母组合排除重复,进行匹配
5.匹配好后依次向后再取前8个,循环
6.将确认好的可能性高,正确率高的文段,放到Google搜索,找相关文段,可得正确答案
法2:
统计学
180个字母-360个字母(预计值)
4 个字母一个词,预计 在40-80个词之间
在网上搜索以下8个作家的著名英文小说,
每个作家找4篇代表作,每个代表作选10句知名的话(Google搜素靠前的)
并用莫斯码表示,去掉空格,生成莫斯码去匹配
如果没查出来,
重复率最高的前三位作家,再找代表作片段匹配
发表于 2019-04-21 17:19:41 回复(0)
 
发表于 2019-04-06 21:05:12 回复(0)