前書き
この課題では、対角線のバロウズウィーラー変換を解きます。以下は、対角バロウズ・ウィーラー変換とは何かの一般的な概要です。メッセージをエンコードするには、最初にメッセージの長さが奇数(5、7、9など)であることを保証する必要があります。その後、あなたは、グリッドを作るn
ことにより、n
場所、n
メッセージの長さがあります。最初の行は元のメッセージです。その後の各行はその上の行ですが、1文字左にシフトし、最初の文字が後ろに移動します。例えば:
Hello World
ello WorldH
llo WorldHe
lo WorldHel
o WorldHell
WorldHello
WorldHello
orldHello W
rldHello Wo
ldHello Wor
dHello Worl
次に、NWの各文字をSE対角線上に取り、新しい文字列に入れます。
Hello World H
ello WorldH l
llo WorldHe o
lo WorldHel W
o WorldHell r
WorldHello d
WorldHello e
orldHello W l
rldHello Wo (space)
ldHello Wor o
dHello Worl l
エンコードされたメッセージはHloWrdel ol
です。デコードするには、まずエンコードされたメッセージの長さを取得し、1を追加して2で除算しx
ます。この番号を呼び出しましょう。これx
で、最初の文字から始めて、各文字がx
最後の文字の後にループしていることがわかりました。例えば:
H l o W r d e l o l
1
Then...
H l o W r d e l o l
1 2
And again...
H l o W r d e l o l
1 3 2
Until you get...
H l o W r d e l o l
1 3 5 7 9 11 2 4 6 8 10
今すぐ正しい順序で文字を並べ替えてHello World
ください!
チャレンジ
あなたの課題は、2つのプログラム、関数、またはそれぞれの1つを書くことです。ただし、両方とも同じ言語を使用する必要があります。最初のプログラムは、STDIN、プログラム引数、または関数パラメーターを介して文字列を入力として受け入れ、このメソッドを使用してエンコードします。2番目のプログラムは、STDIN、プログラム引数、または関数パラメーターを介して入力として文字列を受け入れ、このメソッドを使用してそれをデコードします。
必要条件
最初のプログラム/機能
- 上記の方法を使用した単一の文字列入力。
- 対角線のBurrows-Wheeler変換スタイルを使用して文字列をエンコードする必要があります。
2番目のプログラム/機能
- 上記の方法を使用した単一の文字列入力。
- 対角線のBurrows-Wheeler変換スタイルを使用して文字列をデコードする必要があります。
制約
- このタスクを実行する組み込み関数または外部関数は使用できません。
- 標準の抜け穴は許可されていません。
- 両方のプログラム/機能は同じ言語である必要があります。
得点
これはコードゴルフであるため、バイト単位の最短プログラムが優先されます。
さらに情報を追加する必要がある場合は、コメントを残してください!