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 jakSP
w trybie literowym iFS
trybie cyfrowym. Zgodnie z opisem, jeśli jesteśmy w trybie literowym i otrzymujemy kod00010
, powinniśmy przejść do trybu liczbowego, ale wartości w tabeli wydają się być odwrotnie. I odwrotnie dla00001
.Odpowiedzi:
Pyth,
98979593908380 bajtówKod zawiera znaki niedrukowalne, więc oto odwracalny
xxd
zrzut heksowy:Wypróbuj online. Zestaw testowy.
Dość długi, ale tabela odnośników zajmuje
większośćmiejsca.Dla 117 bajtów jest to ta sama rzecz bez drukowalnych (wymaga jednak ISO-8859-1):
Lub, dla 93 bajtów, bez kompresji w tabeli odnośników:
źródło
JavaScript (ES6),
160158153 bajtówźródło
Partia,
306304 bajtówPobiera dane wejściowe na STDIN. Ponieważ Batch nie ma konwersji binarnej, muszę go sfałszować za pomocą konwersji ósemkowej i szesnastkowej.
0
). Możliwe są następujące wartości00
,01
,10
i11
. Te dwie ostatnie mają wartość8
i9
ale chcę2
albo3
więc biorę modulo pozostałą6
.14
czy252
czasy ich pożądanej wartości, aby zabrać modulo pozostałą14
(252=14*18
).c
jest zakodowanym łańcuchemr
jest jak dotąd wynikiemd
jest tablicą dekodującąs
jest indeksem (uwzględniającym stan przesunięcia) znaku, który przełącza stan przesunięcian
jest dekodowaniem binarnym plus bit 5s
, który albo jest równy stanowi przesunięcia, w którym to przypadku stan przesunięcia jest przełączany, albo indeksuje się do tablicy dekodującej, aby znaleźć następny znak (lub! aby usunąć)źródło
PHP, 206 bajtów
źródło
Chip , 1069 bajtów
Wielkie, ale fajnie było pisać.
Pobiera dane wejściowe jako ciąg
"1"
„s"0"
” i „s”. (Chociaż tak naprawdę wygląda tylko na niski bit.)Wypróbuj online!
Uwaga: Erasure używa znaku cofnięcia ASCII (
\x08
), co oznacza, że będą wyglądać śmiesznie w TIO, ale dobrze wyglądają, powiedzmy, w xterm.Podstawowa struktura
Na górze, powyżej
=
linii, znajduje się dekoder wejściowy. Przekształca sygnał wejściowy w jeden z 32 oddzielnych sygnałów. Są one wysyłane zo
powyższych powyżej=
do poniższych.Trójkątne góry
L
iR
tylko obracają wzór z oddzielnych rzędów do kolumn. Poniższa siatka tłumaczy każdą kolumnę na znak wyjściowy. Dla nieznanych sygnałów\x00
generowana jest NUL ( ). W przypadku specjalnych przesunięć zamiast drukowania znaku mała kropelka po prawej stronie zmienia tryb.Podobne do wagonika między dwoma górami tłumi wszelkie nadruki między każdym kwintetem, w przeciwnym razie próbowałoby to również dekodować wszystkie nakładające się kwintety. Spróbuj zamienić na
!
spację, aby zobaczyć to na własne oczy. (Uruchomienie w trybie pełnym-v
może również być tutaj interesujące).W tej chwili nie jestem pewien, jak to zmniejszyć; jest już dość gęsty jak na swój rozmiar.
źródło
GNU sed, 334 + 1 = 335 bajtów
+1 bajt dla
-r
flagi. Pobiera dane wejściowe na STDIN.Patrząc na stare wyzwania, zdałem sobie sprawę, że z sedem będzie to całkiem łatwe i dobre do ćwiczeń. Nie próbowałem żadnej kompresji, więc tabela odnośników zawiera ponad połowę kodu.
Wypróbuj online!
Wyjaśnienie
Kod działa w dwóch fazach: po pierwsze, zastępuje każdy ciąg 5 cyfr binarnych odpowiednimi dwoma znakami (literą i cyfrą) z tabeli odnośników. Tabela przeglądowa ma format 𝟎𝟎𝟎𝟎𝟎𝐋𝐅𝟎𝟎𝟎𝟎𝟎𝐋𝐅… gdzie 𝟎 jest cyfrą binarną, a 𝐋 i 𝐅 są odpowiednio literą i cyfrą.
%
oznacza brakujące znaki (może to być dowolny znak inny niż nowa linia).FS/SP
jest reprezentowany przezf<space>
iSP/LS
jest<space>l
.ER
jest reprezentowany przez<<
.Następnie przechodzi przez każdą parę za pomocą „kursora” odpowiadającego bieżącemu
#
trybowi - w trybie literowym,@
w trybie cyfrowym.#
Kursor usuwa drugą postać pary, a następnie przejście do następnej pary i@
usuwanie pierwszego i postęp. Innymi słowy,#A1B8
staje sięA#B8
i wtedyAB#
, i@A1B8
staje się1@B8
i wtedy18@
. Kiedy#
kursor napotkaf<space>
, usuwa go i zastępuje się@
kursorem, i na odwrót, gdy@
napotyka<space>l
.Gdy nie ma już par, ostatni kursor jest usuwany wraz ze znakami, po których następuje
<
.źródło