Track
/
Elixir
Elixir
/
Esercizi
/
Gotta Snatch'Em All
Gotta Snatch'Em All

Gotta Snatch'Em All

Esercizio di apprendimento

Introduzione

MapSet

Un MapSet è una collezione di valori unici, che rappresenta gli insiemi in Elixir. Può contenere valori di qualsiasi tipo, senza una nozione di ordine.

Tieni presente che esiste anche il modulo Set, ma è deprecato a favore di MapSet.

Puoi creare insiemi usando MapSet.new/0, MapSet.new/1 e MapSet.new/2, e trasformarli in liste usando MapSet.to_list/1.

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]

Tieni presente che, poiché i MapSet non hanno una nozione di ordine, non è garantito che MapSet.to_list/1 restituisca una lista ordinata.

Puoi aggiungere o rimuovere elementi con MapSet.put/2 e MapSet.delete/2.

Puoi interrogare il contenuto di un insieme con le funzioni MapSet.size/1, MapSet.member?/2, e confrontare insiemi con MapSet.equal?/2, MapSet.subset?/2 e MapSet.disjoint?/2.

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

I MapSet possono essere combinati con MapSet.union/2, MapSet.intersection/2, MapSet.difference/2 e MapSet.symmetric_difference/2.

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])

Puoi filtrare e partizionare insiemi con MapSet.filter/2, MapSet.reject/2 e MapSet.split_with/2.

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])}

Istruzioni

La tua nostalgia per le carte Blorkemon™️ non accenna a diminuire, hai perfino ricominciato a collezionarle e stai convincendo i tuoi amici a unirsi a te.

In questo esercizio, una collezione di carte è rappresentata da un MapSet, dato che le carte duplicate non contano quando l'obiettivo è ottenere tutte le carte esistenti.

1. Inizia una collezione

Vuoi davvero che i tuoi amici entrino nella tua follia per i Blorkemon™️, e il modo migliore è dare il via alla loro collezione regalando loro una carta.

Implementa GottaSnatchEmAll.new_collection, che trasforma una carta in una collezione.

GottaSnatchEmAll.new_collection("Newthree")
# => MapSet.new(["Newthree"])

2. Fai crescere la collezione

Una volta che hai una collezione, questa prende vita propria e deve crescere.

Implementa GottaSnatchEmAll.add_card, che prende una carta e una collezione e restituisce una tupla con due valori: un booleano che indica se la carta era già nella collezione, e la collezione con la carta aggiunta.

GottaSnatchEmAll.add_card("Scientuna", MapSet.new(["Newthree"]))
# => {false, MapSet.new(["Newthree", "Scientuna"])}

3. Inizia a scambiare

Ora che i tuoi amici sono di nuovo pazzi per i Blorkemon™️, puoi approfittarne per far crescere la tua collezione scambiando carte.

Non tutti gli scambi valgono la pena, né sono sempre possibili. Non puoi scambiare una carta che non hai, e non dovresti scambiare una carta con una che possiedi già.

Implementa GottaSnatchEmAll.trade_card, che prende due carte da scambiare (la tua e la loro) e la tua collezione attuale. Il valore restituito è una tupla di due valori: un booleano che indica se lo scambio è possibile e vale la pena, e la collezione che ti ritroveresti facendolo (anche se in realtà non è possibile).

GottaSnatchEmAll.trade_card("Scientuna", "Newthree", MapSet.new(["Scientuna"]))
# => {true, MapSet.new(["Newthree"])}

4. Ce ne può essere solo una per tipo

Trovi una vecchia scorta di carte a un mercatino delle pulci. Devi ordinare le carte ed eliminare i duplicati per confrontare la lista con la tua collezione.

Implementa GottaSnatchEmAll.remove_duplicates, che ordina una lista di carte e restituisce una lista di carte uniche e ordinate.

GottaSnatchEmAll.remove_duplicates(["Newthree", "Newthree", "Newthree", "Scientuna"])
# => ["Newthree", "Scientuna"]

5. Le carte che non hanno

È il momento di essere soddisfatto della tua collezione.

Implementa GottaSnatchEmAll.extra_cards, che prende la tua collezione ed un'altra collezione e restituisce il numero di carte che l'altra collezione non ha.

GottaSnatchEmAll.extra_cards(MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"]))
# => 0

6. Le carte che hanno tutti

Tu ed i tuoi amici appassionati di Blorkemon™️ vi riunite e vi chiedete quali carte siano le più comuni.

Implementa GottaSnatchEmAll.boring_cards, che prende una lista di collezioni e restituisce una lista ordinata delle carte che tutte le collezioni hanno.

GottaSnatchEmAll.boring_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => ["Scientuna"]

7. Tutte le carte

Tu ed i tuoi amici possedete collettivamente tutte le carte Blorkemon™️?

Implementa GottaSnatchEmAll.total_cards, che prende una lista di collezioni e restituisce il numero totale di carte diverse presenti in tutte le collezioni.

GottaSnatchEmAll.total_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => 2

8. Le carte luccicanti per vincere

Tuo nipote verrà presto a trovarti e ti va di fargli una bella impressione. Ai bambini piacciono le cose luccicanti, no? Le carte Blorkemon™️ possono essere luccicanti!

Implementa GottaSnatchEmAll.split_shiny_cards, che prende una collezione e restituisce una tupla con due liste di carte ordinate: una con tutte le carte che iniziano con "Shiny" ed una con le altre carte.

GottaSnatchEmAll.split_shiny_cards(MapSet.new(["Newthree", "Scientuna", "Shiny Scientuna"]))
# => {["Shiny Scientuna"], ["Newthree", "Scientuna"]}
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Gotta Snatch'Em All?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.