← Catalogo
Fuori dal set ufficiale Rosalind
PyJS

2 Example Finding a Motif in DNA

Nota importante

Anche questo esercizio non fa parte del set ufficiale di problemi di rosalind.info. Fa parte della stessa competizione esterna "Bioinformatics Contest 2018" (Bioinformatics Institute + Rosalind + Stepik), ospitata su Stepik (https://stepik.org/course/4377), e non ha una pagina enunciato permanente su rosalind.info. Il nome ricalca quello del problema ufficiale Rosalind "Finding a Motif in DNA" (SUBS), ma è un esercizio distinto proposto nell'ambito del contest.

Descrizione (dedotta dal contenuto di input.txt e dal codice)

Dato un testo di DNA (o simile) e un pattern da cercare, trovare tutte le posizioni in cui il pattern compare come sottostringa nel testo — analogo al problema SUBS ufficiale di Rosalind, ma con un formato di input/output specifico per il contest.

Formato dell'input (dedotto)

n
<stringa di testo lunga>
<pattern da cercare>

Consulta enunciato.md della cartella "Finding a Motif in DNA" (problema SUBS ufficiale di Rosalind) per la logica generale del problema di ricerca di sottostringhe, che qui viene applicata con un formato di dataset diverso.

La mia esecuzione

08/24/2026 11:24:47

Nessun dataset.txt personale trovato per questo problema.

Output · run_log.txt

OK
3 10 49 153 176 206 213 262 278 285 301 308 371 411 608 624 718 736 752 759 793 845
15 34 49 56 117 193 218 254 261 268 313 371 406 413 446 453 512 519 562 614 658 673 680 736 770 777 848
38 47 65 104 121 227 244 278 285 297 304 319 346 353 360 367 382 419 440 489 496 511 591 609 629 649 698 705 749 765 772
30 81 96 106 129 146 192 220 329 424 490 643 714 759 809 832
29 58 78 103 130 149 259 266 405 420 450 554 570 585 630 665 714 729
3 88 95 110 205 255 333 351 488 512 519 578 604 612 633 640 670 705 713 720 771 779
19 155 202 217 224 236 284 340 391 398 419 426 435 454 461 482 566 583 638 645 696 712 736
155 162 222 304 477 484 527 555 570 585 592 618 625 648 686 755 830 837 860
2 34 71 136 183 199 242 280 295 304 341 396 461 479 494 501 518 560 567 574 662 705 712 722 729 755 773 809
20 38 45 74 81 96 129 185 192 264 271 287 294 328 365 372 401 408 415 422 437 562 610 660 755 770 785 827 887 897

Esegui nel browser · Pyodide

Mostra il codice sorgente (problem.py)
def lettura(filename):
    with open(filename) as f:
        data = []
        for riga in f:
               riga = riga.rstrip("\n")
               data.append(riga)
    return data

def elab(s, t):
    #print("s={} t={}".format(s,t))
    arr = [] 
    l = len(t)
    for i in range(len(s)-l+1):
        #print("i={}".format(i))
        #print("s[i:i+l]={}".format(s[i:i+l]))
        if s[i:i+l] == t:
           arr.append(i+1)
    return arr

def main():
    data = lettura("input.txt")
    n = int(data[0])
    #print("n={}".format(n))
    for i in range(1, 2*n+1, 2):
        s = data[i]
        t = data[i+1]
        arr = elab(s, t)
        if len(arr) > 0:
           msg = str(arr[0])
           for j in range(1, len(arr)):
               msg += " " + str(arr[j])
           print(msg)

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

Soluzione JavaScript

Esegui ora, live

Mostra il codice sorgente
// Contest 2 - Example Finding a Motif in DNA (Bioinformatics Contest
// 2018, fuori dal set ufficiale Rosalind) - soluzione JavaScript
// indipendente, non una trascrizione di problem.py: stessa logica
// (prima riga = numero di casi n, poi n coppie di righe "s" e "t";
// per ciascuna coppia stampa le posizioni 1-indexed dove t compare in
// s, oppure nessuna riga se non compare mai), riscritta in modo
// idiomatico per JS.
//
// Contratto: riceve il contenuto testuale del file di input (per questo
// problema si chiama input.txt, non dataset.txt - gestito dal manifest,
// non da questo modulo), restituisce l'output testuale (stessa forma
// dell'output Python).
function posizioni(s, t) {
  const arr = [];
  const l = t.length;
  for (let i = 0; i <= s.length - l; i++) {
    if (s.slice(i, i + l) === t) arr.push(i + 1);
  }
  return arr;
}

export default function solve(datasetText) {
  const data = datasetText.split("\n").map((r) => r.replace(/\r$/, ""));
  const n = Number(data[0]?.trim());

  if (!Number.isInteger(n) || n < 0) {
    throw new Error(`Input non valido: attesa una prima riga con un intero, ricevuto "${data[0]}"`);
  }

  const righeOutput = [];
  for (let i = 1; i <= 2 * n; i += 2) {
    const s = data[i] ?? "";
    const t = data[i + 1] ?? "";
    const arr = posizioni(s, t);
    if (arr.length > 0) {
      righeOutput.push(arr.join(" "));
    }
  }

  return righeOutput.join("\n") + "\n";
}