Misi
Seperti diketahui, materi genetik semua makhluk yang dikenal di Bumi dikodekan dalam DNA; menggunakan empat nukleotida adenin, timin, sitosin, dan guanin. (Biasa diwakili oleh ATGC).
Seorang ahli bioinformatika yang ingin menyimpan seluruh genom tentu saja tidak ingin menyimpan ini sebagai ASCII, karena setiap pilihan dapat diwakili oleh hanya dua bit!
Spesifikasi
Misi Anda, jika Anda memilih untuk menerimanya, adalah menulis sepasang program, fungsi atau metode untuk mengubah representasi ASCII menjadi representasi biner dan kembali; mewakili A
sebagai b00
, T
sebagai b01
, G
sebagai b10
, dan C
sebagai b11
(selanjutnya "unit").
Selain itu, bit tinggi setiap byte harus berisi jumlah unit dalam byte, membuat setiap byte mewakili triplet.
Misalnya: "GATTACCA"
menjadi b11 100001 b11 010011 b10 1100xx
.
Dalam ASCII ke input biner, spasi, tab, dan baris baru harus diabaikan. Karakter apa pun yang tidak ada dalam set [ \r\n\tATGC]
adalah kesalahan dan dapat diabaikan atau dihentikan pemrosesan.
Dalam input biner ke ASCII, byte yang dua bit tingginya b00
dapat diabaikan.
Output ASCII dapat berisi spasi putih; tetapi tidak boleh lebih dari 4 kali ukuran input biner ditambah satu byte panjang, dan harus diakhiri dengan baris baru.
Output biner dapat berisi jumlah b00xxxxxx
byte "kontrol" yang sewenang-wenang ; tetapi tidak boleh lebih dari input ASCII.
Setiap program konversi harus mendukung input dengan panjang sewenang-wenang; dan harus menyelesaikan encoding atau decoding dalam waktu yang kurang lebih linier.
Twist
Sayangnya untuk ahli bioinformatika untuk siapa Anda melakukan tugas ini, ia dalam beberapa cara telah menganiaya Anda, pada tingkat pribadi namun mungkin kecil.
Mungkin dia pernah berkencan dengan kakakmu, dan tidak pernah memanggilnya lagi. Mungkin dia menginjak ekor anjing Anda. Spesifikasinya tidak terlalu penting.
Yang penting adalah Anda memiliki kesempatan untuk pengembalian!
Rinciannya
Setiap konversi harus menghasilkan tingkat kesalahan kecil; pada urutan satu kesalahan per sepuluh ribu hingga satu juta unit diproses.
Kesalahan dapat berupa salah satu dari yang berikut:
- Kesalahan duplikasi:
"GAT TAC CA"
menjadi"GAT TAA CCA"
- Kesalahan penghapusan:
"GAT TAC CA"
menjadi"GAT TAC A"
- Kesalahan terjemahan:
"GAT TAC CA"
menjadi"GTA TAC CA"
- Duplikasi triplet:
"GAT TAC CA"
menjadi"GAT TAC TAC CA"
- Slippage triplet:
"GAT TAC CA"
menjadi"TAC GAT CA"
- Pembalikan triplet:
"GAT TAC CA"
menjadi"GAT CAT CA"
Kesalahan itu akan diperkenalkan tentu saja tidak harus segera jelas dari kode; dan terlepas dari panjang input; konversi harus menghasilkan setidaknya satu kesalahan.
Dua proses dengan input yang identik tidak harus menghasilkan output yang identik.
Trik-nya
Bioinformatis vile adalah pembuat kode yang kompeten; dan dengan demikian, beberapa konstruksi akan ditemukan secara otomatis, dan karenanya dilarang:
- Dia akan secara otomatis menemukan panggilan ke generator nomor acak sistem, seperti rand (), random (), atau membaca dari / dev / urandom atau / dev / random (atau apa pun yang setara dengan bahasa).
- Dia juga akan melihat adanya variabel, penghitung atau loop berlebih.
Penilaian
Encoder dan decoder akan dinilai secara individual.
Masing-masing akan dijalankan 3 kali terhadap 100 file input yang dihasilkan secara acak, masing-masing file dengan ukuran 3 juta unit.
Data untuk kasus uji enkoder akan dibuat kira-kira seperti itu:
for (l = 1 => bigNum)
for (t = 1 => 20)
random_pick(3,ATGC)
t == 20 ? newline : space
Data untuk kasus uji dekoder akan dibuat kira-kira seperti itu:
for (u = 1 => bigNum)
for (t = 1 => 20)
random_byte() | 0b11000000
0x00
Encoder
- Setiap byte yang hilang dari panjang minimum yang diharapkan pada panjang aktual akan mencetak -1 poin, hingga maksimum -1000. (Panjang minimum yang diharapkan adalah
ceil(count(ATGC) / 3)
.)
Dekoder
- Setiap byte melebihi panjang maksimum yang diharapkan dalam panjang aktual akan mencetak -1 poin, hingga maksimum -1000. (Panjang maksimum yang diharapkan adalah
size(input) * 4 + 1
.)
Kedua
- Setiap jenis kesalahan yang dapat dihasilkan akan mendapat skor 100 poin; untuk total 600 poin yang mungkin untuk masing-masing, total 1200.
- Setiap test case dimana encoder menghasilkan lebih dari 30% kesalahan lebih atau kurang dari rata-rata sendiri akan dihukum oleh -5 poin.
- Setiap test case dimana encoder menghasilkan kesalahan kurang dari 15% lebih atau kurang dari rata-rata sendiri akan diberikan 5 poin.
- Setiap test case di mana ketiga berjalan menghasilkan output yang identik akan dikenakan sanksi oleh -10 poin.
Persyaratan sulit
Entri akan didiskualifikasi jika:
- Untuk input yang valid lebih dari satu triplet, gagal menghasilkan bahkan satu kesalahan.
- Kinerjanya sedemikian rupa sehingga tidak dapat menyelesaikan tantangan pengujian dalam waktu sekitar satu jam.
- Ini rata-rata menghasilkan lebih dari satu kesalahan dalam setiap sepuluh ribu unit.
- Ini rata-rata menghasilkan kurang dari satu kesalahan dalam setiap juta unit.
Antarmuka
Peserta harus menerima input pada input standar, dan output ke output standar.
Jika entri adalah satu program dengan fungsi ganda; switch -e
dan masing-masing -d
harus mengatur program untuk encoding dan decoding.
Contoh doa:
$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin
Pemenang
Pemenangnya adalah entri dengan skor tertinggi; maksimum teoritis adalah 1200 untuk jenis kesalahan ditambah 3000 poin untuk stabilitas dalam tingkat pembangkitan kesalahan.
Dalam hal yang tidak mungkin terjadi seri; pemenang akan ditentukan oleh jumlah suara.
Catatan tambahan
Untuk keperluan menjalankan tantangan pengujian, setiap entri harus menyertakan instruksi jalankan atau kompilasi.
Semua entri sebaiknya dijalankan pada mesin Linux tanpa X.
sumber
Jawaban:
Perl 5.10
Saya senang mempersembahkan solusi saya di Perl.
Ketika saya memulai tantangan saya cukup yakin bahwa Perl akan tetap di bawah batas 1 jam.
Untuk tujuan pengujian saya mengembangkan generator sampel polos dan generator sampel berkode.
Kemudian saya mengembangkan encoder yang membutuhkan upaya lebih besar dan menghasilkan kode yang lebih panjang. Encoder berfungsi sebagai berikut:
Output biner yang dikodekan diformat sebagai "garis" yang diakhiri baris baru dari 20 oktet di mana setiap oktet mengkodekan satu triplet, dengan dua karakter awalan (seperti nomor baris siklikal).
misalnya, input tiga byte terpendek :
harus memberikan output terpendek tiga byte plus baris baru.
itu adalah
dan
harus memberikan biner berikut.
Haruskah karena tingkat kesalahan kecil: Untuk input terkecil, skrip memperkenalkan 1 kesalahan.
Untuk menjalankan file 3 juta triplets, encoder memperkenalkan 11 kesalahan.
Asalkan skripnya adalah dnacodec3.pl, proses dijalankan pada prompt perintah seperti biasa:
Dekoder berfungsi sebagai berikut:
Saya menyiapkan file tes sampel 3 juta kembar tiga (sekitar 12MByte) dan diuji waktunya. Menggunakan laptop saya dengan Intel Core i5 vPro pada 2,6 GHz, proses encoder 3M selalu membutuhkan waktu kurang dari 20 detik. Selama menjalankannya dibutuhkan 200-220 MByte RAM. Sayang sekali!
Proses dekode memakan waktu kurang dari 10 detik. Itu tidak dapat memperkenalkan kesalahan ... untuk saat ini.
Sekali lagi, untuk menjalankan decoding
Ini kodenya
Dan inilah contoh generatornya:
sumber