La missione
Come è noto, il materiale genetico di tutte le creature conosciute sulla Terra è codificato nel DNA; usando i quattro nucleotidi adenina, timina, citosina e guanina. (Comunemente rappresentato da ATGC).
Un bioinformatico che desidera archiviare un intero genoma non vorrebbe ovviamente memorizzarlo come ASCII, perché ogni scelta può essere rappresentata da due semplici bit!
La specifica
La tua missione, se scegli di accettarla, è quella di scrivere una coppia di programmi, funzioni o metodi per convertire una rappresentazione ASCII in una rappresentazione binaria e viceversa; che rappresenta A
come b00
, T
come b01
, G
come b10
e C
come b11
(d'ora in poi "unità").
Inoltre, i bit alti di ciascun byte dovrebbero contenere il conteggio delle unità nel byte, facendo in modo che ciascun byte rappresenti una tripletta.
Ad esempio: "GATTACCA"
diventa b11 100001 b11 010011 b10 1100xx
.
Nell'input da ASCII a binario, gli spazi, le schede e le nuove righe devono essere ignorati. Qualsiasi carattere che non si trova nel set di [ \r\n\tATGC]
è un errore e può essere ignorato o terminare l'elaborazione.
Nell'input da binario a ASCII, i byte i cui due bit alti sono b00
possono essere ignorati.
L'uscita ASCII può contenere spazi bianchi; ma non dovrebbe mai essere più di 4 volte la dimensione dell'ingresso binario più un byte lungo e deve terminare con una nuova riga.
L'output binario può contenere un numero arbitrario di b00xxxxxx
byte di "controllo"; ma non deve mai essere più lungo dell'ingresso ASCII.
Ogni programma di conversione deve supportare input di lunghezza arbitraria; e dovrebbe completare la codifica o decodifica in un tempo approssimativamente lineare.
La svolta
Sfortunatamente per il bioinformatico per il quale stai svolgendo questo compito, ti ha in qualche modo fatto del male a un livello personale ma forse meschino.
Forse è uscito con tua sorella una volta e non l'ha mai più chiamata. Forse ha calpestato la coda del tuo cane. I dettagli non sono molto importanti.
Ciò che è importante è che hai una possibilità di rimborso!
I dettagli
Ogni conversione dovrebbe introdurre un piccolo tasso di errore; sull'ordine di un errore per diecimila a un milione di unità elaborate.
Un errore può essere uno dei seguenti:
- Errori di duplicazione:
"GAT TAC CA"
diventa"GAT TAA CCA"
- Errori di cancellazione:
"GAT TAC CA"
diventa"GAT TAC A"
- Errori di traduzione:
"GAT TAC CA"
diventa"GTA TAC CA"
- Duplicazioni di triplette:
"GAT TAC CA"
diventa"GAT TAC TAC CA"
- La tripletta scivola:
"GAT TAC CA"
diventa"TAC GAT CA"
- Inversioni della tripletta:
"GAT TAC CA"
diventa"GAT CAT CA"
Che errori verranno introdotti non dovrebbe ovviamente essere immediatamente evidente dal codice; e indipendentemente dalla lunghezza dell'input; la conversione dovrebbe introdurre almeno un errore.
Due corse con ingressi identici non devono necessariamente produrre uscite identiche.
Il trucco
Il vile bioinformatico è un programmatore moderatamente competente; e come tale, alcuni costrutti verranno automaticamente scoperti e come tali vietati:
- Scoprirà automaticamente tutte le chiamate ai generatori di numeri casuali di sistema, come rand (), random () o lettura da / dev / urandom o / dev / random (o qualunque sia l'equivalente della lingua).
- Noterà anche eventuali variabili, contatori o loop superflui.
Il punteggio
L'encoder e il decoder verranno assegnati individualmente.
Ciascuno verrà eseguito 3 volte contro un set di 100 file di input generati casualmente, ogni file con una dimensione dell'ordine di 3 milioni di unità.
I dati per i casi di test dell'encoder verranno creati approssimativamente in questo modo:
for (l = 1 => bigNum)
for (t = 1 => 20)
random_pick(3,ATGC)
t == 20 ? newline : space
I dati per i casi di test del decodificatore verranno creati approssimativamente in questo modo:
for (u = 1 => bigNum)
for (t = 1 => 20)
random_byte() | 0b11000000
0x00
L'encoder
- Ogni byte mancante dalla lunghezza minima prevista nella lunghezza effettiva segnerà -1 punti, fino a un massimo di -1000. (La lunghezza minima prevista è
ceil(count(ATGC) / 3)
.)
Il decodificatore
- Ogni byte oltre la lunghezza massima prevista nella lunghezza effettiva segnerà -1 punti, fino a un massimo di -1000. (La lunghezza massima prevista è
size(input) * 4 + 1
.)
Tutti e due
- Ogni tipo di errore che può essere prodotto segnerà 100 punti; per un totale di 600 punti possibili per ciascuno, 1200 totali.
- Ogni caso di test per il quale l'encoder produce più del 30% in più o in meno di errori rispetto alla propria media sarà penalizzato di -5 punti.
- Ad ogni caso di test per il quale l'encoder produce meno del 15% in più o in meno di errori rispetto alla propria media verranno assegnati 5 punti.
- Ogni caso di test in cui tutte e tre le esecuzioni producono output identici sarà penalizzato di -10 punti.
Requisiti rigidi
Un'iscrizione sarà squalificata se:
- Per qualsiasi input valido più lungo di una tripletta non riesce a produrre nemmeno un errore.
- Le sue prestazioni sono tali da non poter completare il guanto di prova entro circa un'ora.
- In media produce più di un errore ogni diecimila unità.
- In media produce meno di un errore ogni milione di unità.
L'interfaccia
I partecipanti devono accettare input sull'input standard e output sull'output standard.
Se la voce è un programma con doppia funzione; gli switch -e
e -d
dovrebbero impostare il programma per la codifica e la decodifica, rispettivamente.
Invocazioni di esempio:
$ encoder <infile.txt >outfile.bin
$ decoder <infile.bin >outfile.txt
$ recoder -e <infile.txt >outfile.bin
Il vincitore
Il vincitore è l'ingresso con il punteggio più alto; il massimo teorico è 1200 per tipi di errore più 3000 punti per stabilità nel tasso di generazione dell'errore.
Nel caso improbabile di pareggio; il vincitore sarà determinato dal conteggio dei voti.
Le note aggiuntive
Ai fini dell'esecuzione del guanto di prova, ogni voce deve includere istruzioni di esecuzione o compilazione.
Tutte le voci dovrebbero essere preferibilmente eseguibili su una macchina Linux senza X.