Kurzusok
/
Elixir
Elixir
/
Feladatok
/
Csúcspontszám
Csúcspontszám

Csúcspontszám

Tanulófeladat

Bevezetés

Map-ek

Az Elixirben a map-ek az adatszerkezet, amely kulcs-érték párokban tárolja az információt. Más nyelvekben ezeket asszociatív tömböknek (PHP), hash-eknek (Perl 5, Raku) vagy szótáraknak (Python) is nevezhetik.

A kulcsok és az értékek bármilyen adattípusúak lehetnek, de ha a kulcs atom, használhatunk rövidített szintaxist. A map-ek nem garantálják a bejegyzések sorrendjét sem eléréskor, sem visszaadáskor.

Literál formák

Egy üres mapet egyszerűen a %{} szintaxissal deklarálunk. Ha elemeket szeretnénk hozzáadni egy map literálhoz, két formát használhatunk:

# If the key is an atom:
%{atom_key: 1}

# If the key is a different type:
%{1 => :atom_value}

# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}

Bár nincs kanonikus formátum, válassz egy következetes módot a kulcs-érték literálpárok ábrázolására.

A Map modul függvényei

Az Elixir számos függvényt kínál a map-ekkel való munkához a Map modulban. A Map modul egyes függvényei névtelen függvényt várnak paraméterként, amely segít a map átalakításában.

Modulattribútumok mint konstansok

Az Elixirben definiálhatunk modulattribútumokat, amelyek konstansként használhatók a függvényeinkben.

defmodule Example do
  # Defines the attribute as the value 1
  @constant_number 1

  def example_value() do
    # Returns the value 1
    @constant_number
  end
end

Amikor modulkonstansok definiálására használjuk őket, az attribútumok bármilyen kifejezés lehetnek, amely kiértékelhető fordítási időben. A fordítás után a modulattribútumok nem érhetők el, mert a fordítás során kifejtődnek, akárcsak a C-hez hasonló nyelvekben a definiált makrók.

Utasítások

Ebben a feladatban egy módot valósítasz meg arra, hogy számon tartsd a helyi játékterem legnépszerűbb játékának csúcspontszámait.

1. Definiálj egy új csúcspontszámok mapjét

Egy új csúcspontszámok mapjének létrehozásához definiáld a HighScore.new/0 függvényt, amely nem vesz át egyetlen argumentumot sem, és egy új, üres csúcspontszámok mapjét adja vissza.

HighScore.new()
# => %{}

2. Adj hozzá játékosokat a csúcspontszámok mapjéhez

Ahhoz, hogy felvegyél egy játékost a csúcspontszámok mapjébe, definiáld a HighScore.add_player/3 függvényt, amely 3 argumentumot vesz át:

  • Az első argumentum a csúcspontszámok mapje.
  • A második argumentum a játékos neve stringként.
  • A harmadik argumentum a pontszám egész számként. Ez az argumentum opcionális, ezért a harmadik argumentumot 0 alapértelmezett értékkel valósítsd meg.

Az alapértelmezett kezdőpontszámot modulattribútumban tárold. Később még szükség lesz rá.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}

3. Távolíts el játékosokat a csúcspontszámok mapjéből

Ahhoz, hogy eltávolíts egy játékost a csúcspontszámok mapjéből, definiáld a HighScore.remove_player/2 függvényt, amely 2 argumentumot vesz át:

  • Az első argumentum a csúcspontszámok mapje.
  • A második argumentum a játékos neve stringként.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}

4. Állítsd vissza egy játékos pontszámát

Egy játékos pontszámának visszaállításához definiáld a HighScore.reset_score/2 függvényt, amely 2 argumentumot vesz át:

  • Az első argumentum a csúcspontszámok mapje.
  • A második argumentum annak a játékosnak a neve stringként, akinek a pontszámát vissza szeretnéd állítani.

A függvénynek akkor is működnie kell, ha a játékosnak még nincs pontszáma.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}

5. Frissítsd egy játékos pontszámát

Ahhoz, hogy egy játékos pontszámát a korábbi pontszámhoz hozzáadva frissítsd, definiáld a HighScore.update_score/3 függvényt, amely 3 argumentumot vesz át:

  • Az első argumentum a csúcspontszámok mapje.
  • A második argumentum annak a játékosnak a neve stringként, akinek a pontszámát frissíteni szeretnéd.
  • A harmadik argumentum az a pontszám, amelyet a tárolt csúcspontszámhoz hozzá szeretnél adni.

A függvénynek akkor is működnie kell, ha a játékosnak nincs korábbi pontszáma: ilyenkor feltételezd, hogy a korábbi pontszám 0.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}

6. Kérd le a játékosok listáját

Ahhoz, hogy megkapd a játékosok listáját, definiáld a HighScore.get_players/1 függvényt, amely 1 argumentumot vesz át:

  • Az első argumentum a csúcspontszámok mapje.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elixir Exercism

Készen állsz elkezdeni a(z) Csúcspontszám feladatot?

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