tło
W 1870 r. Émile Baudot wynalazł kod Baudota , kodowanie znaków o stałej długości dla telegrafii. Zaprojektował kod, który należy wprowadzać z klawiatury ręcznej za pomocą zaledwie pięciu klawiszy; dwa obsługiwane lewą ręką, a trzy prawą:
Prawy palec wskazujący, środkowy i serdeczny obsługują odpowiednio klawisze I , II i
III , a lewy palec wskazujący i środkowy obsługują
IV i Ⅴ . (Odtąd będę używać ich cyfr zachodnioafrykańskich, tj. Od
1 do 5. ) Znaki są wprowadzane jako akordy. Aby wprowadzić na przykład literę „C”, operator naciska 1 , 3 i 4klawisze jednocześnie, po czym obracające się ramię szczotki odczytuje kolejno każdy klawisz i przekazuje prąd lub, w przypadku klawiszy nie wciśniętych, brak prądu. Rezultatem jest, we współczesnych terminach, 5-bitowe kodowanie binarne jako najmniej znaczące jako pierwsze, w którym nasz przykład „C” jest zakodowany jako 10110
.
5 bitów?
Być może myślisz, że 5 bitów, które mogą wyrazić co najwyżej 32 unikalne symbole, nie wystarczy nawet dla wszystkich angielskich liter i cyfr, nie mówiąc już o interpunkcji. Baudot miał jednak sztuczkę: jego zestaw znaków to tak naprawdę dwa odrębne zestawy: litery i
cyfry , i zdefiniował dwa specjalne kody, aby przełączać się między nimi.
Przesunięcie liter , które przełącza się w tryb liter, jest aktywowane przez naciśnięcie samego klawisza 5 ( 00001
), a przesuwanie rysunków jest aktywowane za pomocą
klawisza 4 ( 00010
).
Wyzwanie
Twoim wyzwaniem jest napisanie programu lub funkcji, która dekoduje transmisje kodu Baudot.
Prawdziwa transmisja zaczynałaby się od niektórych bitów inicjalizacyjnych oraz bitów startu i stopu przed i po każdej postaci, ale pomijamy je i martwimy się tylko o 5 unikatowych bitów dla każdej postaci. Formaty wejściowe i wyjściowe omówiono poniżej.
Kod Baudota
Istnieją dwie różne wersje kodu Baudot: kontynentalny i brytyjski. Użyjemy wersji brytyjskiej, która nie zawiera znaków takich jak „É” z francuskiego języka Baudot. Pominiemy również wszystkie symbole w wersji brytyjskiej, które nie należą do drukowanych znaków ASCII. Będziesz musiał jedynie zdekodować znaki z poniższej tabeli, z których wszystkie są drukowalnymi znakami ASCII, z wyjątkiem trzech ostatnich znaków kontrolnych, które są wyjaśnione poniżej tabeli.
Kolumna „Ltr” pokazuje znaki w trybie Letter, a „Fig” pokazuje znaki w trybie 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
Ostatnie trzy wiersze w prawej kolumnie to znaki kontrolne:
ER
to Kasowanie . Maszyny telegraficzne Baudota wydrukowałyby gwiazdkowy symbol dla tej postaci, aby powiedzieć czytelnikowi, że poprzedni znak powinien zostać zignorowany, ale będziemy jeszcze przyjemniejsi dla czytelnika i faktycznie pominiemy (nie drukujemy) poprzedniego znaku . Działa tak samo w trybie literowym i cyfrowym.FS
jest Przesunięcie Figury . To przełącza zestaw znaków z liter na cyfry. Jeśli dekoder jest już w trybie cyfrowym, FS jest traktowany jako spacja (ergoSP
w kolumnie „Ltr”). Gdy dekoder znajduje się w trybie cyfrowym, pozostaje w trybie cyfrowym do momentu otrzymania znaku LS.LS
to Przesunięcie liter . Przełącza zestaw znaków z cyfr na litery. Jeśli dekoder jest już w trybie Letter, LS jest traktowany jako spacja . W trybie Letter dekoder pozostaje w trybie Letter, dopóki nie zostanie odebrany znak FS.
Dekoder zawsze uruchamia się w trybie Letter.
Oto przykład z przesunięciem cyfr, przesunięciem liter i spacją:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
To daje komunikat MAY 15TH
. Jak widać, pierwszy 00001
znak (Shift / Spacja) działa jak spacja, ponieważ dekoder jest już w trybie Letter. Następny znak 00010
(Przesunięcie figury / spacja) przełącza dekoder w tryb rysowania, aby wydrukować 15
. Następnie 00001
pojawia się ponownie, ale tym razem działa jak Przesunięcie litery, aby ponownie ustawić dekoder w trybie Letter.
Dla Twojej wygody, oto znaki w formacie, który być może łatwiej jest przetrawić w edytorze, posortowane według kodu:
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
Wkład
Dane wejściowe będą ciągiem, tablicą lub listą bitów w kolejności od najmniej znaczącego bitu do pierwszej. Każda postać będzie reprezentowana przez kwintet 5 bitów. Bity mogą być w dowolnym rozsądnym formacie, np. Ciąg binarny, tablica 0
s i 1
s, ciąg "0"
i "1"
znaków, pojedyncza bardzo duża liczba itp., Pod warunkiem, że mapuje bezpośrednio na bity transmisji.
Każda transmisja będzie miała co najmniej jeden kwintet do wydruku i co najwyżej 255 kwintetów (do wydruku lub w inny sposób), tj. 5–1 275 bitów włącznie.
Dane wejściowe mogą zawierać tylko bity transmisji, z dwoma dopuszczalnymi wyjątkami: Dowolna liczba 0
bitów wiodących lub końcowych i / lub, w przypadku danych wejściowych, do transmisji może zostać dodany pojedynczy znak nowej linii. Wiodących lub końcowych bitów lub znaków nie można dodawać przed każdym kwintetem ani po nim, tzn. Nie można uzupełnić każdego kwintetu do 8 bitów (lub wziąć każdy kwintet jako pojedynczą liczbę w tablicy - chyba że w Twoim języku jest 5-bitowa liczba całkowita) lub osobno kwintety z dowolnymi dodatkowymi bitami, np "01111\n11100"
.
Notatki i etui na brzeg
Transmisja będzie zawierać tylko znaki w kolumnach „Ltr” i „Fig” w powyższej tabeli. Nigdy nie otrzymasz np.
01110
W trybie rysowania, ponieważ nie ma go w kolumnie „Rys.”.Zakłada się, że dekoder zawsze będzie w trybie Letter na początku transmisji. Jednak pierwszym znakiem może być znak FS, który natychmiast przełącza się w tryb figurki.
Gdy dekoder jest w trybie Letter, może otrzymać znak LS, a gdy jest w trybie Figure, może otrzymać znak FS. W obu przypadkach należy wydrukować znak spacji (patrz Wyjście).
Postać ER nigdy nie będzie pierwszą postacią w transmisji, ani nie będzie natychmiast następować po LS, FS lub innym ER.
Postać FS może natychmiast następować po znaku LS i odwrotnie.
Ani znak LS, ani FS nie będzie ostatnim znakiem w żadnej transmisji.
/
I-
postacie mogą być otrzymane zarówno w trybie tekstowym (kody11000
i10001
, odpowiednio) lub w trybie rysunku (10111
a00111
).
Wydajność
Dane wyjściowe mogą mieć dowolny rozsądny format, przy czym najbardziej rozsądnym jest ASCII (lub UTF-8, dla którego wszystkie reprezentowane znaki są takie same jak ASCII). Proszę wskazać w swojej odpowiedzi, czy dane wyjściowe są w innym kodowaniu lub formacie.
Notatki
- Znak spacji (patrz 3. powyżej) powinien być spacją ASCII (0x20) lub ekwiwalentem twojego kodowania, tzn. Tym, co otrzymasz po naciśnięciu spacji.
Zwycięski
To jest golf golfowy . Najkrótszy kod w bajtach wygrywa.
Ograniczenia
Standardowe luki są zabronione.
Dozwolone są końcowe spacje i / lub pojedyncza nowa linia. Wiodące spacje lub inne postacie (które nie są częścią transmisji) są niedozwolone.
Nie możesz używać żadnych wbudowanych funkcji bibliotecznych, które dekodują kod Baudot (lub któregokolwiek z jego potomków, np. Kod Murraya, ITA-1 itp.).
Przypadki testowe
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
jest wymieniony tak jak SP
w trybie literowym i FS
trybie cyfrowym. Zgodnie z opisem, jeśli jesteśmy w trybie literowym i otrzymujemy kod 00010
, powinniśmy przejść do trybu liczbowego, ale wartości w tabeli wydają się być odwrotnie. I odwrotnie dla 00001
.