A MapSet egyedi értékek gyűjteménye, amellyel halmazokat ábrázolhatsz az Elixirben.
Bármilyenfajta értéket tartalmazhat, a sorrend fogalma nélkül.
Vedd figyelembe, hogy a Set modul is létezik, de elavult, helyette a MapSet az ajánlott.
Halmazokat a MapSet.new/0, MapSet.new/1 és MapSet.new/2 függvényekkel hozhatsz létre, listákká pedig a MapSet.to_list/1 függvénnyel alakíthatod őket.
MapSet.new()
# => MapSet.new([])
MapSet.new([2, 3, 3, 3, 1, 1, 2, "hello"])
# => MapSet.new([1, 2, 3, "hello"])
MapSet.new([2, 3, 3, 3, 1, 1, 2], fn n -> 10 * n end)
# => MapSet.new([10, 20, 30])
[2, 3, 3, 3, 1, 1, 2] |> MapSet.new() |> MapSet.to_list()
# => [1, 2, 3]
Mivel a MapSet-ekben nincs sorrend, a MapSet.to_list/1 nem garantáltan rendezett listát ad vissza.
Elemeket a MapSet.put/2 és a MapSet.delete/2 függvénnyel adhatsz hozzá vagy távolíthatsz el.
Egy halmaz tartalmát a MapSet.size/1 és a MapSet.member?/2 függvényekkel kérdezheted le, a halmazokat pedig a MapSet.equal?/2, MapSet.subset?/2 és MapSet.disjoint?/2 függvényekkel hasonlíthatod össze.
a = MapSet.new([1, 10])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.size(b)
# => 10
MapSet.member?(a, 10)
# => true
MapSet.subset?(a, b)
# => true
MapSet.disjoint?(a, b)
# => false
A MapSet-ek kombinálhatók a MapSet.union/2, MapSet.intersection/2, MapSet.difference/2 és MapSet.symmetric_difference/2 függvényekkel.
a = MapSet.new([1, 10, 100])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.union(a, b)
# => MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100])
MapSet.intersection(a, b)
# => MapSet.new([1, 10])
MapSet.difference(a, b)
# => MapSet.new([100])
MapSet.difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9])
MapSet.symmetric_difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9, 100])
A halmazokat a MapSet.filter/2, MapSet.reject/2 és MapSet.split_with/2 függvényekkel szűrheted és oszthatod fel.
a = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
even = fn n -> rem(n, 2) == 0 end
MapSet.filter(a, even)
# => MapSet.new([2, 4, 6, 8, 10])
MapSet.reject(a, even)
# => MapSet.new([1, 3, 5, 7, 9])
MapSet.split_with(a, even)
# => {MapSet.new([2, 4, 6, 8, 10]), MapSet.new([1, 3, 5, 7, 9])}
Úgy tűnik, a Blorkemon™️ kártyák iránti nosztalgiád egyáltalán nem lankad. Már újra gyűjteni is kezdted őket, sőt, a barátaidat is ráveszed, hogy csatlakozzanak hozzád.
Ebben a feladatban a kártyagyűjteményt egy MapSet reprezentálja, mivel a duplikált kártyák nem fontosak, amikor a célod az összes létező kártya megszerzése.
Nagyon szeretnéd, ha a barátaid is beszállnának a Blorkemon™️-őrületbe, és erre a legjobb módszer, ha egyetlen kártyával beindítod a gyűjteményüket.
Valósítsd meg a GottaSnatchEmAll.new_collection függvényt, amely egy kártyát gyűjteménnyé alakít.
GottaSnatchEmAll.new_collection("Newthree")
# => MapSet.new(["Newthree"])
Amint létrejött egy gyűjtemény, önálló életre kel, és növekednie kell.
Valósítsd meg a GottaSnatchEmAll.add_card függvényt, amely egy kártyát és egy gyűjteményt kap, és egy két értéket tartalmazó tuple-t ad vissza: egy Boolean értéket, amely megmutatja, hogy a kártya már benne volt-e a gyűjteményben, valamint a gyűjteményt a hozzáadott kártyával.
GottaSnatchEmAll.add_card("Scientuna", MapSet.new(["Newthree"]))
# => {false, MapSet.new(["Newthree", "Scientuna"])}
Most, hogy a barátaid újra megőrültek a Blorkemon™️-ért, ezt kihasználva kártyacserével növelheted a saját gyűjteményedet.
Nem minden csere éri meg, sőt, néha egyáltalán nem is lehet megcsinálni. Nem cserélhetsz el olyan kártyát, amivel nem rendelkezel, és nem is érdemes olyan kártyáért cserélni, amely már megvan.
Valósítsd meg a GottaSnatchEmAll.trade_card függvényt, amely két cserélni kívánt kártyát (a tiédet és az övékét) és a jelenlegi gyűjteményedet kapja.
A visszatérési érték egy két értékből álló tuple: egy Boolean, amely megmondja, hogy a csere lehetséges-e és megéri-e, valamint a gyűjtemény, amihez a csere elvégzésével jutnál (még akkor is, ha valójában nem lehetséges).
GottaSnatchEmAll.trade_card("Scientuna", "Newthree", MapSet.new(["Scientuna"]))
# => {true, MapSet.new(["Newthree"])}
Egy bolhapiacon régi kártyakészletre bukkansz. A kártyákat rendezned kell, és el kell távolítanod a duplikátumokat, hogy össze tudd hasonlítani a listát a gyűjteményeddel.
Valósítsd meg a GottaSnatchEmAll.remove_duplicates függvényt, amely rendezi a kártyák listáját, és a rendezett, egyedi kártyák listáját adja vissza.
GottaSnatchEmAll.remove_duplicates(["Newthree", "Newthree", "Newthree", "Scientuna"])
# => ["Newthree", "Scientuna"]
Itt az idő, hogy büszke legyél a gyűjteményedre.
Valósítsd meg a GottaSnatchEmAll.extra_cards függvényt, amely a te gyűjteményedet és egy másik gyűjteményt kap, és visszaadja, hogy hány olyan kártya van, amivel a másik gyűjtemény nem rendelkezik.
GottaSnatchEmAll.extra_cards(MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"]))
# => 0
Te és a Blorkemon™️-rajongó barátaid összegyűltök, és azon tanakodtok, melyik kártyák a leggyakoribbak.
Valósítsd meg a GottaSnatchEmAll.boring_cards függvényt, amely gyűjtemények egy listáját kapja, és visszaadja azon rendezett kártyák listáját, amelyek minden gyűjteményben megtalálhatók.
GottaSnatchEmAll.boring_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => ["Scientuna"]
Vajon te és a barátaid együtt a Blorkemon™️ kártyák mindegyikével rendelkeztek?
Valósítsd meg a GottaSnatchEmAll.total_cards függvényt, amely gyűjtemények egy listáját kapja, és visszaadja a gyűjtemények összes különböző kártyájának számát.
GottaSnatchEmAll.total_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => 2
Hamarosan meglátogat az unokaöcséd, és szeretnéd lenyűgözni. A gyerekek szeretik a csillogó dolgokat, nem igaz? A Blorkemon™️ kártyák csilloghatnak is!
Valósítsd meg a GottaSnatchEmAll.split_shiny_cards függvényt, amely egy gyűjteményt kap, és egy tuple-t ad vissza két rendezett kártyalistával: az egyikben az összes "Shiny"-nal kezdődő kártya, a másikban a többi kártya.
GottaSnatchEmAll.split_shiny_cards(MapSet.new(["Newthree", "Scientuna", "Shiny Scientuna"]))
# => {["Shiny Scientuna"], ["Newthree", "Scientuna"]}
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.