Percursos
/
Gleam
Gleam
/
Exercícios
/
Temos de os apanhar todos
Temos de os apanhar todos

Temos de os apanhar todos

Exercício de aprendizagem

Introdução

Conjuntos

Um conjunto é uma coleção imutável e não ordenada de valores únicos. Todos os itens de um conjunto têm de ser do mesmo tipo.

O módulo gleam/set define o tipo Set e disponibiliza funções para trabalhar com conjuntos.

Podes transformar listas em conjuntos e vice-versa com set.to_list e set.from_list. A ordem dos itens num conjunto não é garantida.

set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])

set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]

Podes criar e preencher conjuntos com set.new, set.insert e set.delete.

set.new()
// -> set.from_list([])

let eighty_eight = set.from_list([88])

set.insert(eighty_eight, 88)
// -> set.from_list([88])

set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])

set.delete(eighty_eight, 89)
// -> set.from_list([88])

Podes consultar o conteúdo de um conjunto com as funções set.contains e set.size.

set.contains(eighty_eight, 88)
// -> True

set.size(eighty_eight)
// -> 1

Os conjuntos podem ser combinados com set.union e set.intersection.

let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])

set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])

set.intersection(a, b)
// -> set.from_list([1, 5])

Podes filtrar conjuntos.

let is_small = fn(n) { n <= 3 }

set.filter(b, is_small)
// -> set.from_list([1, 2, 3])

Instruções

A tua nostalgia pelas cartas Blorkemon™️ não dá sinais de abrandar, voltaste até a colecioná-las e andas a convencer os teus amigos a juntarem-se a ti.

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

1. Iniciar uma coleção

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

Implementa a função new_collection, que transforma uma carta numa coleção.

new_collection("Newthree")
// -> set.from_list(["Newthree"])

2. Aumentar a coleção

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

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

add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))

3. Começar a trocar

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

Nem todas as trocas valem a pena, nem sequer são sempre 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 a função trade_card, que recebe as duas cartas a trocar (a tua e a deles) e a tua coleção atual. O valor devolvido é um tuplo com 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 não seja realmente possível).

trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))

4. Cartas que todos têm

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

Implementa a função boring_cards, que recebe uma lista de coleções e devolve uma lista ordenada das cartas que todas as coleções têm.

boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]

5. Todas as cartas

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

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

total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2

6. Brilhantes para 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 a função shiny_cards, que recebe uma coleção e devolve um conjunto com todas as cartas que começam por "Shiny ".

shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
Editar via GitHub A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Temos de os apanhar todos?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.