A tested sejtekből áll, amelyek DNS-t tartalmaznak. Ezek a sejtek rendszeresen elhasználódnak, és pótlásra szorulnak, amit úgy oldanak meg, hogy leánysejtekre osztódnak. Sőt, egy átlagos emberi szervezetben egy élet során körülbelül 10 billiárd sejtosztódás megy végbe!
Amikor a sejtek osztódnak, a bennük lévő DNS is megkettőződik. Néha ilyenkor hibák csúsznak be, és egy-egy DNS-darab hibás információval kódolódik. Ha összehasonlítunk két DNS-szálat, és megszámoljuk a köztük lévő eltéréseket, láthatjuk, hány hiba történt. Ezt nevezik „Hamming-távolságnak”.
A Hamming-távolság a tudomány számos területén hasznos, nem csak a biológiában, szóval jó, ha ismered ezt a kifejezést :)
Számítsd ki két DNS-szál Hamming-távolságát.
A DNS-t a C, A, G és T betűkkel olvassuk le. Két szál így nézhet ki:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
7 különbség van köztük, ezért a Hamming-távolság 7.
A Hamming-távolság csak egyenlő hosszúságú sorozatokra értelmezett, ezért ha két különböző hosszúságú sorozat között próbáljuk kiszámítani, annak nem szabad működnie.
Az Option olyan számítást jelöl, amelynek esetleg nincs hasznos eredménye
(például hiba vagy érvénytelen bemenet miatt).
Ha még nem ismered az Option típust, elolvashatod ezt az útmutatót.
Az Option egy úgynevezett monád, amely egy „számítási szempontot” fed le, jelen esetben azt, hogy egy érték hiányozhat.
A monádok helyes használata nagyon tömör, mégis elegáns
és olvasható kódot eredményezhet. A helytelen használat könnyen az ellenkezőjét hozhatja.
Nézd meg ezt a videót, hogy többet megtudj.
Néhány ökölszabály segít az Option használatában:
def add1(x: Int): Option[Int] = Some(x + 1)
jobb, ha ezt írod:
def add1(x: Int): Int = x + 1
(erre való az Option.map, amivel az ilyen egyszerű függvényeket alkalmazhatod,
így nem kell őket Option értékekkel teletűzdelned).
2. Ne „csomagold ki” az értéket, ha valójában nincs rá szükséged.
Az esetedre gyakran vannak beépített függvények. A korai
kicsomagolás jele lehet az isDefined/isEmpty vagy a mintaillesztés. Ahelyett, hogy
val x: Option[Int] = ...
if (x.isDefined) x.get + 1 else 0
// or
x match {
case Some(n) => n + 1
case None => 0
}
jobb, ha ezt írod:
x map (_ + 1) getOrElse 0
Option példányt szeretnél „összefűzni”. Ahelyett, hogyval xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...
xo.flatMap(x =>
yo.flatMap(y =>
zo.map(z =>
x + y + z)))
jobb, ha ezt írod:
for {
x <- xo
y <- yo
z <- zo
} yield x + y + z
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Scala nyelvet 95 feladat segítségével, valódi emberi mentorálással, mindez ingyen.