Tracks
/
Elixir
Elixir
/
Übungen
/
Highscore
Highscore

Highscore

Lernübung

Einführung

Maps

Maps sind in Elixir die Datenstruktur, um Informationen in Schlüssel-Wert-Paaren zu speichern. In anderen Programmiersprachen sind sie auch als assoziative Arrays (PHP), Hashes (Perl 5, Raku) oder Wörterbücher (Python) bekannt.

Schlüssel und Werte können einen beliebigen Datentyp haben. Ist der Schlüssel jedoch ein Atom, können wir eine Kurzsyntax verwenden. Beim Zugriff auf eine Map oder wenn sie zurückgegeben wird, ist die Reihenfolge ihrer Einträge nicht garantiert.

Literale Schreibweise

Eine leere Map erzeugst du einfach mit %{}. Wenn wir Einträge zu einer Map hinzufügen wollen, können wir zwei Formen verwenden:

# 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}

Es gibt kein kanonisches Format. Wähle trotzdem eine einheitliche Art, die Schlüssel-Wert-Paar-Literale darzustellen.

Funktionen des Map-Moduls

Elixir bietet viele Funktionen für die Arbeit mit Maps im Map-Modul. Einige Funktionen des Map-Moduls erwarten, dass eine anonyme Funktion übergeben wird, die bei der Transformation der Map hilft.

Modulattribute als Konstanten

In Elixir können wir Modulattribute definieren, die wir als Konstanten in unseren Funktionen verwenden können.

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

Wenn sie zum Definieren von Modulkonstanten verwendet werden, können Attribute ein beliebiger Ausdruck sein, der zur Kompilierzeit ausgewertet werden kann. Nach der Kompilierung sind Modulattribute nicht mehr zugänglich, da sie während der Kompilierung expandiert werden, ähnlich wie definierte Makros in Sprachen wie C.

Anleitung

In dieser Übung implementierst du eine Möglichkeit, die Highscores für das beliebteste Spiel in deiner örtlichen Spielhalle im Blick zu behalten.

1. Definiere eine neue Highscore-Map

Um eine neue Highscore-Map zu erstellen, definiere die Funktion HighScore.new/0, die keine Argumente entgegennimmt und eine neue, leere Map mit Highscores zurückgibt.

HighScore.new()
# => %{}

2. Füge Spieler zur Highscore-Map hinzu

Um einen Spieler zur Highscore-Map hinzuzufügen, definiere HighScore.add_player/3, eine Funktion, die 3 Argumente entgegennimmt:

  • Das erste Argument ist die Map mit den Punktzahlen.
  • Das zweite Argument ist der Name eines Spielers als String.
  • Das dritte Argument ist die Punktzahl als Ganzzahl. Das Argument ist optional, implementiere das dritte Argument mit dem Standardwert 0.

Speichere die Standardpunktzahl für den Anfang in einem Modulattribut. Du wirst sie später noch brauchen.

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. Entferne Spieler aus der Highscore-Map

Um einen Spieler aus der Highscore-Map zu entfernen, definiere HighScore.remove_player/2, eine Funktion, die 2 Argumente entgegennimmt:

  • Das erste Argument ist die Map mit den Punktzahlen.
  • Das zweite Argument ist der Name des Spielers als String.
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. Setze die Punktzahl eines Spielers zurück

Um die Punktzahl eines Spielers zurückzusetzen, definiere HighScore.reset_score/2, eine Funktion, die 2 Argumente entgegennimmt:

  • Das erste Argument ist die Map mit den Punktzahlen.
  • Das zweite Argument ist der Name des Spielers als String, dessen Punktzahl du zurücksetzen möchtest.

Die Funktion sollte auch funktionieren, wenn der Spieler noch keine Punktzahl hat.

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. Aktualisiere die Punktzahl eines Spielers

Um die Punktzahl eines Spielers zu aktualisieren, indem du etwas zur vorherigen Punktzahl hinzufügst, definiere HighScore.update_score/3, eine Funktion, die 3 Argumente entgegennimmt:

  • Das erste Argument ist die Map mit den Punktzahlen.
  • Das zweite Argument ist der Name des Spielers als String, dessen Punktzahl du aktualisieren möchtest.
  • Das dritte Argument ist die Punktzahl, die du zur gespeicherten Punktzahl addieren möchtest.

Die Funktion sollte auch funktionieren, wenn der Spieler noch keine vorherige Punktzahl hat. Geh davon aus, dass die vorherige Punktzahl 0 ist.

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. Hole eine Liste der Spieler

Um eine Liste der Spieler zu erhalten, definiere HighScore.get_players/1, eine Funktion, die 1 Argument entgegennimmt:

  • Das erste Argument ist die Map mit den Punktzahlen.
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"]
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Highscore zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.