Percursos
/
Elm
Elm
/
Exercícios
/
Apanha-os Todos
Apanha-os Todos

Apanha-os Todos

Exercício de aprendizagem

Introdução

Set

Um Set a é uma sequência de valores únicos do tipo a. Os valores têm de ser do tipo comparable (Int, Float, Time, Char, String, e tuplos ou listas de tipos comparáveis).

Podes transformar listas em conjuntos e vice-versa com Set.toList e Set.fromList. Devido à estrutura interna de Set, é garantido que uma lista obtida a partir de Set.fromList fica ordenada.

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]

Podes criar e preencher conjuntos com Set.empty, Set.singleton, Set.insert e Set.remove.

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]

Podes consultar o conteúdo de um conjunto com as funções Set.member, Set.isEmpty e Set.size.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

Os conjuntos podem ser combinados com Set.union, Set.intersect e Set.diff.

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]

Podes filtrar e particionar conjuntos.

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

Instruções

A tua nostalgia pelas cartas Blorkemon™️ não dá sinais de abrandar, chegaste a começar a colecioná-las outra vez e estás a convencer os teus amigos a juntar-se a ti.

Neste exercício, uma coleção de Card é representada por Set Card, uma vez que as cartas duplicadas não são importantes quando o teu objetivo é obter todas as cartas existentes.

1. Começa uma coleção

Queres mesmo que os teus amigos se juntem à tua loucura Blorkemon™️, e a melhor forma é dar o pontapé de saída na coleção deles oferecendo-lhes uma carta.

Implementa newCollection, que transforma uma carta numa coleção.

newCollection "Newthree"
    --> Set.fromList ["Newthree"]

2. Aumenta a coleção

Assim que tens uma coleção, ela ganha vida própria e tem de crescer.

Implementa addCard, que recebe um Card e uma coleção, e devolve um Tuple com dois valores: um Bool que indica se o Card já estava na coleção, e a coleção com a carta adicionada.

addCard "Scientuna" (Set.fromList ["Newthree"])
    --> (False, Set.fromList ["Newthree", "Scientuna"])

3. Começa a trocar

Agora que os teus amigos estão outra vez loucos por Blorkemon™️, podes usar isso para aumentar a tua própria coleção trocando cartas.

Nem todas as trocas valem a pena, nem sequer são possíveis. Não podes trocar uma carta que não tens, e não deves trocar uma carta por outra que já tens.

Implementa tradeCard, que recebe duas cartas a trocar (a tua e a deles) e a tua coleção atual. O valor devolvido é um Tuple de dois valores: um Bool que indica se a troca é possível e vale a pena, e a coleção com que ficarias se fizesses a troca (mesmo que ela não seja realmente possível).

tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
    --> (True, Set.fromList ["Newthree"])

4. Só pode haver um de cada

Encontras uma velha reserva de cartas numa feira da ladra. Tens de ordenar as cartas e remover as duplicadas para comparar a lista com a tua coleção.

Implementa removeDuplicates, que ordena uma lista de cartas e devolve uma lista de cartas ordenadas e únicas.

removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
    --> ["Newthree", "Scientuna"]

5. Cartas que eles não têm

Está na hora de te sentires bem com a tua coleção.

Implementa extraCards, que recebe a tua coleção e outra coleção qualquer, e devolve o número de cartas que a outra coleção não tem.

extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
    --> 0

6. Cartas que todos eles têm

Tu e os teus amigos entusiastas de Blorkemon™️ reúnem-se e perguntam-se quais são as cartas mais comuns.

Implementa boringCards, que recebe uma lista de coleções e devolve uma lista de cartas ordenadas que todas as coleções têm.

boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> ["Scientuna"]

7. Todas as cartas

Será que tu e os teus amigos, em conjunto, têm todas as cartas Blorkemon™️?

Implementa totalCards, que recebe uma lista de coleções e devolve o número total de cartas diferentes em todas as coleções.

totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> 2

8. Brilhantes a vencer

O teu sobrinho vem visitar-te em breve e apetece-te impressioná-lo. As crianças gostam de coisas brilhantes, não é? As cartas Blorkemon™️ podem ser brilhantes!

Implementa splitShinyCards, que recebe uma coleção e devolve um Tuple com duas listas de cartas ordenadas: uma com todas as cartas que começam por "Shiny" e outra com as restantes cartas.

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Editar via GitHub A ligação abre numa nova janela ou separador
Elm Exercism

Estás pronto para começar Apanha-os Todos?

Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.