Kurzusok
/
Scala
Scala
/
Feladatok
/
Nukleotidszámlálás
Nukleotidszámlálás

Nukleotidszámlálás

Közepes

Utasítások

Mindannyian örököljük a biológiai szüleinktől azokat a kémiai utasításokat, amelyeket DNS-nek nevezünk, és amelyek meghatározzák, hogyan épül fel a testünk. Minden ismert élet a DNS-től függ!

Megjegyzés: Nem kell semmit tudnod a nukleotidokról vagy a DNS-ről ahhoz, hogy megoldd ezt a feladatot.

A DNS más vegyületek hosszú lánca, amelyben a négy nukleotid a legfontosabb: az adenin, a citozin, a guanin és a timin. Egyetlen DNS-lánc több milliárd ilyen nukleotidot is tartalmazhat, és nagyon számít, milyen sorrendben követik egymást! A DNS egy szakaszán a nukleotidok sorrendjét „DNS-szekvenciának” nevezzük.

A DNS-szekvenciát úgy ábrázoljuk, hogy ezt a négy nukleotidot rendezett gyűjteményként kezeljük, amit általában karakterek egy string-jével adunk meg; egy 6 nukleotidból álló DNS-szekvenciát például az „ATTACG” ír le. Az 'A' az adenint, a 'C' a citozint, a 'G' a guanint, a 'T' pedig a timint jelöli.

Adott egy DNS-szekvenciát képviselő string; számold meg, hogy az egyes nukleotidokból mennyi található benne. Ha a string olyan karaktereket tartalmaz, amelyek nem A, C, G vagy T, akkor az érvénytelen, és hibát kell jelezned.

Például:

"GATTACA" -> 'A': 3, 'C': 1, 'G': 1, 'T': 2
"INVALID" -> error

Az Either gyakori használata, hogy olyan számítást jelöljünk vele, amely hibát eredményezhet (ha a tényleges hiba nem érdekes, akkor az egyszerűbb Option típus jobb választás lehet). Hiba hiányában az eredmény általában egy Right (emlékeztetőül: a »helyes« érték), míg egy hiba egy Left, például egy Left[String], amely hibaüzenetet tartalmaz. Jegyezd meg, hogy a Scala 2.12-ben az Either alapértelmezés szerint jobbra döntő, így a várt módon működik olyan műveleteknél, mint a filter, a map, a flatMap, vagy egy for-kifejezésben. Ha nem ismered az Either-t, elolvashatod ezt az útmutatót. De vedd figyelembe, hogy ez az útmutató a 2.12 előtti Scala-verziókról szól. A Scala 2.12-ben nyugodtan figyelmen kívül hagyhatod a RightProjection-t, és elhagyhatod a .right-ot. Az Either egy úgynevezett monád, amely egy »számítási aspektust« fed le, jelen esetben a hibakezelést. 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 eredményezheti. Nézd meg ezt a videót, hogy többet tudj meg.

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

Néhány ökölszabály vonatkozik az Either-re:

  1. Ha nincs rá szükséged, ne használd. Ahelyett, hogy
def add1(x: Int): Either[String, Int] = Right(x + 1)

jobb, ha ezt írod:

def add1(x: Int): Int = x + 1

(van Either.map, amellyel ilyen egyszerű függvényeket alkalmazhatsz, így nem kell őket Either-rel teletűzdelned). 2. Ne »csomagold ki«, ha valóban nincs rá szükséged. Gyakran vannak beépített függvények a célodra. A korai kicsomagolás jelei az isLeft/isRight vagy a mintaillesztés. Például ahelyett, hogy

val x: Either[String, Int] = ...

if (x.isRight) x.right.get + 1 else x.left.get
// or
x match {
  case Right(n) => n + 1
  case Left(s) => s
}

jobb, ha ezt használod:

x fold (identity, _ + 1)
  1. A monádokat for-kifejezésen belül is használhatod, ami nagyszerű. Ez akkor ajánlott, ha több Either példányt szeretnél »összeállítani«. Ahelyett, hogy
val xo: Either[String, Int] = ...
val yo: Either[String, Int] = ...
val zo: Either[String, Int] = ...

xo.flatMap(x =>
  yo.flatMap(y =>
    zo.map(z =>
	    x + y + z)))

jobb, ha ezt használod:

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) Nukleotidszámlálás 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.