Come forse saprai, nel DNA ci sono quattro basi: adenina ( A
), citosina ( C
), guanina ( G
) e timina ( T
). Tipicamente si A
lega T
e si C
lega G
, formando i "pioli" della struttura a doppia elica del DNA .
Definiamo il complemento di una base come base a cui si lega - ovvero il complemento di A
is T
, il complemento di T
is A
, il complemento di C
is G
e il complemento di G
is C
. Possiamo anche definire il complemento di una stringa di DNA come stringa con ciascuna base integrata, ad esempio il complemento di GATATC
is CTATAG
.
A causa della struttura a doppio filamento del DNA, le basi su un filamento sono complementari alle basi sull'altro filamento. Tuttavia il DNA ha una direzione e la trascrizione del DNA avviene in direzioni opposte sui due filamenti. Quindi i biologi molecolari sono spesso interessati al complemento inverso di una stringa di DNA - letteralmente il contrario del complemento della stringa.
Per estendere il nostro esempio precedente, il complemento inverso di GATATC
è CTATAG
all'indietro, quindi GATATC
. Come avrai notato, in questo esempio il complemento inverso è uguale alla stringa originale - chiamiamo tale stringa un palindromo inverso . *
Data una serie di DNA, riesci a trovare la sottostringa più lunga che è un palindromo inverso?
* Uso il termine "palindromo inverso", tratto da Rosalind , per differenziarlo dal solito significato di palindromo.
Ingresso
L'input sarà una singola stringa composta solo da caratteri ACGT
maiuscoli. Puoi scrivere una funzione o un programma completo per questa sfida.
Produzione
È possibile scegliere di stampare tramite stampa o ritorno (quest'ultima scelta è disponibile solo nel caso di una funzione).
Il tuo programma dovrebbe produrre la sottostringa palindromica inversa più lunga della stringa di input, se esiste una soluzione unica. Se esistono più soluzioni, è possibile produrre ciascuna di esse o tutte (a scelta). I duplicati vanno bene se si sceglie di emetterli tutti.
L'ingresso è garantito per avere una soluzione di almeno lunghezza 2.
Esempio lavorato
ATGGATCCG -> GGATCC
Il complemento inverso di GGATCC
è stesso ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), quindi GGATCC
è un palindromo inverso.GATC
è anche un palindome inverso, ma non è il più lungo.
Casi test
AT -> AT
CGT -> CG
AGCA -> GC
GATTACA -> AT, TA
ATGGATCCG -> GGATCC
CCCCCGGGGG -> CCCCCGGGGG
ACATATATAGACT -> ATATAT, TATATA
ATTCGATCTATGTAAAGAGG -> TCGA, GATC
CGCACGTCTACGTACCTACGTAG -> CTACGTAG
TCAATGCATGCGGGTCTATATGCAT -> ATGCAT, GCATGC [, ATGCAT]
CGCTGAACTTTGCCCGTTGGTAGAACGGACTGATGTGAACGAGTGACCCG -> CG, GC, TA, AT [, GC, CG, CG, CG, CG]
CTCGCGTTTGCATAACCGTACGGGCGGAACAGTCGGCGGTGCCTCCCAGG -> CCGTACGG
punteggio
Questo è il golf del codice, quindi vince la soluzione nel minor numero di byte.