sfondo
Nel 1870 Émile Baudot inventò il Baudot Code , un carattere a lunghezza fissa codificante per la telegrafia. Ha progettato il codice da inserire da una tastiera manuale con solo cinque tasti; due operavano con la mano sinistra e tre con la destra:
L'indice destro, il medio e l'anulare azionano rispettivamente i tasti I , II e
III , mentre l'indice sinistro e il medio operano
IV e Ⅴ . (D'ora in poi userò i loro numeri in arabo occidentale, cioè da
1 a 5 ). I personaggi vengono inseriti come accordi. Per inserire la lettera "C", ad esempio, l'operatore preme 1 , 3 e 4tasti contemporaneamente, dopo di che un braccio spazzola rotante legge ogni tasto in sequenza e trasmette una corrente o, per i tasti non premuti, nessuna corrente. Il risultato è, in termini moderni, una codifica binaria a 5 bit meno significativa-prima-bit, in cui il nostro esempio "C" è codificato come 10110
.
5 bit ??
Potresti pensare che 5 bit, che possono esprimere al massimo 32 simboli univoci, non sono sufficienti anche per tutte le lettere e i numeri inglesi, per non parlare di punteggiatura. Baudot aveva un asso nella manica, tuttavia: il suo set di caratteri è in realtà due set distinti: Lettere e
Figure , e ha definito due codici speciali per passare da uno all'altro.
Letter Shift , che passa alla modalità Lettere, viene attivato premendo il tasto 5 da solo ( 00001
), e Figura Shift viene attivato con il
tasto 4 ( 00010
).
Sfida
La tua sfida è scrivere un programma o una funzione che decodifichi le trasmissioni del codice Baudot.
Una vera trasmissione inizierebbe con alcuni bit di inizializzazione, più un bit di inizio e di fine prima e dopo ogni carattere, ma li salteremo e ci preoccuperemo solo dei 5 bit unici per ciascun personaggio. I formati di input e output sono discussi di seguito.
Codice Baudot
Esistono due diverse versioni del codice Baudot: Continental e UK Useremo la versione UK, che non include personaggi come "É" dal francese nativo di Baudot. Tralasceremo anche tutti i simboli nella versione inglese che non sono tra i caratteri ASCII stampabili. Dovrai solo decodificare i caratteri nella tabella seguente, tutti caratteri ASCII stampabili ad eccezione dei tre caratteri di controllo finali spiegati sotto la tabella.
La colonna "Ltr" mostra i caratteri in modalità Lettera e "Fig" mostra i caratteri in modalità 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
Le ultime tre righe nella colonna di destra sono caratteri di controllo:
ER
è la cancellazione . Le macchine telegrafiche di Baudot stamperebbero un simbolo simile ad un asterisco per questo personaggio per dire al lettore che il personaggio precedente dovrebbe essere ignorato, ma saremo ancora più carini con il lettore e in realtà ometteremo (non stamperemo) il personaggio precedente . Funziona allo stesso modo sia in modalità Lettera che Figura.FS
è il cambio di figura . In questo modo il set di caratteri passa da Lettere a Figure. Se il decodificatore è già in modalità Figura, FS viene trattato come uno spazio (ergoSP
nella colonna "Ltr"). Quando il decodificatore è in modalità Figura, rimane in modalità Figura finché non viene ricevuto un carattere LS.LS
è Letter Shift . Cambia il set di caratteri da Figure a Lettere. Se il decodificatore è già in modalità Letter, LS viene trattato come uno spazio . In modalità Letter, il decodificatore rimane in modalità Letter fino a quando non viene ricevuto un carattere FS.
Il decodificatore si avvia sempre in modalità Letter.
Ecco un esempio con Figure Shift, Letter Shift e Space:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Questo produce il messaggio MAY 15TH
. Come puoi vedere, il primo carattere 00001
(Maiusc / Spazio) funge da spazio, poiché il decodificatore è già in modalità Lettera. Il carattere successivo, 00010
(Figura Maiusc / Spazio) commuta il decodificatore in modalità Figura per stampare 15
. Quindi 00001
appare di nuovo, ma questa volta agisce come Letter Shift per riportare il decodificatore in modalità Letter.
Per comodità, ecco i caratteri in un formato forse più facile da digerire in un editor, ordinati per codice:
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
Ingresso
L'input sarà una stringa, un array o un elenco di bit nell'ordine meno significativo-bit-primo. Ogni personaggio sarà rappresentato da un quintetto di 5 bit. I bit possono essere in qualsiasi formato ragionevole, ad esempio una stringa binaria, una matrice di 0
s e 1
s, una stringa di "0"
e "1"
caratteri, un singolo numero molto grande, ecc., Purché si associ direttamente ai bit della trasmissione.
Ogni trasmissione avrà almeno un quintetto stampabile e al massimo 255 quintetti (stampabili o meno), vale a dire 5–1,275 bit inclusi.
L'input può contenere solo i bit della trasmissione, con due eccezioni consentite: Qualsiasi numero di 0
bit iniziali o finali e / o, per l'input di stringhe, alla riga può essere aggiunta una sola riga finale nuova. I bit o i caratteri iniziali o finali non possono essere aggiunti prima o dopo ogni quintetto, ovvero non è possibile assegnare ciascun quintetto a 8 bit (o prendere ogni quintetto come un singolo numero in un array, a meno che la propria lingua abbia un tipo intero a 5 bit) o separato quintetti con eventuali bit aggiuntivi, ad es "01111\n11100"
.
Note e custodie per bordi
La trasmissione conterrà solo i caratteri nelle colonne "Ltr" e "Fig" nella tabella sopra. Non riceverai mai ad es
01110
. In modalità Figura, perché è assente dalla colonna "Fig".Si presume che il decodificatore sarà sempre in modalità Lettera all'inizio di una trasmissione. Tuttavia, il primo carattere può essere un personaggio FS per passare immediatamente alla modalità Figura.
Quando il decodificatore è in modalità Letter, può ricevere un carattere LS e quando è in modalità Figure può ricevere un carattere FS. In entrambi i casi, è necessario stampare un carattere Spazio (vedere Output).
Il personaggio ER non sarà mai il primo personaggio in una trasmissione, né seguirà mai immediatamente un LS, FS o un altro ER.
Un personaggio di FS può immediatamente seguire un personaggio di LS e viceversa.
Né il personaggio LS né quello di FS saranno gli ultimi personaggi in nessuna trasmissione.
I caratteri
/
e-
possono essere ricevuti in modalità Lettera (codici11000
e10001
, rispettivamente) o Figura (10111
e00111
).
Produzione
L'output può essere in qualsiasi formato ragionevole, il più ragionevole è ASCII (o UTF-8, per il quale tutti i caratteri rappresentati sono gli stessi di ASCII). Indica nella tua risposta se l'output è in un'altra codifica o formato.
Gli appunti
- Il carattere spaziale (vedi 3. sopra) dovrebbe essere uno spazio ASCII (0x20) o l'equivalente della codifica, ovvero ciò che ottieni quando premi la barra spaziatrice.
vincente
Questo è code-golf . Vince il codice più breve in byte.
restrizioni
Sono vietate le scappatoie standard.
Sono consentiti spazi finali e / o una nuova riga finale finale. Gli spazi iniziali o altri caratteri (che non fanno parte della trasmissione) non sono consentiti.
Non è possibile utilizzare alcuna funzione integrata o libreria che decodifichi il codice Baudot (o uno qualsiasi dei suoi discendenti, ad esempio Codice Murray, ITA-1, ecc.).
Casi 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
è elencato come SP
in modalità lettera e FS
in modalità figura. Secondo la descrizione, se siamo in modalità lettera e riceviamo codice 00010
, dovremmo passare alla modalità figura, ma i valori nella tabella sembrano essere il contrario. Inoltre, viceversa per 00001
.