Tracks
/
Elm
Elm
/
Ejercicios
/
Atrápalos todos
Atrápalos todos

Atrápalos todos

Ejercicio de aprendizaje

Introducción

Set

Un Set a es una secuencia de valores únicos de tipo a. Los valores tienen que ser del tipo comparable (Int, Float, Time, Char, String, y tuplas o listas de tipos comparables).

Puedes transformar listas y sets entre sí con Set.toList y Set.fromList. Debido a la estructura interna de Set, está garantizado que una lista obtenida de Set.fromList estará 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]

Puedes crear y llenar sets con Set.empty, Set.singleton, Set.insert y 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]

Puedes consultar el contenido de un set con las funciones Set.member, Set.isEmpty y Set.size.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

Un Set se puede combinar con Set.union, Set.intersect y 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]

Puedes filtrar y particionar sets.

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

Instrucciones

Tu nostalgia por las cartas Blorkemon™️ no da señales de disminuir; incluso empezaste a coleccionarlas de nuevo y estás haciendo que tus amigos se unan a ti.

En este ejercicio, una colección de Card se representa con Set Card, ya que las cartas duplicadas no son importantes cuando tu meta es conseguir todas las cartas que existen.

1. Inicia una colección

De verdad quieres que tus amigos se sumen a tu locura por Blorkemon™️, y la mejor forma es darles una carta para arrancar su colección.

Implementa newCollection, que transforma una carta en una colección.

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

2. Haz crecer la colección

Una vez que tienes una colección, esta cobra vida propia y tiene que crecer.

Implementa addCard, que recibe una Card y una colección, y devuelve una Tuple con dos valores: un Bool que indica si la Card ya estaba en la colección, y la colección con la carta añadida.

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

3. Empieza a intercambiar

Ahora que tus amigos están otra vez locos por Blorkemon™️, puedes aprovechar para hacer crecer tu propia colección intercambiando cartas.

No todos los intercambios valen la pena, ni siquiera se pueden hacer. No puedes intercambiar una carta que no tienes, y no deberías intercambiar una carta por otra que ya tienes.

Implementa tradeCard, que recibe dos cartas para intercambiar (la tuya y la suya) y tu colección actual. El valor de retorno es una Tuple de dos valores: un Bool que indica si el intercambio es posible y vale la pena, y la colección con la que terminarías si hicieras el intercambio (aunque en realidad no sea posible).

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

4. Solo puede haber una de cada una

Encuentras un viejo alijo de cartas en un mercado de pulgas. Debes ordenar las cartas y eliminar las duplicadas para comparar la lista con tu colección.

Implementa removeDuplicates, que ordenará una lista de cartas y devolverá una lista de cartas únicas y ordenadas.

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

5. Cartas que ellos no tienen

Es hora de sentirte bien con tu colección.

Implementa extraCards, que recibe tu colección y otra colección, y devuelve la cantidad de cartas que la otra colección no tiene.

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

6. Cartas que todos tienen

Tú y tus amigos aficionados a Blorkemon™️ se reúnen y se preguntan cuáles son las cartas más comunes.

Implementa boringCards, que recibe una lista de colecciones y devuelve una lista de cartas ordenadas que todas las colecciones tienen.

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

7. Todas las cartas

¿Tú y tus amigos tienen en conjunto todas las cartas de Blorkemon™️?

Implementa totalCards, que recibe una lista de colecciones y devuelve el número total de cartas diferentes en todas las colecciones.

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

8. Brillantes para ganar

Tu sobrino viene a visitarte pronto y tienes ganas de impresionarlo. A los niños les gustan las cosas brillantes, ¿verdad? ¡Las cartas de Blorkemon™️ pueden ser brillantes!

Implementa splitShinyCards, que recibe una colección y devuelve una Tuple con dos listas de cartas ordenadas: una con todas las cartas que empiezan con "Shiny" y otra con las demás cartas.

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elm Exercism

¿Todo listo para empezar Atrápalos todos?

Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.