Миссия
Как известно, генетический материал всех известных на Земле существ закодирован в ДНК; используя четыре нуклеотида аденин, тимин, цитозин и гуанин. (Обычно представлен 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.