Tu cuerpo está formado por células que contienen ADN. Esas células se desgastan con regularidad y necesitan reemplazarse, algo que logran dividiéndose en células hijas. De hecho, ¡el cuerpo humano promedio experimenta unas 10 000 billones de divisiones celulares a lo largo de la vida!
Cuando las células se dividen, su ADN también se replica. A veces, durante este proceso ocurren errores y piezas individuales de ADN quedan codificadas con información incorrecta. Si comparamos dos cadenas de ADN y contamos las diferencias entre ellas, podemos ver cuántos errores ocurrieron. Esto se conoce como la «distancia de Hamming».
La distancia de Hamming es útil en muchas áreas de la ciencia, no solo en biología, así que es una expresión que conviene conocer :)
Calcula la distancia de Hamming entre dos cadenas de ADN.
Leemos el ADN usando las letras C, A, G y T. Dos cadenas podrían verse así:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
Tienen 7 diferencias y, por lo tanto, la distancia de Hamming es 7.
La distancia de Hamming solo se define para secuencias de la misma longitud, así que un intento de calcularla entre secuencias de distinta longitud no debería funcionar.
Option se usa para indicar un cálculo que posiblemente no tenga un resultado útil
(por ejemplo, debido a un error o a una entrada no válida).
Si Option no te resulta familiar, puedes leer este tutorial.
Option es lo que se llama una mónada, que abarca un «aspecto computacional», en este caso la posible ausencia de un valor.
El uso correcto de las mónadas puede dar como resultado un código muy conciso pero elegante
y legible. El uso incorrecto puede dar fácilmente lo contrario.
Mira este video para aprender más.
Hay algunas reglas generales para Option:
def add1(x: Int): Option[Int] = Some(x + 1)
es mejor tener
def add1(x: Int): Int = x + 1
(existe Option.map para aplicar ese tipo de funciones simples,
así que no tienes que llenarlas con Option).
2. No «desenvuelvas» si en realidad no lo necesitas.
A menudo existen funciones integradas para lo que necesitas. Señales de un
desenvolvimiento prematuro son isDefined/isEmpty o la coincidencia de patrones. En lugar de
val x: Option[Int] = ...
if (x.isDefined) x.get + 1 else 0
// or
x match {
case Some(n) => n + 1
case None => 0
}
es mejor tener
x map (_ + 1) getOrElse 0
Option. En lugar deval xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...
xo.flatMap(x =>
yo.flatMap(y =>
zo.map(z =>
x + y + z)))
es mejor tener
for {
x <- xo
y <- yo
z <- zo
} yield x + y + z
Regístrate en Exercism para aprender y dominar Scala con 95 ejercicios y mentoría humana real, todo gratis.