背景
ÉmileBaudot在1870年发明了Baudot Code,这是一种用于电报的固定长度字符编码。他设计的代码可以通过仅用五个键的手动键盘输入。两个用左手操作,三个用右手操作:
右手食指,中指和无名指分别操作I,II和
III键,左手食指和中指操作
IV和Ⅴ键。(此后,我将使用其西方阿拉伯数字,即
1到5。)字符作为和弦输入。输入字母“C”,例如,操作者按下1,3,和4同时,旋转的刷臂依次读取每个按键并传输电流,或者对于未按下的按键,则不传输电流。用现代术语来说,结果是5位最低有效位优先的二进制编码,其中我们的示例“ C”被编码为10110
。
5位?
您可能会认为,最多可以表示32个唯一符号的5位甚至对于所有英文字母和数字都不够,更不用说标点符号了。不过,鲍多有个绝招:他的字符集实际上是两个不同的集:字母和
数字,并且他定义了两个特殊的代码在它们之间切换。
仅需按5键(00001
)即可激活切换到Letters模式的Letter Shift,并用4键()激活
Figure Shift。00010
挑战
您面临的挑战是编写一个程序或函数来解码Baudot码传输。
实际的传输将从一些初始化位开始,再加上每个字符前后的开始和停止位,但是我们将跳过这些初始化位,仅担心每个字符的5个唯一位。输入和输出格式在下面讨论。
鲍多密码
有两种不同的Baudot代码版本:Continental和UK我们将使用UK版本,其中不包括Baudot的母语法语中的“É”之类的字符。我们还将忽略所有不属于可打印ASCII字符的英国版本的符号。您只需要解码下表中的字符,所有这些字符都是可打印的ASCII字符,下表中说明的最后三个控制字符除外。
“ Ltr”列显示字母模式下的字符,而“ Fig”显示图形模式下的字符:
Encoding Encoding
Ltr Fig 12345 Ltr Fig 12345
--- --- -------- --- --- --------
A 1 10000 P + 11111
B 8 00110 Q / 10111
C 9 10110 R - 00111
D 0 11110 S 00101
E 2 01000 T 10101
F 01110 U 4 10100
G 7 01010 V ' 11101
H 11010 W ? 01101
I 01100 X 01001
J 6 10010 Y 3 00100
K ( 10011 Z : 11001
L = 11011 - . 10001
M ) 01011 ER ER 00011
N 01111 FS SP 00010
O 5 11100 SP LS 00001
/ 11000
右列的最后三行是控制字符:
ER
是擦除。鲍多的电报机会为此字符打印一个星号样的符号,以告诉读者应该忽略前一个字符,但是对于读者来说,我们会变得更好,实际上将省略(不打印)前一个字符。在Letter和Figure模式下,它的作用相同。FS
是Figure Shift。这会将字符集从字母切换为数字。如果解码器已经处于图形模式,则将FS视为空格(SP
“ Ltr”列中的ergo )。当解码器处于图形模式时,它将保持图形模式,直到接收到LS字符为止。LS
是Letter Shift。它将字符集从数字切换为字母。如果解码器已经处于Letter模式,则LS被视为Space。在字母模式下,解码器将保持字母模式,直到接收到FS字符为止。
解码器始终以字母模式启动。
这是一个具有图形移位,字母移位和空格的示例:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
这产生消息MAY 15TH
。如您所见,第一个00001
(字母移位/空格)字符用作空格,因为解码器已经处于字母模式。下一个字符00010
(Figure Shift / Space)将解码器切换到Figure模式进行打印15
。然后00001
再次出现,但是这次将其作为Letter Shift来使解码器返回Letter模式。
为了方便起见,以下是一些字符,其格式可能更容易在编辑器中提取,并按代码排序:
A,1,10000|E,2,01000|/,,11000|Y,3,00100|U,4,10100|I,,01100|O,5,11100|FS,SP,00010|J,6,10010|G,7,01010|H,,11010|B,8,00110|C,9,10110|F,,01110|D,0,11110|SP,LS,00001|-,.,10001|X,,01001|Z,:,11001|S,,00101|T,,10101|W,?,01101|V,',11101|ER,ER,00011|K,(,10011|M,),01011|L,=,11011|R,-,00111|Q,/,10111|N,,01111|P,+,11111
输入值
输入将是字符串,数组或以最低有效位优先顺序排列的位列表。每个字符将由5位五重奏表示。位可以是任何合理的格式,例如一个二进制串,数组0
S和1
S,的字符串"0"
和"1"
字符,一个单一的数量非常大,等等,只要它直接映射到变速器的比特。
每个传输将至少有一个可打印的五重奏和最多255个(可打印或其他形式的)五重奏,即5至1,275位(含)。
输入可以包含只在传输的位,用两个允许例外:任何数量的前缘或后的0
比特和/或用于字符串输入,单个结尾的新行可以被添加到变速器。不能在每个五重奏之前或之后添加前导或尾随位或字符,即,您不能将每个五重奏填充到8位(或将每个五重奏作为数组中的一个数字使用-除非您的语言为5位整数类型)或单独具有任何其他位的五重奏,例如"01111\n11100"
。
笔记和边缘案例
传输将仅包含上表“ Ltr”和“ Fig”列中的字符。例如
01110
,您将永远不会收到“ 体形”模式,因为“体形”列中没有它。假定解码器在传输开始时始终处于字母模式。但是,第一个字符可能是FS字符,可以立即切换到图形模式。
当解码器处于字母模式时,它可能会收到一个LS字符,而当它处于图形模式时,它可能会收到一个FS字符。无论哪种情况,都必须打印一个空格字符(请参见输出)。
ER字符永远不会成为传输中的第一个字符,也永远不会紧随LS,FS或另一个ER之后。
FS字符可以紧随LS字符,反之亦然。
LS和FS字符都不是任何传输中的最后一个字符。
的
/
和-
字符可以以字母模式(代码被接收11000
和10001
,分别地)或图模式(10111
和00111
)。
输出量
输出可以是任何合理的格式,最合理的是ASCII(或UTF-8,所有表示的字符都与ASCII相同)。请在您的答案中指出您的输出是否为其他编码或格式。
笔记
- 空格字符(请参见上面的3.)应为ASCII空格(0x20)或等效的编码,即按空格键时得到的内容。
获奖
这是代码高尔夫球。以字节为单位的最短代码获胜。
限制条件
禁止出现标准漏洞。
允许尾随空格和/或单个尾随换行符。不允许前导空格或其他字符(不属于传输的一部分)。
您不得使用任何内置或库函数来解码Baudot代码(或其任何后代,例如Murray代码,ITA-1等)。
测试用例
Input: 001101000010100111101110010101
Output: BAUDOT
Input: 11010010001001100011110111101111100
Output: HELLO
Input: 01011100000010000001000101000011100000011010111010
Output: MAY 15TH
Input: 0001000100010000001000001011101110011100101010010110101010001111100101
Output: 32 FOOTSTEPS
Input: 10110000110101011100111100001111011010000001101110
Output: GOLF
Input: 000100011000001111100000100010110111001100010110010000111111
Output: 8D =( :P
Input: 0000100001000010000100010001111011111011000011100010001
Output (4 leading spaces): -/=/-
00010
列出。根据描述,如果我们处于字母模式并且收到代码,则应该切换到数字模式,但是表中的值似乎与之相反。同样,反之亦然。SP
FS
00010
00001