Fondo
En 1870, Émile Baudot inventó el Código Baudot , una codificación de caracteres de longitud fija para telegrafía. Diseñó el código para ingresarlo desde un teclado manual con solo cinco teclas; dos operados con la mano izquierda y tres con la derecha:
Los dedos índice derecho, medio y anular operan las teclas I , II y
III , respectivamente, y los dedos índice y medio izquierdos operan
IV y Ⅴ . (De ahora en adelante usaré sus números arábigos occidentales, es decir
, del 1 al 5 ). Los caracteres se ingresan como acordes. Para ingresar la letra "C", por ejemplo, el operador presiona 1 , 3 y 4teclas simultáneamente, con lo cual un brazo de cepillo giratorio lee cada tecla en secuencia y transmite una corriente o, para las teclas no presionadas, no hay corriente. El resultado es, en términos modernos, una codificación binaria de primer bit menos significativo de 5 bits, en la que nuestro ejemplo, "C", se codifica como 10110
.
5 bits ??
Quizás esté pensando que 5 bits, que pueden expresar a lo sumo 32 símbolos únicos, no son suficientes para todas las letras y números en inglés, por no mencionar la puntuación. Sin embargo, Baudot tenía un truco bajo la manga: su conjunto de personajes es en realidad dos conjuntos distintos: letras y
figuras , y definió dos códigos especiales para cambiar entre ellos.
El cambio de letras , que cambia al modo de letras, se activa presionando solo la tecla 5 ( 00001
), y el cambio de figuras se activa con la
tecla 4 ( 00010
).
Reto
Su desafío es escribir un programa o función que decodifique las transmisiones de Código Baudot.
Una transmisión real comenzaría con algunos bits de inicialización, más un bit de inicio y parada antes y después de cada carácter, pero los omitiremos y solo nos preocuparemos por los 5 bits únicos para cada carácter. Los formatos de entrada y salida se analizan a continuación.
Código de Baudot
Hay dos versiones diferentes del Código Baudot: Continental y Reino Unido. Vamos a utilizar la versión del Reino Unido, que no incluye caracteres como "É" del francés nativo de Baudot. También vamos a dejar de lado todos los símbolos en la versión del Reino Unido que no se encuentran entre los caracteres ASCII imprimibles. Solo tendrá que decodificar los caracteres de la tabla a continuación, todos los cuales son caracteres ASCII imprimibles, excepto los tres caracteres de control finales que se explican debajo de la tabla.
La columna "Ltr" muestra los caracteres en modo Carta y "Fig" muestra los caracteres en modo Figura:
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
Las últimas tres filas en la columna derecha son caracteres de control:
ER
es Erasure . Las máquinas de telegrafía de Baudot imprimirían un símbolo similar a un asterisco para este personaje para decirle al lector que el personaje anterior debe ser ignorado, pero vamos a ser aún más amables con el lector y en realidad omitiremos (no imprimiremos) el personaje anterior . Actúa igual en los modos Carta y Figura.FS
es el cambio de figura . Esto cambia el conjunto de caracteres de letras a figuras. Si el decodificador ya está en modo Figura, FS se trata como un Espacio (ergoSP
en la columna "Ltr"). Cuando el decodificador está en modo Figura, permanece en modo Figura hasta que se recibe un carácter LS.LS
es el cambio de letra . Cambia el conjunto de caracteres de figuras a letras. Si el decodificador ya está en modo Carta, LS se trata como un Espacio . Cuando está en modo Carta, el decodificador permanece en modo Carta hasta que se recibe un carácter FS.
El decodificador siempre comienza en modo Carta.
Aquí hay un ejemplo con Figure Shift, Letter Shift y Space:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Esto produce el mensaje MAY 15TH
. Como puede ver, el primer carácter 00001
(Letter Shift / Space) actúa como un espacio, porque el decodificador ya está en modo Letter. El siguiente carácter, 00010
(Shift / Space) cambia el decodificador al modo Figura para imprimir 15
. Luego 00001
aparece de nuevo, pero esta vez actúa como cambio de letra para volver a poner el decodificador en modo carta.
Para su conveniencia, aquí están los caracteres en un formato que quizás sea más fácil de digerir en un editor, ordenados 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
La entrada será una cadena, matriz o lista de bits en el primer orden de bits menos significativo. Cada personaje estará representado por un quinteto de 5 bits. Los bits pueden estar en cualquier formato razonable, por ejemplo, una cadena binaria, una matriz de 0
sys 1
, una cadena de
caracteres "0"
y "1"
, un único número muy grande, etc., siempre que se asigne directamente a los bits de la transmisión.
Cada transmisión tendrá al menos un quinteto imprimible y como máximo 255 quintetos (imprimibles o no), es decir, 5–1,275 bits inclusive.
La entrada puede contener solo los bits de la transmisión, con dos excepciones permitidas: cualquier número de 0
bits iniciales o finales y / o, para la entrada de cadena, se puede agregar una nueva línea final a la transmisión. Los bits o caracteres iniciales o finales no pueden agregarse antes o después de cada quinteto, es decir, no puede rellenar cada quinteto a 8 bits (o tomar cada quinteto como un solo número en una matriz, a menos que su idioma tenga un tipo entero de 5 bits) o separado quintetos con bits adicionales, por ejemplo "01111\n11100"
.
Notas y estuches
La transmisión contendrá solo los caracteres en las columnas "Ltr" y "Fig" en la tabla de arriba. Nunca recibirá, por ejemplo,
01110
en modo Figura, porque está ausente de la columna "Fig".Se supone que el decodificador siempre estará en modo Carta al comienzo de una transmisión. Sin embargo, el primer carácter puede ser un carácter FS para cambiar al modo Figura inmediatamente.
Cuando el decodificador está en modo Carta, puede recibir un carácter LS, y cuando está en modo Figura puede recibir un carácter FS. En cualquier caso, se debe imprimir un carácter de espacio (ver Salida).
El carácter ER nunca será el primer carácter en una transmisión, ni seguirá inmediatamente a un LS, FS u otro ER.
Un carácter FS puede seguir inmediatamente a un carácter LS y viceversa.
Ni el carácter LS ni el FS serán el último carácter en ninguna transmisión.
Los caracteres
/
y-
pueden recibirse en modo Carta (códigos11000
y10001
, respectivamente) o en modo Figura (10111
y00111
).
Salida
La salida puede estar en cualquier formato razonable, siendo el más razonable ASCII (o UTF-8, para el cual todos los caracteres representados son los mismos que ASCII). Indique en su respuesta si su salida está en otra codificación o formato.
Notas
- El carácter de espacio (ver 3. arriba) debe ser un espacio ASCII (0x20) o el equivalente de su codificación, es decir, lo que obtiene cuando presiona la barra espaciadora.
Victorioso
Este es el código de golf . El código más corto en bytes gana.
Restricciones
Las lagunas estándar están prohibidas.
Se permiten espacios finales y / o una nueva línea final. Los espacios iniciales u otros caracteres (que no son parte de la transmisión) no están permitidos.
No puede usar ninguna función incorporada o de biblioteca que decodifique el Código Baudot (o cualquiera de sus descendientes, por ejemplo, Código Murray, ITA-1, etc.).
Casos de prueba
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
aparece SP
en modo letra y FS
en modo figura. De acuerdo con la descripción, si estamos en modo letra y recibimos código 00010
, deberíamos cambiar al modo figura, pero los valores en la tabla parecen ser al revés. Además, viceversa para 00001
.