Hintergrund
1870 erfand Émile Baudot den Baudot-Code , eine Zeichenkodierung mit fester Länge für die Telegraphie. Er entwarf den Code, der über eine manuelle Tastatur mit nur fünf Tasten eingegeben werden konnte. zwei mit der linken und drei mit der rechten Hand bedient:
Mit dem rechten Zeige-, Mittel- und Ringfinger werden die Tasten I , II und
III betätigt , mit dem linken Zeige- und Mittelfinger die Tasten
IV und Ⅴ . (Von nun an verwende ich die arabischen Ziffern (
1 bis 5) .) Zeichen werden als Akkorde eingegeben. Um beispielsweise den Buchstaben "C" einzugeben, drückt der Bediener die Tasten 1 , 3 und 4Tasten gleichzeitig, woraufhin ein rotierender Bürstenarm jede Taste der Reihe nach liest und einen Strom oder bei nicht gedrückten Tasten keinen Strom überträgt. Das Ergebnis ist in modernen Begriffen eine 5-Bit-Binärcodierung mit dem niedrigsten Stellenwert und dem ersten Stellenwert, in der unser Beispiel "C" wie folgt codiert ist 10110
.
5 bits ??
Sie könnten denken, dass 5 Bits, die höchstens 32 eindeutige Symbole ausdrücken können, nicht einmal für alle englischen Buchstaben und Ziffern ausreichen, um von Interpunktion ganz zu schweigen. Baudot hatte jedoch einen Trick im Ärmel: Sein Zeichensatz besteht eigentlich aus zwei unterschiedlichen Sätzen: Buchstaben und
Zahlen , und er definierte zwei spezielle Codes, um zwischen ihnen zu wechseln.
Die Buchstabenverschiebung , die in den Buchstabenmodus wechselt, wird durch Drücken der Taste 5 ( 00001
) und die Ziffernverschiebung durch Drücken der Taste 4 ( 00010
) aktiviert
.
Herausforderung
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die Baudot-Code-Übertragungen decodiert.
Eine echte Übertragung würde mit einigen Initialisierungsbits sowie einem Start- und Stoppbit vor und nach jedem Zeichen beginnen, aber wir werden diese überspringen und uns nur um die 5 eindeutigen Bits für jedes Zeichen kümmern. Eingabe- und Ausgabeformate werden unten erläutert.
Baudots Code
Es gibt zwei verschiedene Versionen von Baudot Code: Continental und UK Wir verwenden die UK-Version, die keine Zeichen wie "É" aus Baudots französischem Muttersprachler enthält. Wir werden auch alle Symbole in der britischen Version weglassen, die nicht zu den druckbaren ASCII-Zeichen gehören. Sie müssen nur die Zeichen in der folgenden Tabelle dekodieren. Mit Ausnahme der letzten drei Steuerzeichen, die unter der Tabelle erläutert werden, handelt es sich bei allen Zeichen um druckbare ASCII-Zeichen.
Die Spalte "Ltr" zeigt die Zeichen im Buchstabenmodus und "Fig" zeigt die Zeichen im Figurenmodus:
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
Die letzten drei Zeilen in der rechten Spalte sind Steuerzeichen:
ER
ist Löschen . Baudots Telegraphiemaschinen würden ein Sternchen-ähnliches Symbol für dieses Zeichen drucken, um dem Leser mitzuteilen, dass das vorangegangene Zeichen ignoriert werden sollte, aber wir werden dem Leser noch netter sein und das vorangegangene Zeichen weglassen (nicht drucken) . Es verhält sich sowohl im Buchstaben- als auch im Zahlenmodus gleich.FS
ist Figure Shift . Dies schaltet den Zeichensatz von Buchstaben auf Zahlen um. Wenn die Decodierer bereits in Figur Modus wird als FS behandelt Raum (ergoSP
in der „ltr“ Spalte). Wenn sich der Decoder im Figurenmodus befindet, bleibt er im Figurenmodus, bis ein LS-Zeichen empfangen wird.LS
ist die Buchstabenverschiebung . Es wechselt den Zeichensatz von Figuren zu Buchstaben. Wenn der Decoder bereits im Textmodus ist, wird LS als behandeltes Raum . Im Letter-Modus bleibt der Decoder im Letter-Modus, bis ein FS-Zeichen empfangen wird.
Der Decoder startet immer im Letter-Modus.
Hier ist ein Beispiel mit Figure Shift, Letter Shift und Space:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Dies ergibt die Nachricht MAY 15TH
. Wie Sie sehen, fungiert das erste 00001
Zeichen (Buchstabenverschiebung / Leerzeichen) als Leerzeichen, da sich der Decoder bereits im Buchstabenmodus befindet. Das nächste Zeichen 00010
(Figure Shift / Space) schaltet den Decoder zum Drucken in den Figure-Modus 15
. Dann 00001
erscheint wieder, aber dieses Mal ist es als Brief Verschiebung wirkt , um den Decoder zurück in Brief - Modus zu schalten.
Im Folgenden finden Sie die Zeichen in einem Format, das in einem Editor möglicherweise einfacher zu verarbeiten ist, sortiert nach 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
Eingang
Die Eingabe ist eine Zeichenfolge, ein Array oder eine Liste von Bits in der niedrigstwertigen Bit-First-Reihenfolge. Jedes Zeichen wird durch ein Quintett von 5 Bits dargestellt. Bits können in jedem vernünftigen Format vorliegen, z. B. als Binärzeichenfolge, als Array von 0
s und 1
s, als Zeichenfolge "0"
und "1"
Zeichen, als einzelne sehr große Zahl usw., sofern sie den Bits der Übertragung direkt zugeordnet sind.
Jede Übertragung hat mindestens ein druckbares Quintett und höchstens 255 Quintette (druckbar oder auf andere Weise), dh 5 bis einschließlich 1.275 Bit.
Die Eingabe kann nur die Bits der Übertragung enthalten, mit zwei zulässigen Ausnahmen: Der Übertragung kann eine beliebige Anzahl von führenden oder nachfolgenden 0
Bits und / oder für die Zeichenfolgeeingabe eine einzelne nachfolgende neue Zeile hinzugefügt werden. Führende oder nachfolgende Bits oder Zeichen können nicht vor oder nach jedem Quintett hinzugefügt werden, dh, Sie können nicht jedes Quintett mit 8 Bits auffüllen (oder jedes Quintett als einzelne Zahl in einem Array annehmen - es sei denn, Ihre Sprache hat einen 5-Bit-Integer-Typ) oder separat Quintette mit zusätzlichen Bits, z "01111\n11100"
.
Notizen & Rand Fällen
Die Übertragung enthält nur die Zeichen in den Spalten "Ltr" und "Fig" in der obigen Tabelle. Sie werden zB
01110
im Figurenmodus nie empfangen , da es in der "Fig" -Spalte fehlt.Es wird davon ausgegangen, dass sich der Decoder zu Beginn einer Übertragung immer im Letter-Modus befindet. Das erste Zeichen kann jedoch ein FS-Zeichen sein, um sofort in den Figurenmodus zu wechseln.
Wenn sich der Decoder im Buchstabenmodus befindet, kann er ein LS-Zeichen empfangen, und wenn er sich im Figurenmodus befindet, kann er ein FS-Zeichen empfangen. In beiden Fällen muss ein Leerzeichen gedruckt werden (siehe Ausgabe).
Das ER-Zeichen ist niemals das erste Zeichen in einer Übertragung und folgt niemals unmittelbar einem LS, FS oder einem anderen ER.
Ein FS-Zeichen kann unmittelbar auf ein LS-Zeichen folgen und umgekehrt.
Weder das LS- noch das FS-Zeichen ist das letzte Zeichen in einer Übertragung.
Die
/
und-
Zeichen kann in jedem Textmodus (Codes empfangen werden11000
und10001
, jeweils) oder Fig Modus (10111
und00111
).
Ausgabe
Die Ausgabe kann in jedem vernünftigen Format erfolgen, wobei ASCII (oder UTF-8, bei dem alle dargestellten Zeichen mit ASCII identisch sind) am vernünftigsten ist. Bitte geben Sie in Ihrer Antwort an, ob Ihre Ausgabe in einer anderen Codierung oder einem anderen Format vorliegt.
Anmerkungen
- Das Leerzeichen (siehe 3. oben) sollte ein ASCII-Leerzeichen (0x20) oder das Äquivalent Ihrer Kodierung sein, dh was Sie erhalten, wenn Sie die Leertaste drücken.
Gewinnen
Das ist Code-Golf . Der kürzeste Code in Bytes gewinnt.
Beschränkungen
Standardlücken sind verboten.
Nachgestellte Leerzeichen und / oder eine einzelne nachgestellte Zeile sind zulässig. Führende Leerzeichen oder andere Zeichen (die nicht Teil der Übertragung sind) sind nicht zulässig.
Sie dürfen keine eingebauten oder Bibliotheksfunktionen verwenden, die Baudot-Code (oder einen seiner Nachkommen, z. B. Murray-Code, ITA-1 usw.) dekodieren.
Testfälle
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
als aufgelistet SP
im Buchstabenmodus und FS
in Figur Modus. Laut Beschreibung sollten wir, wenn wir uns im Buchstabenmodus befinden und Code erhalten 00010
, in den Zahlenmodus wechseln, aber die Werte in der Tabelle scheinen umgekehrt zu sein. Auch umgekehrt für 00001
.