バックグラウンド
1870年、エミールバウドットは電報用の固定長文字エンコーディングであるバウドットコードを発明しました。彼は、5つのキーを備えた手動キーボードからコードが入力されるように設計しました。2つは左手で、3つは右手で操作しました。
右のインデックスは、ミドルと薬指が動作I、II、および
IIIそれぞれのキーを、左人差し指と中指が動作
IVとⅤを。(以降、西アラビア数字、つまり
1から5を使用します。)文字は和音として入力されます。例えば、文字「C」を入力するには、操作者が押圧1、3、及び4キーを同時に押すと、回転するブラシアームが各キーを順番に読み取り、電流を送信します。押されていないキーの場合は電流を送信しません。結果は、最新の用語では、5ビットの最下位ビット優先のバイナリエンコードになります。この例では、「C」がとしてエンコードされ10110
ます。
5ビット??
最大32個の一意の記号を表現できる5ビットでは、句読点は言うまでもなく、すべての英語の文字や数字でも十分ではないと考えているかもしれません。しかし、Baudotはスリーブを巧みに操っていました。彼のキャラクターセットは、実際にはLettersと
Figuresという2つの異なるセットであり、それらを切り替える2つの特別なコードを定義しました。
レターモードに切り替わるレターシフトは、5キーのみを押すとアクティブになり()、図シフトは4キーでアクティブになり
ます()。00001
00010
チャレンジ
あなたの課題は、Baudotコード送信をデコードするプログラムまたは関数を書くことです。
実際の送信は、いくつかの初期化ビットに加えて、各文字の前後に開始ビットと停止ビットが追加されますが、それらをスキップし、各文字の5つの一意のビットのみを心配します。入力および出力形式については以下で説明します。
バウドットのコード
Baudotコードには2つの異なるバージョンがあります。ContinentalとUK Baudotのネイティブフランス語の「É」などの文字を含まない UKバージョンを使用します。また、印刷可能なASCII文字に含まれない英国版のすべてのシンボルを除外します。下の表の文字をデコードするだけでよく、表の下に説明されている最後の3つの制御文字を除き、すべて印刷可能なASCII文字です。
「Ltr」列はレターモードの文字を示し、「図」は図モードの文字を示します。
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
右の列の最後の3行は制御文字です。
ER
ある消去は。Baudotの電信機は、この文字にアスタリスクのような記号を印刷して、先行する文字を無視することを読者に伝えますが、読者にさらに優しくして、実際に先行する文字を省略します(印刷しない)。文字モードと図モードの両方で同じように機能します。FS
である。図シフト。これにより、文字セットが文字から数字に切り替わります。デコーダーが既に Figureモードにある場合、FSはスペース(SP
「Ltr」列のエルゴ)として扱われます。デコーダーが図モードの場合、LS文字が受信されるまで図モードのままになります。LS
ある手紙シフト。文字セットを数字から文字に切り替えます。デコーダーが既にレターモードになっている場合、LSはSpaceとして扱われます。レターモードの場合、FS文字が受信されるまでデコーダはレターモードのままです。
デコーダーは常にレターモードで起動します。
以下に、Figure Shift、Letter Shift、およびSpaceの例を示します。
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
これはメッセージをもたらしますMAY 15TH
。ご覧のとおり00001
、デコーダーは既にレターモードになっているため、最初の(文字シフト/スペース)文字はスペースとして機能します。次の文字00010
(Figure Shift / Space)は、デコーダーをFigureモードに切り替えて印刷します15
。その後00001
、再び表示されますが、今回はレターシフトとして機能し、デコーダをレターモードに戻します。
便宜上、エディターでダイジェストしやすい形式の文字をコード別にソートして示します。
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
入力
入力は、文字列、配列、または最下位ビット優先順のビットのリストになります。各文字は5ビットのクインテットで表されます。ビットは、任意の合理的な形式、例えば、Aバイナリ文字列の配列であってもよく、0
Sおよび1
S、列"0"
と"1"
であれば送信のビットに直接マッピングするように、文字等、単一の非常に大きな数、。
すべての送信には、少なくとも1つの印刷可能なクインテットと最大で255のクインテット(印刷可能またはそれ以外)、つまり5〜1,275ビットが含まれます。
入力には、送信のビットのみを含めることができますが、許可される例外は2つあります。任意の数の先頭または末尾0
ビット、および/または文字列入力の場合、単一の末尾改行を送信に追加できます。各クインテットの前後に、先頭または末尾のビットまたは文字を追加することはできません。つまり、各クインテットを8ビットにパディングすることはできません(または、各クインテットを配列内の単一の数字として取ることができます(言語が5ビット整数型でない限り)追加ビットのあるクインテット"01111\n11100"
。
メモとエッジケース
送信には、上の表の「Ltr」列と「Fig」列の文字のみが含まれます。
01110
「Fig」列には存在しないため、例えばFigureモードでは受信しません 。デコーダーは、送信の開始時に常にレターモードになっていると想定されます。ただし、最初の文字は、フィギュアモードにすぐに切り替えるためのFS 文字である場合があります。
デコーダーがレターモードの場合、LS文字を受け取ることがあり、フィギュアモードの場合、FS文字を受け取ることがあります。いずれの場合も、スペース文字を印刷する必要があります(出力を参照)。
ERキャラクターは、伝送の最初のキャラクターになることはなく、LS、FS、または別のERの直後に続くこともありません。
FSキャラクターはLSキャラクターの直後に続く場合があります。
LS文字もFS文字も、送信の最後の文字にはなりません。
/
そして-
文字がいずれかの文字モード(コードで受信することができる11000
と10001
、それぞれ)または図モード(10111
と00111
)。
出力
出力は、ASCII(またはUTF-8、表現されたすべての文字がASCIIと同じ)が最も妥当な形式であれば、どのような形式でもかまいません。出力が別のエンコードまたは形式であるかどうかを回答で示してください。
ノート
- スペース文字(上記3.を参照)は、ASCIIスペース(0x20)またはエンコードに相当するもの、つまりスペースバーを押したときに得られるものでなければなりません。
勝ち
これはcode-golfです。バイト単位の最短コードが優先されます。
制限事項
標準的な抜け穴は禁止されています。
末尾のスペースおよび/または単一の末尾の改行が許可されます。先行スペースまたはその他の文字(送信の一部ではない)は許可されません。
Baudotコード(またはMurrayコード、ITA-1などの子孫)をデコードする組み込み関数またはライブラリ関数を使用することはできません。
テストケース
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
は、コードはSP
文字モードおよびFS
図モードでリストされています。説明によると、文字モードでコードを受け取った場合00010
、数字モードに移行する必要がありますが、表の値は逆になっているようです。また、逆も同様です00001
。