Hamming

Hamming

Facile

Introduction

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 :)

Instructions

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.

Notes d'implémentation

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.

Les pièges courants à éviter

Il existe quelques règles empiriques pour Option :

  1. Si tu n'en as pas besoin, ne l'utilise pas. Au lieu de
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
  1. On peut utiliser les monades dans une for-comprehension, FTW. C'est conseillé quand tu veux « composer » plusieurs instances de Option. Au lieu de
val 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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Scala Exercism

Prêt à commencer Hamming ?

Inscris-toi sur Exercism pour apprendre et maîtriser Scala avec 95 exercices, et un vrai mentorat humain, le tout gratuitement.