Kurzusok
/
Gleam
Gleam
/
Feladatok
/
DNS-kódolás
DNS-kódolás

DNS-kódolás

Tanulófeladat

Bevezetés

Bittömbök

A bináris adatokkal való munka trükkös lehet, ezért a Gleam egy BitArray típust és a hozzá tartozó szintaxist kínálja, amellyel bináris adatokat hozhatsz létre, és mintaillesztést végezhetsz rajtuk.

A bittömb-literálokat a <<>> szintaxissal definiálod. A bittömb-literál szegmensekből épül fel. Minden szegmens egy értékből és egy annotációból áll, amelyeket : választ el. Az annotáció megadja, hogy hány bit kódolja az értéket, és teljesen el is hagyható, ilyenkor alapértelmezés szerint 8 bites egész szám lesz.

// This defines a bit array with three segments of a single bit each
<<0:1, 1:1, 0:1>>

// This defines a bit array with three segments of 8 bits each
<<0, 1, 0>>

A :1 típusmegadás a :size(1) írásmód rövidítése. A hosszabb szintaxist akkor kell használnod, ha a bitméret egy változóból származik.

let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>

Bináris

A bináris egész literálokat közvetlenül kettes számrendszerben is leírhatod, ha a literál elé 0b-t teszel. Ne feledd, hogy a tesztekben vagy a programodban kiíratva tízes számrendszerű számként jelennek meg.

<<0b1011:4>> == <<11:4>>
// -> True

Csonkolás

Ha a szegmens értéke túllépi a szegmens típusának kapacitását, akkor balról csonkolódik.

<<0b1011:3>> == <<0b0011:3>>
// -> True

Eléfűzés és hozzáfűzés

Egy meglévő bittömb elé és mögé is fűzhetsz a bittömb-szintaxissal. A meglévő bittömbnél a :bits annotációt kell használnod.

let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>

Összefűzés

A változókban tárolt bittömböket a bittömb-szintaxissal fűzhetjük össze. Két változó méretű bittömb összefűzésénél a :bits annotációt kell használni.

let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>

Mintaillesztés

Mintaillesztéssel értékeket is kinyerhetsz a bittömbből. Ehhez ismerned kell az egyes rögzíteni kívánt szegmensek bitszámát, egyetlen kivétellel: a :bits annotációval ismeretlen méretű bittömbön is végezhetsz mintaillesztést, de ezt csak az utolsó szegmensnél használhatod.

let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> True

Bittömbök vizsgálata

Note

Lehet, hogy a bittömbök más formátumban jelennek meg, mint amilyenben létrehoztad őket. Ez a bittömbök tanulása közben gyakran okoz zavart.

Alapértelmezés szerint a bittömbök 8 bites szegmensekben (azaz bájtokban) jelennek meg, akkor is, ha más méretű szegmensekkel hoztad létre őket.

<<2011:11>>
// -> <<251, 3:size(3)>>

Ha olyan bittömböt hozol létre, amely egy nyomtatható, UTF-8-kódolású stringet reprezentál, előfordulhat, hogy az olyan függvények, mint az io.debug, stringként jelenítik meg. Ez a Gleam belső string-reprezentációjának egyik megvalósítási részlete miatt van így.

<<>>
// -> ""

<<65, 66, 67>>
// -> "ABC"

Utasítások

A DNS-kutatólaborodban már többféle módszert is kipróbáltál, hogy tömörítsd a kutatási adataidat és tárolóhelyet spórolj. Az egyik kollégád azt javasolja, hogy alakítsd át a DNS-adatokat bináris reprezentációvá:

Nukleinsav Kód
Adenine 00
Cytosine 01
Guanine 10
Thymine 11

Elgondolkodsz rajta, hiszen ez csökkentheti a szükséges adattárolási költségeket, igaz, az emberi olvashatóság rovására. Úgy döntesz, hogy írsz egy modult az adataid kódolásához és dekódolásához, hogy felmérd a megtakarítást.

1. Nukleinsav kódolása bináris értékké

Valósítsd meg az encode_nucleotide függvényt, amely átvesz egy nukleotidot, és visszaadja a kódolt kód int értékét.

encode_nucleotide(Cytosine)
// -> 1
// (which is equal to 0b01)

2. A bináris érték dekódolása nukleinsavvá

Valósítsd meg a decode_nucleotide függvényt, amely átveszi a kódolt kód egész értékét, és visszaadja a nukleotidot.

decode_nucleotide(0b01)
// -> Ok(Cytosine)

3. DNS-lista kódolása

Valósítsd meg az encode függvényt, amely átvesz egy nukleotidlistát, és visszaad egy bittömböt a kódolt adatokból.

encode([Adenine, Cytosine, Guanine, Thymine])
// -> <<27>>

4. DNS-bittömb dekódolása

Valósítsd meg a decode függvényt, amely átvesz egy nukleinsavat reprezentáló bittömböt, és nukleotidok listájaként visszaadja a dekódolt adatokat.

decode(<<27>>)
// -> Ok([Adenine, Cytosine, Guanine, Thymine])
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Gleam Exercism

Készen állsz elkezdeni a(z) DNS-kódolás feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.