Ton corps est constitué de cellules qui contiennent de l'ADN. Ces cellules s'usent régulièrement et doivent être remplacées, ce qu'elles font en se divisant en cellules filles. En fait, en moyenne, le corps humain connaît environ 10 millions de milliards de divisions cellulaires au cours d'une vie !
Lorsque les cellules se divisent, leur ADN se réplique aussi. Parfois, pendant ce processus, des erreurs se produisent et des fragments d'ADN isolés se retrouvent encodés avec une information incorrecte. Si on compare deux brins d'ADN et qu'on compte les différences entre eux, on peut voir combien d'erreurs se sont produites. C'est ce qu'on appelle la « distance de Hamming ».
La distance de Hamming est utile dans de nombreux domaines scientifiques, pas seulement en biologie, donc c'est une expression qu'il est bon de connaître :)
Calcule la distance de Hamming entre deux brins d'ADN.
On lit l'ADN à l'aide des lettres C, A, G et T. Deux brins peuvent ressembler à ceci :
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
Ils présentent 7 différences, donc la distance de Hamming est de 7.
La distance de Hamming n'est définie que pour des séquences de même longueur, donc essayer de la calculer entre des séquences de longueurs différentes ne doit pas fonctionner.
Option sert à indiquer un calcul qui peut éventuellement ne pas avoir de résultat utile
(par exemple à cause d'une erreur ou d'une entrée invalide).
Si tu ne connais pas Option, tu peux lire ce tutoriel.
Option est ce qu'on appelle une monade qui recouvre un « aspect calculatoire », en l'occurrence l'absence éventuelle d'une valeur.
Un usage correct des monades peut donner du code très concis, tout en restant élégant
et lisible. Un usage incorrect peut facilement donner l'inverse.
Regarde cette vidéo pour en savoir plus.
Il existe quelques règles empiriques pour Option :
def add1(x: Int): Option[Int] = Some(x + 1)
il vaut mieux écrire
def add1(x: Int): Int = x + 1
(il y a Option.map pour appliquer ce genre de fonctions simples,
tu n'as donc pas besoin de les encombrer avec Option).
2. Ne « unwrap » pas si tu n'en as pas vraiment besoin.
Il existe souvent des fonctions intégrées pour ce que tu veux faire. Les signes d'un
« unwrap » prématuré sont isDefined/isEmpty ou le filtrage par motif. Au lieu de
val x: Option[Int] = ...
if (x.isDefined) x.get + 1 else 0
// or
x match {
case Some(n) => n + 1
case None => 0
}
il vaut mieux écrire
x map (_ + 1) getOrElse 0
Option. Au lieu deval xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...
xo.flatMap(x =>
yo.flatMap(y =>
zo.map(z =>
x + y + z)))
il vaut mieux écrire
for {
x <- xo
y <- yo
z <- zo
} yield x + y + z
Inscris-toi sur Exercism pour apprendre et maîtriser Scala avec 95 exercices, et un vrai mentorat humain, le tout gratuitement.