Skip to content

Instantly share code, notes, and snippets.

@codecademydev
Created November 19, 2022 17:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codecademydev/9ba79bdc5df962648619d7604e39f708 to your computer and use it in GitHub Desktop.
Save codecademydev/9ba79bdc5df962648619d7604e39f708 to your computer and use it in GitHub Desktop.
Codecademy export
// Returns a random DNA base from the array
const returnRandomBase = () => {
const dnaBases = ["A", "T", "C", "G"];
return dnaBases[Math.floor(Math.random() * 4)];
};
// Returns a random single stand of DNA containing 15 bases
const mockUpStrand = () => {
const newStrand = [];
for (let i = 0; i < 15; i++) {
newStrand.push(returnRandomBase());
}
return newStrand;
};
const mutateFn = (arr) => {
elToMutate = arr[Math.floor(Math.random() * 15)];
const index = arr.indexOf(elToMutate);
if (elToMutate === "A") {
arr[index] = ["C", "G", "T"][Math.floor(Math.random() * 3)];
}
if (elToMutate === "C") {
arr[index] = ["A", "G", "T"][Math.floor(Math.random() * 3)];
}
if (elToMutate === "G") {
arr[index] = ["C", "A", "T"][Math.floor(Math.random() * 3)];
}
if (elToMutate === "T") {
arr[index] = ["C", "G", "A"][Math.floor(Math.random() * 3)];
}
return arr;
};
const pAequorFactory = (num, arr) => {
const obj = {
specimenNum: num,
dna: arr,
mutate() {
mutateFn(arr);
},
compareDNA(object) {
let comp1 = this.dna;
let comp2 = object.dna;
let totalNum = 0;
for (i = 0; i < comp1.length; i++) {
for (j = 0; j < comp2.length; j++) {
if (comp1[i] === comp2[j]) {
totalNum++;
}
}
}
const percentage = (totalNum / comp1.length).toFixed(2) + "%";
},
returnComparedDNA(object) {
let similar = 0;
object.dna.forEach((base, idx) => {
if (base === object.dna[idx]) {
similar++;
}
});
return similar;
},
willLikelySurvive() {
let cgTotal = 0;
for (i = 0; i < this.dna.length; i++) {
if (this.dna[i] === "C" || this.dna[i] === "G") {
cgTotal++;
}
}
const cgPercentage = 0.6 * this.dna.length;
return cgTotal >= cgPercentage ? true : false;
},
complementStrand() {
let complementaryStrand = [];
for (let i = 0; i < this.dna.length; i++) {
if (this.dna[i] === "A") {
complementaryStrand.push("T");
} else if (this.dna[i] === "T") {
complementaryStrand.push("A");
} else if (this.dna[i] === "C") {
complementaryStrand.push("G");
} else if (this.dna[i] === "G") {
complementaryStrand.push("C");
} else complementaryStrand.push(this.dna[i]);
}
return complementaryStrand;
},
};
return obj;
};
const createPool = () => {
const survivingSpecimen = [];
let i = 1;
while (survivingSpecimen.length < 30) {
let sample = pAequorFactory(i, mockUpStrand());
if (
sample.willLikelySurvive() &&
survivingSpecimen.indexOf(sample) === -1
) {
survivingSpecimen.push(sample);
i++;
}
}
return survivingSpecimen;
};
const mostRelatedSpecimen = () => {
const survivingSpecimen = createPool();
let instance1;
let instance2;
let similarity = 0;
survivingSpecimen.forEach((el) => {
survivingSpecimen.forEach((el2) => {
if (
el2.returnComparedDNA(el) > similarity &&
el.specimenNum !== el2.specimenNum
) {
similarity = el2.returnComparedDNA(el);
instance1 = el.specimenNum;
instance2 = el2.specimenNum;
}
});
});
console.log(
`Two most related specimen of P. aequor are ${instance1} and ${instance2} with ${similarity}% DNA in common.`
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment