Tracks
/
Elm
Elm
/
Übungen
/
Blorkemon-Karten
Blorkemon-Karten

Blorkemon-Karten

Lernübung

Einführung

Vergleich

Gleichheit

Mit dem Gleichheitsoperator (==) kannst du bei Elm-Typen prüfen, ob sie „gleich" sind. Der Ungleichheitsoperator ist (/=) (nicht != wie in vielen Sprachen). Der Gleichheitsoperator funktioniert mit Literalen, Tupeln, Records und eigenen Typen.

1 == 2
    --> False

1 /= 2
    --> True

(1, 2) == (2, 1)
    --> False

type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]

type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings =  (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}

a == b
    --> True

Beachte, dass du niemals Funktionen vergleichen solltest, da das Programm sonst zur Laufzeit abstürzt.

Vergleiche

Die Vergleichsoperatoren (<), (<=), (>), (>=) und die Funktionen min, max, compare arbeiten mit comparable-Typen. Der Typ comparable ist ein spezieller Typ, der alle eingebauten Typen zusammenfasst, die sich vergleichen lassen: Zahlen, Zeichen, Strings, Listen vergleichbarer Dinge und Tupel vergleichbarer Dinge.

1 < 1 + 1
    --> True

'x' < 'X'
    --> False

"abc" < "abz"
    --> True

"abc" < "abcd"
    --> True

"abc" < "b"
    --> True

min [1 , 2, 9000] [10]
    --> [1 , 2, 9000]

min (1, "hello") (3, "bye")
    --> (1, "hello")

Werte anderer Typen wie Records oder eigene Typen lassen sich nicht direkt vergleichen.

Bei manchen eingebauten Typen müssen die Inhalte comparable sein, etwa die Schlüssel von Set oder Dict, da ihre Struktur auf einer internen Ordnung beruht.

Listen mit comparable-Werten lassen sich mit List.sort sortieren, und Listen von Werten, die sich auf vergleichbare Werte abbilden lassen, mit List.sortBy. Wenn du eine hierarchische Sortierung brauchst (nach einer Eigenschaft sortieren und bei Gleichstand eine andere entscheiden lassen), kannst du ebenfalls Tupel oder Listen mit List.sortBy verwenden, da Tupel und Listen in lexikografischer Reihenfolge sortiert werden.

List.sort ["hi", "hello", "bye", "goodbye"]
    --> ["bye", "goodbye", "hello", "hi"]

List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
    --> ["hi", "bye", "hello", "goodbye"]

-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
    --> ["hi", "bye", "dad", "mum", "sis", "hello"]

Die Funktion compare nimmt zwei comparable-Werte und gibt eine Order zurück. Eine Order ist ein Typ, der in einem einzigen Schritt prüft, ob ein Wert größer (GT), gleich (EQ) oder kleiner (LT) als ein anderer ist.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Vergleichsfunktionen lassen sich für beliebige Typen erstellen und zum Beispiel mit List.sortWith zum Sortieren verwenden:

type Color = Red | Green | Blue

compareColors : Color -> Color -> Order
compareColors a b =
  case (a, b) of
    (Red, Red) -> EQ
    (Red, _) -> LT
    (_, Red) -> GT
    (Green, Green) -> EQ
    (Green, _) -> LT
    (_, Green) -> GT
    (Blue, Blue) -> EQ

List.sortWith compareColors [Blue, Red, Green, Green, Blue]
    --> [Red, Green, Green, Blue, Blue]

Anleitung

Du spürst plötzlich einen Anflug von Nostalgie und einen starken Drang, deine alten Blorkemon™️-Karten abzustauben. Blorkemon™️-Karten sind ein großartiges, altes Sammelkartenspiel. Auf jeder Card ist ein Blorkemon™️-Monster abgebildet, dazu eine Angriffskraftstufe, und wenn du Glück hast, ist die Karte sogar glänzend.

1. Vergleiche die Kraftstufen

Jede Blorkemon™️-Karte sieht stärker aus als die nächste, aber das solltest du besser überprüfen.

Implementiere die Funktion isMorePowerful. Sie soll True zurückgeben, wenn die Karte im ersten Argument strikt stärker ist als die andere, und sonst False.

newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True

isMorePowerful newthree scientuna
    --> True

2. Finde die höchste Kraft

Mit einer Hand voller Blorkemon™️-Karten solltest du den verheerendsten Angriff vorbereiten können.

Implementiere die Funktion maxPower, die die höchste Kraftstufe zweier Karten zurückgibt.

maxPower newthree scientuna
    --> 120

3. Sortiere die Karten

Du scheinst dich zu erinnern, dass du mindestens eine Karte von jedem Blorkemon™️ hattest, aber es ist eine Weile her, seit du das letzte Mal nachgesehen hast. Du solltest deine Karten sortieren, um sie mit der offiziellen Auflistung auf Pulpapedia zu vergleichen.

Implementiere die Funktion sortByMonsterName, die eine Liste von Cards entgegennimmt und eine nach Monsternamen sortierte Liste zurückgibt.

sortByMonsterName [newthree, scientuna]
    --> [Card "Newthree" 120 False, Card "Scientuna" 6 True]

4. Die coolsten Karten zuerst

Blorkemon™️ sind das Coolste überhaupt. Das sagst du nicht leichtfertig, du hast eine wissenschaftliche Methode, um es zu beweisen.

Implementiere die Funktion sortByCoolness, die eine Liste von Karten sortiert und dabei die coolsten zuerst platziert. Die Coolness einer Karte wird zuerst durch ihren Glanz bestimmt: Alle glänzenden Karten sind viel cooler als die anderen. Der zweite Faktor ist die Kraftstufe, je höher, desto besser.

sortByCoolness [newthree, scientuna]
    --> [Card "Scientuna" 6 True, Card "Newthree" 120 False]

5. Glanzkraft

Glanz ist nicht nur Show: In einem Kampf zwischen gleich starken Blorkemon™️ gewinnt immer das glänzende. Das nennt man die Glanzkraft.

Implementiere die Funktion compareShinyPower, die diese Eigenschaft festhält. Die Order zweier Karten wird durch die Kraftstufen bestimmt, wenn diese unterschiedlich sind. Sind sie jedoch gleich, ist eine glänzende Karte größer.

compareShinyPower newthree scientuna
    --> GT

6. Setze deine Wetten

In einem Spiel mit Blorkemon™️-Karten ist alles möglich, aber stärkere Karten gewinnen trotzdem tendenziell eher.

Implementiere die Funktion expectedWinner, die den Namen des Monsters zurückgibt, das am wahrscheinlichsten gewinnt, bestimmt durch die Reihenfolge von compareShinyPower. Die Funktion soll den Monsternamen des erwarteten Gewinners zurückgeben, oder „too close to call“, wenn beide Gegner dieselbe Glanzkraft haben.

expectedWinner newthree scientuna
    --> "Newthree"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elm Exercism

Bereit, mit Blorkemon-Karten zu starten?

Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.