Contexte
En 1870, Émile Baudot invente le Baudot Code , un codage de caractères de longueur fixe pour la télégraphie. Il a conçu le code pour être entré à partir d'un clavier manuel avec seulement cinq touches; deux opérés de la main gauche et trois de la droite:
L'index droit, le majeur et l'annulaire actionnent respectivement les touches I , II et
III , et l'index gauche et le majeur actionnent
IV et Ⅴ . (Désormais, j'utiliserai leurs chiffres arabes occidentaux, c'est-à-dire de
1 à 5. ) Les caractères sont entrés sous forme d'accords. Pour saisir la lettre "C", par exemple, l'opérateur appuie sur les touches 1 , 3 et 4touches simultanément, après quoi un bras de brosse rotatif lit chaque touche dans l'ordre et transmet un courant ou, pour les touches non enfoncées, aucun courant. Le résultat est, en termes modernes, un codage binaire à 5 bits le moins significatif en premier, dans lequel notre exemple, "C", est codé comme 10110
.
5 bits ??
Vous pensez peut-être que 5 bits, qui peuvent exprimer au plus 32 symboles uniques, ne suffisent pas, même pour toutes les lettres et chiffres anglais, pour ne rien dire de la ponctuation. Baudot avait un truc dans sa manche, cependant: son jeu de caractères est en fait deux jeux distincts: lettres et
chiffres , et il a défini deux codes spéciaux pour basculer entre eux.
Letter Shift , qui passe en mode Letters, est activé en appuyant uniquement sur la touche 5 ( 00001
), et Figure Shift est activé avec la
touche 4 ( 00010
).
Défi
Votre défi est d'écrire un programme ou une fonction qui décode les transmissions du code Baudot.
Une vraie transmission commencerait par quelques bits d'initialisation, plus un bit de démarrage et d'arrêt avant et après chaque caractère, mais nous allons les ignorer et ne nous soucier que des 5 bits uniques pour chaque caractère. Les formats d'entrée et de sortie sont décrits ci-dessous.
Code de Baudot
Il existe deux versions différentes de Baudot Code: Continental et UK Nous allons utiliser la version UK, qui n'inclut pas de caractères comme "É" du français natif de Baudot. Nous allons également laisser de côté tous les symboles de la version britannique qui ne figurent pas parmi les caractères ASCII imprimables. Vous n'aurez qu'à décoder les caractères du tableau ci-dessous, qui sont tous des caractères ASCII imprimables à l'exception des trois derniers caractères de contrôle qui sont expliqués sous le tableau.
La colonne "Ltr" montre les caractères en mode Lettre et "Fig" montre les caractères en mode 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
Les trois dernières lignes de la colonne de droite sont des caractères de contrôle:
ER
est l' effacement . Les machines de télégraphie de Baudot imprimeraient un symbole semblable à un astérisque pour ce caractère pour dire au lecteur que le caractère précédent devrait être ignoré, mais nous allons être encore plus gentils avec le lecteur et en fait omettre (ne pas imprimer) le caractère précédent . Il agit de la même façon en mode Lettre et en mode Figure.FS
est Figure Shift . Cela fait passer le jeu de caractères des lettres aux chiffres. Si le décodeur est déjà en mode Figure, FS est traité comme un espace (ergoSP
dans la colonne "Ltr"). Lorsque le décodeur est en mode Figure, il reste en mode Figure jusqu'à ce qu'un caractère LS soit reçu.LS
est Letter Shift . Il fait passer le jeu de caractères des chiffres aux lettres. Si le décodeur est déjà en mode Lettre, LS est traité comme un espace . En mode lettre, le décodeur reste en mode lettre jusqu'à ce qu'un caractère FS soit reçu.
Le décodeur démarre toujours en mode Lettre.
Voici un exemple avec Figure Shift, Letter Shift et Space:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Cela donne le message MAY 15TH
. Comme vous pouvez le voir, le premier caractère 00001
(Majuscule / Espace) agit comme un espace, car le décodeur est déjà en mode Lettre. Le caractère suivant 00010
(Figure Shift / Space) fait passer le décodeur en mode Figure pour imprimer 15
. Puis 00001
apparaît à nouveau, mais cette fois -ci, il agit comme lettre Shift pour remettre le décodeur en mode Lettre.
Pour votre commodité, voici les caractères dans un format peut-être plus facile à digérer dans un éditeur, triés par code:
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
Contribution
L'entrée sera une chaîne, un tableau ou une liste de bits dans le premier bit de poids faible. Chaque caractère sera représenté par un quintet de 5 bits. Les bits peuvent être dans n'importe quel format raisonnable, par exemple une chaîne binaire, un tableau de 0
s et 1
s, une chaîne de
caractères "0"
et "1"
, un seul très grand nombre, etc., tant qu'il correspond directement aux bits de la transmission.
Chaque transmission aura au moins un quintet imprimable et au plus 255 quintets (imprimables ou non), soit 5–1,275 bits inclus.
L'entrée ne peut contenir que les bits de la transmission, avec deux exceptions autorisées: n'importe quel nombre de 0
bits de début ou de fin et / ou, pour la chaîne, une seule nouvelle ligne de fin peut être ajoutée à la transmission. Les bits ou caractères de début ou de fin ne peuvent pas être ajoutés avant ou après chaque quintet, c'est-à-dire que vous ne pouvez pas garnir chaque quintet à 8 bits (ou prendre chaque quintet comme un nombre unique dans un tableau - à moins que votre langue n'ait un type entier sur 5 bits) ou séparé quintettes avec des bits supplémentaires, par exemple "01111\n11100"
.
Notes et étuis de bord
La transmission ne contiendra que les caractères des colonnes "Ltr" et "Fig" du tableau ci-dessus. Vous ne recevrez jamais par exemple
01110
en mode Figure, car il est absent de la colonne "Fig".On suppose que le décodeur sera toujours en mode Lettre au début d'une transmission. Cependant, le premier caractère peut être un caractère FS pour passer immédiatement en mode Figure.
Lorsque le décodeur est en mode Lettre, il peut recevoir un caractère LS et lorsqu'il est en mode Figure, il peut recevoir un caractère FS. Dans les deux cas, un caractère Espace doit être imprimé (voir Sortie).
Le caractère ER ne sera jamais le premier caractère d'une transmission, ni ne suivra immédiatement un LS, FS ou un autre ER.
Un personnage FS peut immédiatement suivre un personnage LS et vice versa.
Ni le caractère LS ni le caractère FS ne seront le dernier caractère d'une transmission.
Les caractères
/
et-
peuvent être reçus en mode lettre (codes11000
et10001
, respectivement) ou en mode figure (10111
et00111
).
Sortie
La sortie peut être dans n'importe quel format raisonnable, le plus raisonnable étant ASCII (ou UTF-8, pour lequel tous les caractères représentés sont les mêmes que ASCII). Veuillez indiquer dans votre réponse si votre sortie est dans un autre encodage ou format.
Remarques
- Le caractère espace (voir 3. ci-dessus) doit être un espace ASCII (0x20) ou l'équivalent de votre encodage, c'est-à-dire ce que vous obtenez lorsque vous appuyez sur la barre d'espace.
Gagnant
C'est du code-golf . Le code le plus court en octets gagne.
Les restrictions
Les failles standard sont interdites.
Les espaces de fin et / ou une seule nouvelle ligne de fin sont autorisés. Les espaces de tête ou d'autres caractères (qui ne font pas partie de la transmission) sont interdits.
Vous ne pouvez pas utiliser de fonctions intégrées ou de bibliothèque qui décodent le code Baudot (ou l'un de ses descendants, par exemple Murray Code, ITA-1, etc.).
Cas de test
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
est répertorié comme SP
en mode lettre et FS
en mode figure. Selon la description, si nous sommes en mode lettre et que nous recevons du code 00010
, nous devrions passer en mode figure, mais les valeurs dans le tableau semblent être l'inverse. Aussi, vice versa pour 00001
.