使命
よく知られているように、地球上のすべての既知の生物の遺伝物質はDNAにエンコードされています。アデニン、チミン、シトシン、グアニンの4つのヌクレオチドを使用します。(一般にATGCで表されます)。
ゲノム全体を保存したい生物情報学者は、もちろんこれをASCIIとして保存することを望まないでしょう。なぜなら、それぞれの選択肢はたった2ビットで表現できるからです!
仕様
あなたがそれを受け入れることを選択した場合、あなたの使命は、ASCII表現をバイナリ表現に変換して戻すための一対のプログラム、関数、またはメソッドを書くことです。A
as b00
、T
as b01
、G
as b10
、C
as b11
(以下「ユニット」)を表します。
さらに、各バイトの上位ビットにはバイト内のユニット数が含まれている必要があり、各バイトはトリプレットを表します。
たとえば、次のように"GATTACCA"
なりb11 100001 b11 010011 b10 1100xx
ます。
ASCIIからバイナリへの入力では、スペース、タブ、改行を無視する必要があります。のセットにない文字は[ \r\n\tATGC]
エラーであり、無視されるか、処理を終了します。
バイナリからASCIIへの入力では、上位2ビットが含まb00
れるバイトは無視されます。
ASCII出力には空白が含まれる場合があります。ただし、バイナリ入力のサイズの4倍に1バイトを加えた長さであってはならず、改行で終わる必要があります。
バイナリ出力には、任意の数のb00xxxxxx
「制御」バイトが含まれる場合があります。ただし、ASCII入力より長くすることはできません。
各変換プログラムは、任意の長さの入力をサポートする必要があります。エンコードまたはデコードをほぼ線形の時間で完了する必要があります。
ひねり
残念ながら、あなたがこのタスクを実行している生物情報学者にとって、彼は何らかの形であなたを不当に扱いました。
おそらく、彼はあなたの妹と一度出かけ、二度と電話をかけなかったのでしょう。おそらく彼はあなたの犬の尻尾を踏みました。詳細は本当に重要ではありません。
重要なのは、投資回収のチャンスがあるということです!
詳細
各変換では小さなエラー率が発生するはずです。処理される1万から100万単位ごとに1エラーのオーダー。
エラーは次のいずれかです。
- 複製エラー:に
"GAT TAC CA"
なります"GAT TAA CCA"
- 削除エラー:に
"GAT TAC CA"
なります"GAT TAC A"
- 翻訳エラー:に
"GAT TAC CA"
なります"GTA TAC CA"
- トリプレット重複:に
"GAT TAC CA"
なります"GAT TAC TAC CA"
- トリプレットスリッページ:に
"GAT TAC CA"
なります"TAC GAT CA"
- トリプレット反転:に
"GAT TAC CA"
なります"GAT CAT CA"
もちろん、エラーが発生することは、コードからすぐには明らかにならないはずです。入力の長さに関係なく; 変換により、少なくとも1つのエラーが発生するはずです。
同一の入力で2回実行しても、必ずしも同一の出力が生成されるとは限りません。
トリック
下劣な生物情報学者は、適度に有能なコーダーです。そのため、一部の構成要素は自動的に検出され、禁止されています。
- 彼は、rand()、random()、/ dev / urandomまたは/ dev / random(または同等の言語)からの読み取りなど、システム乱数ジェネレーターへの呼び出しを自動的に検出します。
- また、余分な変数、カウンター、またはループに気付くでしょう。
得点
エンコーダーとデコーダーは個別にスコアリングされます。
それぞれが、ランダムに生成された100個の入力ファイルのセットに対して3回実行され、各ファイルのサイズは300万単位のオーダーです。
エンコーダテストケースのデータは、およそ次のように作成されます。
for (l = 1 => bigNum)
for (t = 1 => 20)
random_pick(3,ATGC)
t == 20 ? newline : space
デコーダーテストケースのデータは、およそ次のように作成されます。
for (u = 1 => bigNum)
for (t = 1 => 20)
random_byte() | 0b11000000
0x00
エンコーダー
- 実際の長さで予想される最小長から欠落している各バイトは、最大-1000までの-1ポイントを獲得します。(予想される最小の長さは
ceil(count(ATGC) / 3)
です。)
デコーダー
- 実際の長さで予想される最大長を超える各バイトは、最大-1000までの-1ポイントを獲得します。(予想される最大長は
size(input) * 4 + 1
です。)
両方
- 発生する可能性のある各種類のエラーは、100ポイントを獲得します。それぞれ合計600ポイント、合計1200ポイント。
- エンコーダーがそれ自体の平均よりも30%以上またはそれ以下のエラーを生成する各テストケースは、-5ポイント減点されます。
- エンコーダーがそれ自体の平均よりも15%未満または少ないエラーを生成する各テストケースには、5ポイントが与えられます。
- 3つの実行すべてが同一の出力を生成する各テストケースには、-10ポイントのペナルティが科せられます。
厳しい要件
次の場合、エントリは失格となります。
- 1つのトリプレットより長い有効な入力の場合、1つのエラーも生成できません。
- そのパフォーマンスは、テストガントレットを約1時間以内に完了することができないほどです。
- 平均すると、1万単位ごとに複数のエラーが発生します。
- 平均すると、100万個ごとに1つ未満のエラーが生成されます。
インターフェース
参加者は、標準入力で入力を受け入れ、標準出力に出力する必要があります。
エントリが2つの機能を持つ1つのプログラムである場合。スイッチは、それぞれエンコードとデコードのプログラムを設定する必要が-e
あり-d
ます。
呼び出しの例:
$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin
勝者
勝者は最高得点のエントリーです。理論上の最大値は、エラーの種類が1200で、エラー生成率の安定性が3000ポイントです。
万が一の引き分けの場合。勝者は投票数によって決定されます。
追加のメモ
テストガントレットを実行するために、各エントリには実行またはコンパイルの指示を含める必要があります。
すべてのエントリは、できればXなしのLinuxマシンで実行可能である必要があります。