Hamming

Hamming

Könnyű

Bevezetés

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

Utasítások

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.

Megvalósítási megjegyzések

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.

Gyakori buktatók, amelyeket érdemes elkerülnöd

Néhány ökölszabály segít az Option használatában:

  1. Ha nem kell, ne használd. Ahelyett, hogy
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
  1. A monádokat akár for-comprehension belsejében is használhatod. Ez a nyerő megoldás. Ez akkor ajánlott, amikor több Option példányt szeretnél „összefűzni”. Ahelyett, hogy
val 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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Scala Exercism

Készen állsz elkezdeni a(z) Hamming feladatot?

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.