マンチェスターコーディングは、無線通信で使用される通信プロトコルであり、受信機がデータ自体からクロックレートを回復できるように、定期的なビット遷移を保証します。ビットレートは倍になりますが、安価で簡単に実装できます。アマチュア無線事業者によって広く使用されています。
コンセプトは非常にシンプルです。ハードウェアレベルでは、クロックラインとデータラインは単純にXORされます。ソフトウェアでは、これはビットの入力ストリームをダブルレート出力ストリームに変換し、各入力「1」は「01」に変換され、各入力「0」は「10」に変換されます。
これは簡単な問題ですが、ビットストリームの性質のため、多くの実装に開かれています。つまり、エンコードは概念的にはバイト単位のプロセスではなくビット単位のプロセスです。したがって、エンディアンネスにすべて同意し、入力の最下位ビットが出力の最下位バイトになります。
ゴルフの時間!任意の長さのバイト配列を指定すると、エンコードされたデータマンチェスターの配列を返す関数を作成します。
入力と出力は、ビットストリーム内でリトルエンディアン、最下位バイトが最初、最下位ビットが最初と見なされる必要があります。
ASCIIビットストリーム描画:
bit # 5 4 3 2 1 0 5 4 3 2 1 0
IN ------- 1 0 1 0 1 1 ---> [manchester encoder] --- 01 10 01 10 01 01 ----> OUT
例:
Example 1 (hex):
LSB MSB <-- least sig BYTE first
IN : [0x10, 0x02]
OUT: [0xAA, 0xA9, 0xA6, 0xAA]
Example 1 (binary):
msb lsb msb lsb <-- translated hex, so msb first
BIN: [00010000, 00000010] <-- least sig NIBBLE...
BIN: [10101010, 10101001, 10100110, 10101010] <-- becomes least sig BYTE
LSB MSB
Example 2
IN : [0xFF, 0x00, 0xAA, 0x55]
OUT: [0x55, 0x55, 0xAA, 0xAA, 0x66, 0x66, 0x99, 0x99]
Example 3
IN : [0x12, 0x34, 0x56, 0x78, 0x90]
OUT: [0xA6, 0xA9, 0x9A, 0xA5, 0x96, 0x99, 0x6A, 0x95, 0xAA, 0x69]
Example 4
IN : [0x01, 0x02, 0x03, 0xF1, 0xF2, 0xF3]
OUT: [0xA9, 0xAA, 0xA6, 0xAA, 0xA5, 0xAA, 0xA9, 0x55, 0xA6, 0x55, 0xA5, 0x55]
ルール:
- 解決策は、入力を出力に変換するアルゴリズムのみを必要とします。
- 入力の取得と出力の印刷はソリューションの必須部分ではありませんが、含まれる場合があります。ソリューションに含まれていない場合は、テスト/印刷コードを提供することをお勧めします。
- 入力は、テキスト文字列ではなく、8ビットバイトの配列(選択した言語で意味するものは何でも)です。言語で便利な場合は、文字列をストレージ形式として使用できますが、印刷できない文字(つまり0xFF)をサポートする必要があります。必要に応じて、入力には長さもかかる場合があります。
出力用のメモリは、提供されていないルーチンによって割り当てられる必要があります。編集:不要な要件- 出力も8ビットバイトの配列であり、必要に応じて長さです。
- 少なくとも16KBの入力をサポートする必要があります
- パフォーマンスがひどすぎてはいけません:16KBで<10秒
- メモリ内の最下位バイトが最初。
サイドチャネルの課題:
- コードの高速化、メモリ効率の向上、または小さなバイナリの生成を証明して、他のユーザーの答えに挑戦しましょう!