fundo
Em 1870, Émile Baudot inventou o Baudot Code , um caractere de comprimento fixo que codifica para telegrafia. Ele projetou o código a ser digitado a partir de um teclado manual com apenas cinco teclas; dois operados com a mão esquerda e três com a direita:
Os indicadores direito, médio e dedo anelar operam as teclas I , II e
III , respectivamente, e o indicador esquerdo e dedo médio operam
IV e and . (Doravante, usarei os algarismos arábicos ocidentais, ou seja
, de 1 a 5. ) Os caracteres são inseridos como acordes. Para inserir a letra "C", por exemplo, o operador pressiona os botões 1 , 3 e 4simultaneamente, quando um braço rotativo da escova lê cada tecla em sequência e transmite uma corrente ou, para teclas não pressionadas, nenhuma corrente. O resultado é, em termos modernos, uma codificação binária de 5 bits com o mínimo menos significativo, na qual nosso exemplo "C" é codificado como 10110
.
5 bits ??
Você pode estar pensando que 5 bits, que podem expressar no máximo 32 símbolos únicos, não são suficientes para todas as letras e números em inglês, para não dizer pontuação. Baudot tinha um truque na manga: seu conjunto de caracteres é na verdade dois conjuntos distintos: Letras e
Figuras , e ele definiu dois códigos especiais para alternar entre eles.
O deslocamento de letra , que alterna para o modo de letras, é ativado pressionando apenas a tecla 5 ( 00001
) e o deslocamento de figura é ativado com a
tecla 4 ( 00010
).
Desafio
Seu desafio é escrever um programa ou função que decodifique as transmissões do código Baudot.
Uma transmissão real começaria com alguns bits de inicialização, mais um bit de início e parada antes e depois de cada caractere, mas vamos pular esses e nos preocupar apenas com os 5 bits únicos para cada caractere. Os formatos de entrada e saída são discutidos abaixo.
Código de Baudot
Existem duas versões diferentes do Código Baudot: Continental e Reino Unido. Vamos usar a versão do Reino Unido, que não inclui caracteres como "É" do francês nativo de Baudot. Também vamos deixar de fora todos os símbolos da versão do Reino Unido que não estão entre os caracteres ASCII imprimíveis. Você só precisará decodificar os caracteres na tabela abaixo, todos os caracteres ASCII imprimíveis, exceto os três caracteres finais de controle explicados abaixo da tabela.
A coluna "Ltr" mostra os caracteres no modo Letter e "Fig" mostra os caracteres no modo Figure:
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
As últimas três linhas na coluna da direita são caracteres de controle:
ER
é apagamento . As máquinas de telegrafia de Baudot imprimiam um símbolo semelhante a um asterisco para esse personagem para dizer ao leitor que o caractere anterior deveria ser ignorado, mas seremos ainda mais agradáveis com o leitor e na verdade omitimos (não imprima) o caractere anterior . Ele age da mesma forma nos modos Letra e Figura.FS
é a mudança de figura . Isso muda o conjunto de caracteres de letras para figuras. Se o decodificador já estiver no modo Figura, o FS será tratado como um Espaço (logoSP
na coluna "Ltr"). Quando o decodificador está no modo Figura, ele permanece no modo Figura até que um caractere LS seja recebido.LS
é o deslocamento da letra . Muda o conjunto de caracteres de Figuras para Letras. Se o decodificador já estiver no modo Letter, LS será tratado como um espaço . Quando no modo Letter, o decodificador permanece no modo Letter até que um caractere FS seja recebido.
O decodificador sempre inicia no modo Letter.
Aqui está um exemplo com deslocamento de figura, deslocamento de letra e espaço:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Isso gera a mensagem MAY 15TH
. Como você pode ver, o primeiro caractere 00001
(deslocamento / espaço da letra) atua como um espaço, porque o decodificador já está no modo Letter. O próximo caractere 00010
(Mudança de figura / espaço) alterna o decodificador para o modo Figura para imprimir 15
. Em seguida, 00001
aparece novamente, mas desta vez ele age como Letter Shift para colocar a parte de trás do descodificador no modo Letter.
Para sua conveniência, eis os caracteres em um formato que talvez seja mais fácil de digerir em um editor, classificado por código:
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
Entrada
A entrada será uma sequência de caracteres, matriz ou lista de bits na primeira ordem de bits menos significativa. Cada caractere será representado por um quinteto de 5 bits. Os bits podem ser em qualquer formato razoável, por exemplo, uma cadeia binária, uma matriz de 0
s e 1
s, de uma cadeia "0"
e "1"
caracteres, um único número muito grande, etc, contanto que mapeia directamente para os bits de transmissão.
Toda transmissão terá pelo menos um quinteto imprimível e no máximo 255 quintetos (imprimíveis ou não), ou seja, de 5 a 1.275 bits, inclusive.
A entrada pode conter apenas os bits da transmissão, com duas exceções permitidas: qualquer número de 0
bits iniciais ou finais e / ou, para entrada de sequência, uma única nova linha final pode ser adicionada à transmissão. Os bits ou caracteres iniciais ou finais não podem ser adicionados antes ou depois de cada quinteto, ou seja, você não pode aumentar cada quinteto para 8 bits (ou considerar cada quinteto como um número único em uma matriz - a menos que seu idioma tenha um tipo inteiro de 5 bits) ou separado quintetos com quaisquer bits adicionais, por exemplo "01111\n11100"
.
Notas e estojos
A transmissão conterá apenas os caracteres nas colunas "Ltr" e "Fig" na tabela acima. Você nunca receberá, por exemplo,
01110
no modo Figura, porque está ausente na coluna "Fig".Supõe-se que o decodificador esteja sempre no modo Letter no início de uma transmissão. No entanto, o primeiro caractere pode ser um caractere FS para alternar para o modo Figura imediatamente.
Quando o decodificador está no modo Letter, ele pode receber um caractere LS e, no modo Figura, ele pode receber um caractere FS. Em qualquer um dos casos, um caractere de espaço deve ser impresso (consulte Saída).
O caractere ER nunca será o primeiro caractere de uma transmissão, nem seguirá imediatamente um LS, FS ou outro ER.
Um personagem FS pode seguir imediatamente um personagem LS e vice-versa.
Nem o caractere LS nem o FS serão o último caractere em nenhuma transmissão.
Os caracteres
/
e-
podem ser recebidos no modo Letter (códigos11000
e10001
, respectivamente) ou no modo Figura (10111
e00111
).
Saída
A saída pode estar em qualquer formato razoável, sendo o mais razoável ASCII (ou UTF-8, para o qual todos os caracteres representados são iguais a ASCII). Indique na sua resposta se a sua saída está em outra codificação ou formato.
Notas
- O caractere de espaço (veja 3. acima) deve ser um espaço ASCII (0x20) ou o equivalente da sua codificação, ou seja, o que você obtém ao pressionar a barra de espaço.
Ganhando
Isso é código-golfe . O código mais curto em bytes vence.
Restrições
As brechas padrão são proibidas.
Espaços à direita e / ou uma única nova linha à direita são permitidos. Espaços iniciais ou outros caracteres (que não fazem parte da transmissão) não são permitidos.
Você não pode usar nenhuma função interna ou de biblioteca que decodifique o Baudot Code (ou qualquer um de seus descendentes, por exemplo, Murray Code, ITA-1, etc.).
Casos de teste
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
é listado como SP
no modo de letra e FS
no modo de figura. De acordo com a descrição, se estamos no modo de letra e recebemos código 00010
, devemos mudar para o modo de figura, mas os valores na tabela parecem ser o contrário. Além disso, vice-versa para 00001
.