Місія
Як відомо, генетичний матеріал усіх відомих на Землі істот кодується в ДНК; з використанням чотирьох нуклеотидів аденину, тиміну, цитозину та гуаніну. (Зазвичай представлений ATGC).
Біоінформатик, що бажає зберігати цілий геном, звичайно, не хотів би зберігати це як ASCII, оскільки кожен вибір може бути представлений лише двома бітами!
Специфікація
Якщо ви вирішите прийняти це, ваша місія полягає в тому, щоб написати пару програм, функцій або методів для перетворення представлення ASCII у бінарне представлення і назад; представляючи A
як b00
, T
як b01
, G
як b10
і C
як b11
(відтепер "одиниці").
Крім того, високі біти кожного байта повинні містити кількість одиниць у байті, завдяки чому кожен байт являє собою триплет.
Наприклад: "GATTACCA"
стає b11 100001 b11 010011 b10 1100xx
.
У ASCII до двійкового введення пробіли, вкладки та нові рядки слід ігнорувати. Будь-який символ, який не міститься в наборі, [ \r\n\tATGC]
є помилкою і може бути ігнорований або припинено обробкою.
У вході двійкового до ASCII байти, два великих біта яких b00
можуть бути проігноровані.
Вихід ASCII може містити пробіли; але ніколи не повинен бути більше 4-кратного розміру двійкового вводу плюс один байт, і повинен закінчуватися новим рядком.
Двійковий вихід може містити довільну кількість b00xxxxxx
"керуючих" байтів; але ніколи не повинно бути довше входу ASCII.
Кожна програма перетворення повинна підтримувати введення довільної довжини; і має завершити кодування або декодування приблизно за лінійний час.
Закрутка
На жаль для біоінформатиста, щодо якого ви виконуєте це завдання, він якимось чином образив вас на особистому, але, можливо, дріб'язковому рівні.
Можливо, він один раз вийшов з вашою сестрою і більше ніколи не подзвонив їй. Можливо, він наступив на хвіст вашої собаки. Специфіка не дуже важлива.
Важливо, що у вас є шанс на окупність!
Деталі
Кожна конверсія повинна вводити невеликий показник помилок; на порядок однієї помилки на десять тисяч до мільйона опрацьованих одиниць.
Помилка може бути однією з таких:
- Помилки дублювання:
"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"
Ці помилки будуть введені, звичайно, не повинні бути очевидними з коду; і незалежно від довжини вводу; конверсія повинна ввести принаймні одну помилку.
Два прогони з однаковими входами не повинні обов'язково давати однакові виходи.
Хитрість
Голосний біоінформатик - помірно компетентний кодер; і як такий, деякі конструкції будуть автоматично виявлені, і як такі заборонені:
- Він автоматично виявить будь-які виклики до системних генераторів випадкових чисел, таких як rand (), random (), або зчитування з / dev / urandom або / dev / random (або будь-якого мовного еквівалента).
- Він також помітить будь-які зайві змінні, лічильники чи петлі.
Оцінка балів
Кодер і декодер оцінюються індивідуально.
Кожен буде запускатися 3 рази проти набору 100 випадково генерованих вхідних файлів, розмір кожного файлу розміром близько 3 мільйонів одиниць.
Дані для тестових випадків кодера будуть створені приблизно так:
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
Кодер
- Кожен байт, відсутній від очікуваної мінімальної довжини фактичної довжини, набере -1 бал, максимум до -1000. (Очікувана мінімальна довжина
ceil(count(ATGC) / 3)
.)
Дешифратор
- Кожен байт за очікувану максимальну довжину фактичної довжини набере -1 бал, максимум до -1000. (Очікувана максимальна довжина
size(input) * 4 + 1
.)
І те й інше
- Кожен вид помилки, який може бути допущений, набере 100 балів; за 600 можливих балів за кожну, 1200 всього.
- Кожен тестовий випадок, для якого кодер видає більше 30% більше або менше помилок, ніж його власне середнє значення, буде накладено штрафом на -5 балів.
- Кожен тестовий випадок, для якого кодер видає менше 15% більше або менше помилок, ніж його власне середнє значення, отримуватиме 5 балів.
- Кожен тестовий випадок, коли всі три запуски дають однакові результати, буде накладено штрафом на -10 балів.
Жорсткі вимоги
Запис буде дискваліфіковано, якщо:
- Для будь-якого дійсного введення, тривалішого за один триплет, він не може створити навіть одну помилку.
- Його продуктивність така, що він не може завершити випробувальну рукоятку протягом приблизно однієї години.
- Він в середньому створює більше однієї помилки кожні десять тисяч одиниць.
- Він в середньому створює менше однієї помилки на кожні мільйон одиниць.
Інтерфейс
Вступники повинні прийняти вхід на стандартному вході та вивести на стандартний вихід.
Якщо запис - одна програма з подвійною функцією; комутатори -e
і -d
повинні встановити програму для кодування та декодування відповідно.
Приклад викликів:
$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin
Переможець
Переможець - запис із найвищим балом; теоретичний максимум - 1200 для видів помилок плюс 3000 балів для стабільності швидкості генерації помилок.
У навряд чи випадку розіграшу; переможець визначатиметься підрахунком голосів.
Додаткові примітки
Для цілей запуску тестової рукоятки кожен запис повинен містити інструкції із запуску чи компіляції.
Усі записи бажано виконувати на машині Linux без X.