Tracks
/
Gleam
Gleam
/
Übungen
/
Zahlenratespiel
Zahlenratespiel

Zahlenratespiel

Lernübung

Einführung

Case-Ausdrücke

In Gleam kannst du mit einem case-Ausdruck Code bedingt ausführen. Mit einem case-Ausdruck kann ein Wert gegen ein oder mehrere Muster geprüft werden. Ein Beispiel für so ein Muster ist das Literalmuster, das einen Wert mit einem literalen Wert vergleicht (z. B. 1 oder "hello").

Case-Ausdrücke werden mit dem Schlüsselwort case geschrieben:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

Auch wenn das wie switch-Anweisungen in anderen Sprachen aussehen mag, zeigt der Musterabgleich erst seine Stärke, wenn du auch andere Muster verwendest. Ein solches Muster ist das Variablenmuster, mit dem du einer Variablen einen Wert zuweisen kannst. In diesem Beispiel bekommt die Variable i den Wert von number, wenn number nicht 0 ist:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

Manchmal möchtest du einem Muster eine zusätzliche Bedingung hinzufügen. Das nennt man einen Guard (eine Klausel), den du mit dem Schlüsselwort if hinzufügen kannst:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

Aus Performancegründen sind in Guards nur grundlegende mathematische und boolesche Operatoren erlaubt, andere Funktionen kannst du in Guards nicht verwenden.

Im obigen Beispiel gibt es nicht für jede mögliche Eingabe ein passendes Muster. Der Compiler erkennt das und gibt einen Fehler aus. Das nennt man Vollständigkeitsprüfung. Um die Warnung zu beheben, musst du alle Fälle abdecken. Dafür kannst du das Verwerfungsmuster verwenden, ein Muster, das auf jeden Wert passt:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

In einer Klausel kannst du mehrere Muster abgleichen, indem du sie mit | voneinander trennst. Pro Klausel ist nur ein Guard möglich:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

Case-Ausdrücke prüfen einen Wert von oben nach unten gegen jedes Muster, bis sie ein passendes Muster finden und die dazugehörige Logik ausführen. Die Reihenfolge der Muster ist wichtig!

Anleitung

In dieser Übung spielst du mit einer Freundin oder einem Freund ein Zahlenratespiel. Die Regeln sind einfach: du wählst heimlich eine Zahl zwischen 1 und 100 und deine Freundin oder dein Freund versucht zu erraten, welche Zahl du gewählt hast. Um deiner Freundin oder deinem Freund zu helfen, antwortest du unterschiedlich, je nachdem, wie nah der Tipp an der Zahl ist, die du gewählt hast (42). Das sind die Regeln für die verschiedenen Antworten:

  • Wenn der Tipp 42 ist: „Correct“
  • Wenn der Tipp 41 oder 43 ist: „So close“
  • Wenn der Tipp kleiner als 41 ist: „Too low“
  • Wenn der Tipp größer als 43 ist: „Too high“

Du hast vier Aufgaben, um die Antworten auf die Tipps umzusetzen.

1. Antworte auf einen richtigen Tipp

Implementiere die Funktion reply, um auf einen richtigen Tipp zu antworten:

reply(42)
// -> "Correct"

2. Antworte auf einen fast richtigen Tipp

Ändere die Funktion reply, um auf fast richtige Tipps zu antworten:

reply(41)
// -> "So close"

3. Antworte auf zu niedrige Tipps

Ändere die Funktion reply, um auf zu niedrige Tipps zu antworten:

reply(25)
// -> "Too low"

4. Antworte auf zu hohe Tipps

Ändere die Funktion reply, um auf zu hohe Tipps zu antworten:

reply(88)
// -> "Too high"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Gleam Exercism

Bereit, mit Zahlenratespiel zu starten?

Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.