← Catalogo
TRAN
PyJS

Transitions and Transversions

Alignment

Pagina originale su rosalind.info

Descrizione

Una mutazione puntiforme può essere una transizione (sostituzione di una purina con un'altra purina, A↔G, oppure di una pirimidina con un'altra pirimidina, C↔T) o una transversione (scambio tra purina e pirimidina). Le transizioni sono più comuni delle transversioni perché richiedono un cambiamento chimico meno drastico. Il rapporto transizioni/transversioni è una statistica utile per identificare DNA codificante.

Given

Due stringhe di DNA s1 e s2 di uguale lunghezza (al massimo 1 kbp ciascuna), in formato FASTA.

Return

Il rapporto transizioni/transversioni R(s1, s2).

Sample Dataset

>Rosalind_0209
GCAACGCACAACGAAAACCCTTAGGGACTGGATTATTTCGTGATCGTTGTAGTTATTGGA
AGTACGGGCATCAACCCAGTT
>Rosalind_2200
TTATCTGACAAAGAAAGCCGTCAACGGCTGGATAATTTCGCGATCGTGCTGGTTACTGGC
GGTACGAGTGTTCCTTTGGGT

Sample Output

1.21428571429

La mia esecuzione

08/24/2026 11:24:47

Input · dataset.txt

>Rosalind_9987
GATATCAAGCCGTGGAGGCCGCTTTTTTGACCCTTGACCACGAGAACAAGGATACGAATC
TCTGAGGACATGTATACGGGATGTTCATCGGTAGTCCGCTGCACTGCATCCGAATGCCGT
GTCTTCAATGCAAACAGGCGAGCTAACTAACGTAGCCGGCGCACCGATGAACGGAAGCCT
CGAAGGGGACTCCAGCTTAAATGAGCCAAGGTGCAGCGGTGGCGCACGCACCGGCTGCCT
GGAAGTATAGTATGCGGATATAAGCGGGTTCGAAATCAACCCAAAAGCGTCACGACTCAT
CTAGTCTGGCCACAAAATCTTTTGGTTCGTGACAATTATGCAAGTCTCCTCCCTCCACAA
TCAGGGCCTCCGGGAACCTACATCTCTCACACTTTTATAGATCGTATGAAACTACGCATA
GGTGTAACTCAAGCGTTTCAGTCTTAGCCAGCCCTACAGCCGACCTTTCCGAGATAGGGG
TACTCGTGGCGCTAGTCAGAGAAAGGACGAACCTGAGGTACTAAAAGACAAAACTGAGGG
AAGCCGATCTGCTGACGAGAGTGATAGTGTTCGATAAGGCACACTCGATGTCGCTACAGC
CTCGTCATGATCTCTAAATTTGATCTTTGACCATGGTGTATGTGGAGATTAACTTGCTCA
TTGTGGGCTCTCAAGCTAGCCGCAAGAGTTACTCATCGCGATGAGCTACACGGGTGCACC
AGTGGCAGCACCCTGCGCTCGCGCGAGGAGCACCGAATTGTAACGTGTGTGGTGACATCT
ATTGATCCTTTGGGTGAAGACGCTCCACGAGCAGCCTTACATCTGTGTTAACCTGTCACC
CGCACCTTATTTGACGCAAGATTGTAAAGTAGTATGTAACGAATTGGGATCGACGAGCCG
AAACAGCGTCTTATCTT
>Rosalind_9294
AATATTAAGTCGTGGAGACTCTACTTTCGACCCCTGACAAGAAAAAGAAGGATACGGATC
CGTTATGGCACGTGTGTGGGGGCTACACAGGTAGCCCGCTGTATTGCGCCCAGATATCGC
GCTCTTAGTGCGAACCGACGAGCTATTTAACATCGTTGACGTACCGATAAACGGAAGCCA
AGAACAAAACTCGAATCTAAATGAGCTAACGTGCAGAAACGGAGCGTGCACGTGCTACTA
GCAAGAATAATGTGCGTGTATAAGGAGGTTCGGAATTAATCCAGGAGGACCATGATTAAT
CTAGCCTAGCCATGAAATCCCTCAATTTGCGACAGTTATTTACGCATCTTCCTTCTACAA
CCGGAGCCTTCGGGAAACTATGTCCCTCACGCTCTTGTGGGCCCTTTAAAACCGCGCATA
AGTGCAACTCAGGCATTTCAGTCTTGGTTGGCCTCACAGCCGGAACTTTCGAGATGTGGG
TACACATGGTACTGGTTGGAGAAGGCAGCAGACTGATATACTGGAGGACGGAGATGAGGT
GAGGTGTTCTGTTAACGAGAGTATCAGCGTTTGCCAAGGCATACTCGTTATCGCTGCAGC
TCACTACTGATCTCTATATCTAGTATTTGACCATGGTGTATGTGGAAATTAACTTGCATA
TCGCAGGCCTTCAAACTGGCCTTAACTGTTATTTACAGTGATAAGCCGAGCGGGCGCACT
CTTAGCGGTATTCTGCGTTCCGGCGAGGAGCGACGAAGCGTAACGTGTGTGGTGATACTT
AATAACCTCTTGGGTAAAGGTCCTCTACTGGCGGTACCATATTTGCGTTAGATTGTCGGC
CACACCTCATCTGAGGACGGATTTTAGGATAGTCTACGGCGAATTGGAATCGATGGGCCG
AGATGGCGACATGGTCT

Output · run_log.txt

OK
2.588235294117647

Esegui nel browser · Pyodide

Mostra il codice sorgente (problem.py)
#http://rosalind.info/problems/tran/

PURINE = {"A", "G"}
PYRIMIDINE = {"C", "T"}

def lettura(filename):
    data = []
    with open(filename) as f:
        record = ""
        first = True
        for riga in f:
            riga = riga.rstrip("\n")
            if riga[0] == ">":
                if not first:
                    data.append(record)
                record = ""
                first = False
            else:
                record += riga
    data.append(record)
    return data

def is_transition(a, b):
    return (a in PURINE and b in PURINE) or (a in PYRIMIDINE and b in PYRIMIDINE)

def main():
    seqs = lettura("dataset.txt")
    s1, s2 = seqs[0], seqs[1]
    transizioni = 0
    trasversioni = 0
    for i in range(len(s1)):
        if s1[i] != s2[i]:
            if is_transition(s1[i], s2[i]):
                transizioni += 1
            else:
                trasversioni += 1
    print(transizioni / trasversioni)

if __name__ == "__main__":
    # execute only if run as a script
    main()

Soluzione JavaScript

Esegui ora, live

Mostra il codice sorgente
// Transitions and Transversions (Rosalind ID: TRAN) - soluzione
// JavaScript indipendente, non una trascrizione di problem.py: stessa
// logica (rapporto transizioni/trasversioni tra due sequenze allineate
// della stessa lunghezza), riscritta in modo idiomatico per JS.
//
// Nota sul formato numero: come in iev.mjs, un risultato intero va
// stampato con ".0" finale per coincidere con print() di un float
// Python; altrimenti la rappresentazione "shortest round-trip" di JS
// (Number.prototype.toString) coincide di norma con quella di Python.
//
// Contratto: riceve il contenuto testuale di dataset.txt, restituisce
// l'output testuale (stessa forma dell'output Python).
const PURINE = new Set(["A", "G"]);
const PYRIMIDINE = new Set(["C", "T"]);

function parseFasta(testo) {
  const righe = testo.split("\n").map((r) => r.replace(/\r$/, ""));
  const data = [];
  let record = "";
  let first = true;
  for (const riga of righe) {
    if (riga.startsWith(">")) {
      if (!first) data.push(record);
      record = "";
      first = false;
    } else {
      record += riga;
    }
  }
  data.push(record);
  return data;
}

function isTransition(a, b) {
  return (PURINE.has(a) && PURINE.has(b)) || (PYRIMIDINE.has(a) && PYRIMIDINE.has(b));
}

function formatta(v) {
  return Number.isInteger(v) ? v.toFixed(1) : String(v);
}

export default function solve(datasetText) {
  const seqs = parseFasta(datasetText);
  const [s1, s2] = seqs;

  if (!s1 || !s2 || s1.length !== s2.length) {
    throw new Error("Input non valido: attesi due record FASTA della stessa lunghezza");
  }

  let transizioni = 0;
  let trasversioni = 0;
  for (let i = 0; i < s1.length; i++) {
    if (s1[i] !== s2[i]) {
      if (isTransition(s1[i], s2[i])) transizioni++;
      else trasversioni++;
    }
  }

  if (trasversioni === 0) {
    throw new Error("Input non valido: nessuna trasversione trovata (divisione per zero)");
  }

  return `${formatta(transizioni / trasversioni)}\n`;
}