Ein Set a ist eine Folge eindeutiger Werte des Typs a.
Die Werte müssen vom Typ comparable sein (Int, Float, Time, Char, String sowie Tupel oder Listen vergleichbarer Typen).
Mit Set.toList und Set.fromList kannst du Listen und Sets ineinander umwandeln.
Aufgrund der internen Struktur von Set ist garantiert, dass eine mit Set.fromList erzeugte Liste sortiert ist.
Set.fromList [2, 3, 3, 3, 1, 1, 2]
--> Set.fromList [1, 2, 3]
Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
--> [1, 2, 3]
Du kannst Sets mit Set.empty, Set.singleton, Set.insert und Set.remove erstellen und befüllen.
Set.empty
--> Set.fromList []
Set.singleton "hi"
--> Set.fromList ["hi"]
eightyEight = Set.singleton 88
Set.insert 88 eightyEight
--> Set.fromList [88]
Set.insert 89 eightyEight
--> Set.fromList [88, 89]
Set.remove 88 eightyEight
--> Set.fromList []
Set.remove 89 eightyEight
--> Set.fromList [88]
Den Inhalt eines Sets kannst du mit den Funktionen Set.member, Set.isEmpty und Set.size abfragen.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Sets lassen sich mit Set.union, Set.intersect und Set.diff kombinieren.
a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Set.union a b
--> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
Set.intersect a b
--> Set.fromList [1, 10]
Set.diff a b
--> Set.fromList [100]
Set.diff b a
--> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]
Du kannst Sets filtern und aufteilen.
even n = modBy 2 n == 0
Set.filter even b
--> Set.fromList [2, 4, 6, 8, 10]
Set.partition even b
--> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])
Deine Nostalgie für Blorkemon™️-Karten zeigt keine Anzeichen, dass sie nachlässt. Du hast sogar wieder angefangen, sie zu sammeln, und steckst nun auch deine Freunde damit an.
In dieser Übung wird eine Sammlung von Card durch Set Card dargestellt, denn doppelte Karten spielen keine Rolle, wenn dein Ziel ist, alle existierenden Karten zu bekommen.
Du willst unbedingt, dass deine Freunde bei deinem Blorkemon™️-Wahn mitmachen. Am besten gelingt das, indem du ihre Sammlung mit einer Karte startest.
Implementiere newCollection, die eine Karte in eine Sammlung umwandelt.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
Sobald du eine Sammlung hast, entwickelt sie ein Eigenleben und muss wachsen.
Implementiere addCard, die eine Card und eine Sammlung entgegennimmt und ein Tuple mit zwei Werten zurückgibt: ein Bool, das angibt, ob die Card schon in der Sammlung war, und die Sammlung mit der hinzugefügten Karte.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
Jetzt, wo deine Freunde wieder verrückt nach Blorkemon™️ sind, kannst du das nutzen, um deine eigene Sammlung zu vergrößern, indem du Karten tauschst.
Nicht jeder Tausch lohnt sich oder ist überhaupt möglich. Du kannst keine Karte tauschen, die du nicht hast, und du solltest keine Karte gegen eine tauschen, die du bereits hast.
Implementiere tradeCard, die zwei Karten zum Tauschen (deine und die deiner Freunde) und deine aktuelle Sammlung entgegennimmt.
Der Rückgabewert ist ein Tuple aus zwei Werten: ein Bool, das angibt, ob der Tausch möglich und sinnvoll ist, und die Sammlung, die du nach dem Tausch hättest (auch wenn er gar nicht möglich ist).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
Auf einem Flohmarkt findest du ein altes Kartenlager. Du musst die Karten sortieren und die Duplikate entfernen, um die Liste mit deiner Sammlung zu vergleichen.
Implementiere removeDuplicates, die eine Liste von Karten sortiert und eine Liste sortierter, eindeutiger Karten zurückgibt.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
Zeit, dich über deine Sammlung zu freuen.
Implementiere extraCards, die deine Sammlung und eine andere Sammlung entgegennimmt und die Anzahl der Karten zurückgibt, die die andere Sammlung nicht hat.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Du und deine Blorkemon™️-begeisterten Freunde trefft euch und fragt euch, welche Karten am häufigsten vorkommen.
Implementiere boringCards, die eine Liste von Sammlungen entgegennimmt und eine Liste sortierter Karten zurückgibt, die alle Sammlungen enthalten.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
Besitzt du zusammen mit deinen Freunden alle Blorkemon™️-Karten?
Implementiere totalCards, die eine Liste von Sammlungen entgegennimmt und die Gesamtzahl der verschiedenen Karten in allen Sammlungen zurückgibt.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
Dein Neffe kommt dich bald besuchen, und du willst ihn beeindrucken. Kinder mögen glänzende Dinge, oder? Blorkemon™️-Karten können glänzend sein!
Implementiere splitShinyCards, die eine Sammlung entgegennimmt und ein Tuple mit zwei Listen sortierter Karten zurückgibt: eine mit allen Karten, die mit "Shiny" beginnen, und eine mit den anderen Karten.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.