每天开心一点

Python: 每日一题 45

2017-11-27 13:31:00    六月    618    来源: http://bbs.fishc.com/thread-87204-1-1.html

上一题,我们知道了,摩斯码是由 点("Dot")和划("Dash")组成。
但实际上更准确的说法,应该是摩斯码是由点、划、点和划之间的停顿、每个字符间短的停顿、每个词之间中等的停顿以及句子之间长的停顿组成的。

现在我们来定义一下各个组成部分的时间长度,为了更好的理解这部分,建议你可以自己尝试按出摩斯码的节奏。
1、点("Dot")——1个单位时间长度
2、划("Dash")——3个单位时间长度
3、每个字母内的点和划之间的停顿——1个单位时间长度
4、每个词内字母之间的停顿——3个单位时间长度
5、词与词之间的停顿——7个单位时间长度

然而,实际上无法定义‘单位时间长度’是多长。(个人认为应该是在那个手工发报的年代无法定义)。由于不同的发报人传送的速度可能是不相同的。
业余的发报人需要几秒才能传出一个字母(当你按照我上面说的自己按出摩斯码的节奏是,就会发现自己按的实际很慢),而一个专业的发报人一分钟可以发出60个字母。而机器发报则可以更快。

在这一题中,我们假定收到的是由自动化设备接收的规律性信号。
以下开始是重点了:
当线路接通时(也就是当按下发报键时),记录1。
当线路未接通时(也就是当弹起发报键时),记录0。
当整个信息被完全接收时,你会获得一个只包含了0和1的字符串。

例如:
  1. 信息:HEY JUDE
  2. 摩斯码为:···· · −·−−   ·−−− ··− −·· ·
  3. 字符串为:1100110011001100000011000000111111001100111111001111110000000000000011001111110011111100111111000000110011001111110000001111110011001100000011
复制代码


由此,你可以看出,转换设备非常精确的记录了信息,在这里转换设备采样线路中每个点(DOT)为两个单位时间长度。(由于对于理解转换比较关键,所以我也给出原文,防止我翻译中的不准确。)
As you may see, this transmission is perfectly accurate according to the standard, and the hardware sampled the line exactly two times per "dot".
(译注:只是在此范例中采用的是两倍时长为一个DOT的长度,并不代表所有的测试样本都是两倍时常。其可能是3倍,4倍,也可能是1倍。所以题目第一个函数的要求,就是首先要能判断出频率。)

现在,你的任务是实现两个函数:
1、函数  decodeBits(bits),用于找出信息转换中的频率,准确的将字符串信息解码为由点(.)、划(-)和空格组成的新字符串(也就是上一题中我们传入函数中的参数。)注意:会出现额外的0在开始和结尾,你应当去除掉它们。同时,如果你在辨别个别连续的1是否是点还是划时,假定其为点。
2、函数 decodeMorse(morseCode),这将以上的输出转换为一个人类可读的字符串的函数(其实也就是上一题)。

That's all.
避免我的翻译不准确跟您带来额外困扰,我给出原文的地址:https://www.codewars.com/kata/54b72c16cd7f5154e9000457