← Catalogo
GC
PyJS

Computing GC Content

String Algorithms

Pagina originale su rosalind.info

Descrizione

Il contenuto GC (GC-content) di una stringa di DNA è la percentuale di simboli che sono 'C' o 'G'. Le stringhe vengono fornite in formato FASTA (introdotte da una riga che inizia con '>' seguita da un'etichetta, es. "Rosalind_xxxx").

Given

Al massimo 10 stringhe di DNA in formato FASTA (di lunghezza massima 1 kbp ciascuna).

Return

L'ID della stringa con il GC-content più alto, seguito dal valore del GC-content di quella stringa (errore assoluto ammesso: 0.001).

Sample Dataset

>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT

Sample Output

Rosalind_0808
60.919540

La mia esecuzione

08/24/2026 11:24:47

Input · dataset.txt

>Rosalind_3746
CACAGCCCATTAGTGCACCATATATTGTCCACGTGGGACCTCAAAAGATGGACATGTGGG
CACCAAAGTAACTAGCGGTCGTCAAAATGCTGAACATGGCATTCAAGGTTGTCCTAGCTC
CAACTCTCAGAGAATTGGTGTAGGTATGAAGTAGCCGACCAACACTACGACCACACAAAC
CTTGCTGCTCCCTTGCGACTCCCTCTATCAATTTCGTGGTACACTCACCCCTTCGAGGAC
AGGCGCCCCCCACTTAAGTGATCCGTAAGGCTTATGCCCGTCTGTAATTGCCATAAGGCT
GTATGGGACTACAATTCCAATTTTTTAGCGAATTGCCAACACTGGGTCTATCGATGTTCG
AGACAACATGGCCGTAGCTCGTTCGCAGCCTTGCCGTATAAAAACTTTACCGAACTGGTT
ACAGGGCTGGGCACTAACTCGTATGTCGTTCAGGCGGCTATGTGAAGGCTTCTCGATTGG
TGCGCCCGATCAATTGGTAGCCGAGTGTTTAGCGGCTATGTCTTCCTCCATTTTCGGGGC
CACGACCGCGTCCCATAACGAGCTTGGGTGGGCTCAGGAATACGTAGCCCCTGCTTGTAG
TGCGCATACACGTCGACAAAGGGGGTGACAAGGTGGTATTCGGGCGTACTGCTGAGTCGA
AGTACTGTTCCTAGGGTAGACCTGTGCGGCCTTAAAGACTTCTTGGAGGCGTGGTGTAAT
GTGGGGTAGCGTTACGGGAGACCCCGAAACGGTCCAAAAAGGGTCAGCTAGTCCGGGTAA
CGCGAATGAAATGTTTACGTCAACTTCGCATATTGTAAAAGACCCCCAATCCTTTGCTTC
CATACTGCTCTGGTCCTTCTGTTGTAACGAACTCCTCAAATACGCGAGTTTATCGCCCCC
ATCTCAGTTTCCTCAC
>Rosalind_2533
GTTGACCCAGTCCATAGATCAGGAAAAAGCACTATCGCGTCCAATTACTCAAGAGGCACG
AATCAAACTGCCCAGGAAGCCTCGCAAAGATATATTTGAACTTGTTCTGATGAGGGTTAG
TTTATAGCGTTATTTCGGTTACGCGAATGAGTATAGCGTTCTAGACCAACCTCTTCTGCC
GGAAGATTGCTCAGCAATTTACTAAAACGCGTGCTATTACTGAATCGCCTGGCAAATAAT
CCTATACCCCACATCAGCTGGGACTCGAGATGAGTGGACTTAGCCTACTTTGTGAGCGGT
CATAGAATGATCGCCTGGCCACGTGGTACTACCGGCGTATTTCTACCAGCGGAACTCGGC
TGTCGTTAACGTATAATGGTTTAGAGACAATTGACCTTTTCGGACATCTCGGTATCTGCT
TTACGGAAGTCACAACGTGCTGCCGACTCGGTAACCTCATGTGAGTAGTTGTGAATACAG
TACAAAAGCATCCGGATTTCAAAACGAGCCAGGGTGTTCGAGATGACTTGACCGAGGGGC
GATGCAGTCGTCGCTCAATTGAAGGATTTGTTGTTTCCCGATTTGAGAGGTTTGGATATC
CTCCGACTGTCACTCTCATTGATGTCGGGTATTCATGCAGCTTTCTGTGCGCCTTGATTG
GACATCTTTGTGCATTAACTTGGGACAACAGAGCCTGCGCCCTCATTCAACGGGCATGAA
CGTGGGATGAAGCAGTCCAGAAGTATGCCTGAGTCCACATCTTGGGTACTGGTGAATGGG
ACAGTTTGTAATCGTCTACCTTCCCGATACCTTCTAGTATCTGGCATCTGACACCGCGCA
TAATCAGTCAGCAACGCGCTGGTGCATACCCTTCTCTAGAGAACCCCGTATTCATGATGC
GCTGAGTGATCCACTGTACTCCCAGGGGCGATAACGAGGTCGACTTGCTAAAGGGTAGTT
ATTTGCGTCTGGCAAGATCCGTAGCCTCCGC
>Rosalind_9875
ATTGTAATGATACTGAGCTTACTAGACTCTGTATCTTCACAGGCCACGGGTATGTGCGGT
GCCGAGCATCGTCCGGCTTTAGGCGTCAATGCTGTACGATATCACAGCCCTGGCCCGGCG
ACCCTTATGGGTGATGGCCCCGGTTCTCAGTAGATACGATGGCCGGGTTCTATTCCAGAC
GACACATCCCGAGCTACGCGAGGTGACAGCTCAAATTAATACGTTCCTATTTCTAGGGTT
TAACCTGGTTTGGGGTGCAGAATGAGGACAGGAGAAGTGCTCGAAGCTTTGGTCCAAATG
TTAGCTCAAAATATGGGGTCACTCTAGCATTTTGCGGGATTAATACCCCGTTACGAGGAT
CAAATAAGAGTGTTATCGGTCCTCCACCTGCGAGAGAGCCCCAGCACTATCGCCTCGTGA
AGAGGGGTGAGCAGATACACTGTTGATCTTGACTGGGAGACTTCGATCGGTCATCGAGAT
TCGGCGGTTTAATTCAACTTGGTTCCAGGTTCGGTGCAGCATCGGGCTTTGCATCTTGAT
CGACTTTACAGACGGACAGTGCCCGGTTACTCAGGATCAGACTACTCAGCCAAATGACGA
CTCTATCGCTTTACCGACTGTCACCCCTGCGACAGCATGGCCTTCTTAGCGAGGTCTAGC
CAATTTCATTGGTTTGTCATCTCTGGATGTTTGGATATTGAGCGGCACATATACCGTTAA
AGATGGCGATATATGTGCGACAGGGACTCACATACTGGCTTGTGAGTAGGAAGTGCCAGC
AAGGACGTCGGGGAATACTATTGCACACTGAGGACCACCACGGCCTTGACTGGCGTC
>Rosalind_0799
GTATGGACAGTGAGGGTAGAGGGTGGTTCGCGTTAAGACGTTGAAAAGATTAGGTGCAGG
GCACTTCAAGCCACTGGAGGGTATGGGGCGTGTATATTGACGAGCACAAGGGCATGAAGT
GTAGTGGCTTTGAGGCTGGGCTCCAAGTCAAAGGAAGTGCGGTTAGTTATGCGAAGATAA
ATACATTCAATTTCGACACTCACAACGGTACCGCCTACAACCTAAGACCTGATTAGCTGC
GCATGTCTTCTAGCCGCTCAGGTTAGGAGTGACCAGTAAGTGCCCGATTGGGGCCATGAT
GTAAGCATCACAGAGATCCCATCTAGAGCACCGTTTGGACAGTGGTGCATGGGAAACTGG
GATCAGTAACGTTGGACGGAAACGGGTTCCAGTATTTGGCCCCGATCACCTTAAGAGGTA
TTTTAACTAGTATTTACGCACGATGACGATTCCTGCCCAACTGTGATCGGCTGCATAACG
CGTGTGATCGTTCCATCAACGGTCATTCATGCATTCGGATCTGAAGGTATGTTTCGGATC
GTGTGGTGCAAGATGCGATCTGAGCAGCCACTTCGTTTGTAGGTCCCATACCTGATTGCT
TCGGGCAAGGCTCGGGAGCTCTCCGGTAGTAGCTAGTGCCCTGTTGATTCTATAACACTG
TTGCTTGTTCAGCACCTCACATGTGACCCAGGTCTTGAGCCTCTCTGAAGGGTTCTGGGC
TTCTTGGACTTGCGGTTATACCGGTTTACAGCTGGATGTAGACCATTCGAAGATTAATCA
ACACAATATGTGACCTGTATCGGCGTCGCTGGTCCGAGAACAATCTCGCGGTTAGAATGA
TTAACCCAAGCTTGCCCCTTGAACGAGGAGGTGCCGTCATTGGAGTTCGCCGGGCATCAA
TGCGAGCAGTGTGATTGGCATGCCGGTCAACCGCAATAATCGCACGCAACGGT
>Rosalind_6714
CTTGTGGTACAATCGGTGCCCCGCCGCGCCGCCGGCGGAGAAGGCATAAAAGAACGCGCC
CAGCCTACTCGACTCGATATCACCGGATGTTTCTCGCTGTGCTAACGTTTAGGTAGAGAA
AGGAATGAAAATGACAAAGCGCCTTCTTTCGTTTGTGTGCAGGTACTCGCGAACGGGAAC
CCCACTCTCGCGAACCCAGTATCCTATGCGAGCATTCAAGGCCACTCGCTAAGCGCAGAC
GTAGCTAGCGGTGACGCGGCTAGAGTAGTACTCTGTACTGAACGTGCTCTCTCATGGACT
ATTTATGTCATCAGTAATGACCAAACACTTTGAGTAAGCCGGGAGTCACATCGATAATGT
ACACGAGCACTGTACGCTGGCGCGTCGGGTCGTAACACGCGCAGCAGGTCTAAGGCCCGG
CCGAAGAAACAGTCAGCTCGTGTTGATATACGTGCAAACGTAGAAGCTCCAATTTTTATG
ATTTGTTTCTACTCGTCTAACGGAATATACGAACTGTCGTCACTTAAACATCAGTTTTAA
GCAGCAACGAACTTCAGTCGAGGAGGGTGGAAGAACGCCGTATAGTGTCGGCATGTTTGG
TCGCCCCTGTGCGTGCCCGTTGGGTTGCTCTAACTGAGTGCGAGCGCGGCTCAAGCGACC
TTTATGGGACCTATATCAGTATGAAACGGACTGCGCGCTGATGAGCACTCACCAGCTCAG
TCAGTGGACCGATAACTATCGCTCCCAGCGGTACCGCCTTGCTTATTTTCCAACCTTAGC
GGGAGCCTTCTCTCCGACGT

Output · run_log.txt

OK
Rosalind_6714
52.5
52.50

Esegui nel browser · Pyodide

Mostra il codice sorgente (problem.py)
data = []
filename = "dataset.txt"
with open(filename) as f:
    first = True
    record = {}
    for riga in f:
           riga = riga.rstrip("\n")
           if riga[0] == ">":
              riga = riga[1:] 
              if not first:
                 data.append(record)
              first = False
              record = {"header":riga}
           else:
              if not "body" in record:
                 record["body"] = riga
              else:
                 record["body"] += riga
    data.append(record)          
winner = 0
for i in range(len(data)):
    record = data[i]["body"]
    cg = 0
    for j in range(len(record)):
       if record[j]=="C" or record[j]=="G":
          cg += 1
    percent = 100 * (cg / len(record))
    data[i]["percent"] = percent
    if percent > data[winner]["percent"]:
    	  winner = i
print(data[winner]["header"])
percent = data[winner]["percent"]
percent = int(percent * 1000000) / 1000000
print(percent)
percent = (str(percent)+"000000")[:-5]
print(percent)

Soluzione JavaScript

Esegui ora, live

Mostra il codice sorgente
// Computing GC Content (Rosalind ID: GC) - soluzione JavaScript
// indipendente, non una trascrizione di problem.py: stessa logica
// (parsing FASTA multi-record, trova il record con GC-content più alto,
// stampa header + percentuale), riscritta in modo idiomatico per JS.
//
// ATTENZIONE - bug riprodotto intenzionalmente: la terza riga di
// output di problem.py usa il trucco
//   (str(percent) + "000000")[:-5]
// per forzare 6 cifre decimali. Funziona SOLO se str(percent) ha
// esattamente 5 decimali; altrimenti produce MENO di 6 decimali (es.
// "52.50" invece di "52.500000", verificato sul dataset reale di Ben).
// Qui è riprodotto fedelmente - non corretto - perché il confronto
// "Corrisponde all'output registrato" in questa pagina si basa
// sull'output REALE salvato in run_log.txt (che contiene lo stesso
// bug), non su un ipotetico output "giusto": correggerlo qui avrebbe
// rotto quel confronto.
//
// Contratto: riceve il contenuto testuale di dataset.txt, restituisce
// l'output testuale (stessa forma dell'output Python, bug compreso).
function parseFasta(testo) {
  const righe = testo.split("\n").map((r) => r.replace(/\r$/, ""));
  const data = [];
  let record = null;
  for (const riga of righe) {
    if (riga.startsWith(">")) {
      if (record) data.push(record);
      record = { header: riga.slice(1), body: "" };
    } else if (record) {
      record.body += riga;
    }
  }
  if (record) data.push(record);
  return data;
}

export default function solve(datasetText) {
  const data = parseFasta(datasetText);

  if (data.length === 0) {
    throw new Error("Input non valido: nessun record FASTA trovato");
  }

  const percents = [];
  let winner = 0;
  for (let i = 0; i < data.length; i++) {
    const body = data[i].body;
    let cg = 0;
    for (const ch of body) {
      if (ch === "C" || ch === "G") cg++;
    }
    const percent = (100 * cg) / body.length;
    percents.push(percent);
    if (percent > percents[winner]) winner = i;
  }

  const truncato = Math.trunc(percents[winner] * 1000000) / 1000000;
  const paddato = `${truncato}000000`.slice(0, -5);

  return `${data[winner].header}\n${truncato}\n${paddato}\n`;
}