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 comoSP
no modo de letra eFS
no modo de figura. De acordo com a descrição, se estamos no modo de letra e recebemos código00010
, devemos mudar para o modo de figura, mas os valores na tabela parecem ser o contrário. Além disso, vice-versa para00001
.Respostas:
Pitão,
98979593908380 bytesO código contém caracteres não imprimíveis, então aqui está um
xxd
hexdump reversível :Experimente online. Suíte de teste.
Bastante longo, mas a tabela de pesquisa ocupa
quasemetade do espaço.Para 117 bytes, eis a mesma coisa sem imprimíveis (embora seja necessário o ISO-8859-1):
Ou, para 93 bytes, sem compactação na tabela de pesquisa:
fonte
JavaScript (ES6),
160158153 bytesfonte
Lote,
306304 bytesRecebe entrada em STDIN. Como o Lote não possui conversão binária, eu tenho que falsificá-lo usando a conversão octal e hexadecimal.
0
). Os valores possíveis são00
,01
,10
e11
. Os dois últimos têm valor8
e,9
mas eu quero2
ou3
então tomo o módulo restante6
.14
ou252
multiplicados pelo valor desejado, para eu pegar o restante do módulo14
(252=14*18
).c
é a sequência codificadar
é o resultado até agorad
é a matriz de decodificaçãos
é o índice (levando em consideração o estado do turno) do caractere que alterna o estado do turnon
é a decodificação binária mais o bit 5 des
, que é igual ao estado de mudança; nesse caso, o estado de mudança é alternado ou indexa a matriz de decodificação para encontrar o próximo caractere (ou! para apagar)fonte
PHP, 206 bytes
fonte
Chip , 1069 bytes
É um grande sucesso, mas foi bastante divertido de escrever.
Recebe a entrada como uma sequência de
"1"
's e"0"
' s. (Embora realmente apenas analise um pouco.)Experimente online!
Nota: O Erasure usa o caractere de backspace ASCII (
\x08
), o que significa que eles ficarão engraçados no TIO, mas ficarão bem, digamos, no xterm.Estrutura básica
No topo, acima da
=
linha, está o decodificador de entrada. Transforma a entrada em um dos 32 sinais separados. Eles são enviados doso
acima=
para os abaixo.As montanhas triangulares de
L
'eR
' apenas rotacionam o padrão de linhas separadas para colunas. A grade abaixo que traduz cada coluna em seu caractere de saída. Para sinais desconhecidos, NUL (\x00
) é produzido. Para os turnos especiais, em vez de imprimir um caractere, o pequeno blob à direita altera o modo.O teleférico entre as duas montanhas suprime qualquer impressão entre cada quinteto; caso contrário, isso também tentaria decodificar todos os quintetos sobrepostos. Tente substituir o
!
por um espaço para ver isso por si mesmo. (A execução no modo detalhado-v
também pode ser interessante aqui.)Não tenho certeza de como fazer isso menor no momento; já é bastante denso por seu tamanho.
fonte
GNU sed, 334 + 1 = 335 bytes
+1 byte para
-r
sinalizador. Recebe entrada em STDIN.Olhando para os velhos desafios, percebi que esse seria muito fácil com o sed e bom para a prática. Como não tentei compactação, a tabela de pesquisa é mais da metade do código.
Experimente online!
Explicação
O código funciona em duas fases: primeiro, ele substitui cada execução de 5 dígitos binários pelos dois caracteres correspondentes (letra e figura) de uma tabela de pesquisa. A tabela de pesquisa está no formato 𝟎𝟎𝟎𝟎𝟎𝐋𝐅𝟎𝟎𝟎𝟎𝟎𝐋𝐅… onde 𝟎 é um dígito binário e 𝐋 e 𝐅 são a letra e o número correspondentes, respectivamente.
%
significa caracteres ausentes (pode ser qualquer caractere que não seja nova linha).FS/SP
é representado porf<space>
eSP/LS
é<space>l
.ER
é representado por<<
.Em seguida, percorre cada par com um "cursor" correspondente ao modo atual - para o modo
#
de letra,@
para o modo de figura. O#
cursor remove o segundo caractere do par e depois avança para o próximo par, e o@
remove o primeiro e avança. Em outras palavras,#A1B8
tornaA#B8
- se e entãoAB#
, e@A1B8
torna1@B8
- se e então18@
. Quando o#
cursor encontra,f<space>
ele o exclui e se substitui pelo@
cursor, e vice-versa, quando o@
encontra<space>l
.Quando nenhum par permanece, o cursor final é removido junto com os caracteres seguidos por
<
.fonte