← Catalogo
IPRB
PyJS

Mendel's First Law

HeredityProbability

Pagina originale su rosalind.info

Descrizione

Data una popolazione composta da individui omozigoti dominanti, eterozigoti e omozigoti recessivi per un dato fattore, il problema chiede la probabilità che l'incrocio casuale di due organismi produca un discendente che possieda almeno un allele dominante (e quindi mostri il fenotipo dominante).

Given

Tre interi positivi k, m, n che rappresentano una popolazione di k+m+n organismi: k individui omozigoti dominanti, m eterozigoti, n omozigoti recessivi.

Return

La probabilità che due organismi scelti casualmente per l'accoppiamento producano un individuo con almeno un allele dominante. Si assume che ogni coppia di organismi possa accoppiarsi.

Sample Dataset

2 2 2

Sample Output

0.78333

La mia esecuzione

08/24/2026 11:24:47

Input · dataset.txt

23 27 15
soluzione 0.80997

Output · run_log.txt

OK
0.80997

Esegui nel browser · Pyodide

Mostra il codice sorgente (problem.py)
filename = "dataset.txt"
with open(filename) as f:
    #k are homozygous dominant for a factor
    #m are heterozygous
    #n are homozygous recessive.
    k, m, n = f.readline().split(" ")

K = "k"
M = "m"
N = "n"

elems = {K: int(k), M: int(m), N: int(n)}
tipi = {"k":["A","A"], "m":["A","B"], "n":["a","a"] }
incroci = [[i, j] for i in [K, M, N] for j in [K, M, N]]

#Possibilita favorevoli
count = 0
#Possibilita totali
tot = 0 
for i in range(len(incroci)):
    first = incroci[i][0]
    second = incroci[i][1]

    #Calcolo le combinazioni (l'ordine non mi interessa) possibili per tutti gli incroci 
    #I due tipi possono essere uguali o diversi e il calcolo cambia
    if first == second:
       multiplier = (elems[first] * (elems[second]-1))/2
    else: 
       multiplier = (elems[first] * elems[second])/2
    
    #An organism only needs to possess one copy of the dominant allele 
    #to display the trait represented by the dominant allele    
    for couple in [[tipi[first][i], tipi[second][j]] for i in [0, 1] for j in [0, 1]]:
        if "A" in couple:
           count += multiplier 
        tot += multiplier  

result = count/tot
#Arrotondamento 
result = int(result * 100000) / 100000
print(result)


     
 

Soluzione JavaScript

Esegui ora, live

Mostra il codice sorgente
// Mendel's First Law (Rosalind ID: IPRB) - soluzione JavaScript
// indipendente, non una trascrizione di problem.py: stessa logica
// (per ogni possibile coppia di tipi genotipici k/m/n, calcola il
// "peso" delle coppie di individui che la generano e conta quante delle
// 4 combinazioni gametiche risultanti portano almeno un allele
// dominante "A"), riscritta in modo idiomatico per JS.
//
// Nota sull'arrotondamento: come altrove, int(x*1e5)/1e5 in Python è un
// troncamento (non un round), riprodotto qui con Math.trunc.
//
// Contratto: riceve il contenuto testuale di dataset.txt, restituisce
// l'output testuale (stessa forma dell'output Python).
const TIPI = { k: ["A", "A"], m: ["A", "B"], n: ["a", "a"] };
const CHIAVI = ["k", "m", "n"];

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

export default function solve(datasetText) {
  const parti = datasetText.split("\n")[0].trim().split(/\s+/);

  if (parti.length !== 3 || parti.some((p) => !/^\d+$/.test(p))) {
    throw new Error(`Input non valido: attesi tre interi "k m n", ricevuto "${parti.join(" ")}"`);
  }

  const [k, m, n] = parti.map(Number);
  const elems = { k, m, n };

  let count = 0;
  let tot = 0;

  for (const first of CHIAVI) {
    for (const second of CHIAVI) {
      const multiplier =
        first === second
          ? (elems[first] * (elems[second] - 1)) / 2
          : (elems[first] * elems[second]) / 2;

      for (let i = 0; i <= 1; i++) {
        for (let j = 0; j <= 1; j++) {
          const coppia = [TIPI[first][i], TIPI[second][j]];
          if (coppia.includes("A")) count += multiplier;
          tot += multiplier;
        }
      }
    }
  }

  const result = count / tot;
  const troncato = Math.trunc(result * 100000) / 100000;

  return `${formatta(troncato)}\n`;
}