Rutas
/
Swift
Swift
/
Ejercicios
/
Tabla de puntuaciones
Tabla de puntuaciones

Tabla de puntuaciones

Ejercicio de aprendizaje

Introducción

Los diccionarios son uno de los tipos de colección principales de Swift. Un diccionario almacena asociaciones no ordenadas entre claves únicas y sus valores correspondientes. Todas las claves de un diccionario deben ser del mismo tipo, y todos los valores también deben compartir el mismo tipo.

Los literales de diccionario se escriben como pares key: value separados por comas y encerrados entre corchetes:

var addresses: Dictionary<String, String> = [
    "The Munsters": "1313 Mockingbird Lane",
    "The Simpsons": "742 Evergreen Terrace",
    "Buffy Summers": "1630 Revello Drive"
]

var sequences: [String: [Int]] = [
    "Euler's totient": [1, 1, 2, 2, 4, 2, 6, 4],
    "Lazy caterer": [1, 2, 4, 7, 11, 16, 22, 29, 37],
    "Carmichael": [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841]
]

let constants = [
    "pi": 3.14159,
    "e": 2.71828,
    "phi": 1.618033,
    "avogadro": 6.02214076e23
]

Los tipos de diccionario se pueden escribir explícitamente de dos formas: Dictionary<Key, Value> o la sintaxis abreviada [Key: Value].

Para crear un diccionario vacío, especifica explícitamente sus tipos de clave y de valor:

var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()

Acceder a los valores

Puedes acceder a los valores usando la notación de subíndice: coloca la clave entre corchetes después del nombre del diccionario. Como es posible que una clave no exista en el diccionario, el acceso por subíndice devuelve un opcional (Value?). Si la clave está presente, Swift devuelve el valor envuelto; si no, devuelve nil:

let munster: String? = addresses["The Munsters"]
// Returns Optional("1313 Mockingbird Lane")

let carmichael = sequences["Carmichael"]
// Returns Optional([561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841])

let planck = constants["planck"]
// Returns nil

Para no tener que trabajar con opcionales, puedes proporcionar un valor por defecto usando el parámetro default:

let e: Double = constants["e", default: 0]
// Returns 2.71828

let hoagie: [Int] = sequences["Hoagie", default: []]
// Returns []

let betty = addresses["Betty Cooper", default: "Address unknown"]
// Returns "Address unknown"

Modificar diccionarios

En los diccionarios mutables declarados con var, puedes añadir o actualizar pares clave-valor mediante la asignación por subíndice:

sequences["Euler's totient"]?.append(contentsOf: [6, 4])
// sequences["Euler's totient"] is now [1, 1, 2, 2, 4, 2, 6, 4, 6, 4]

addresses["Betty Cooper"] = "111 Queens Ave."
addresses["Betty Cooper", default: "Address unknown"]
// Returns "111 Queens Ave."

constants["Gelfond's"] = 23.140692
// Compiler error: Cannot assign through subscript: 'constants' is a 'let' constant

Iterar sobre un diccionario

Puedes iterar sobre cada par clave-valor de un diccionario con un bucle for-in. Cada elemento se proporciona como una tupla (key, value):

for (name, address) in addresses {
    print("\(name) lives at \(address)")
}

Ordenar diccionarios

Como los diccionarios no tienen orden, al ordenarlos se obtiene un array de pares clave-valor. Puedes pasar un closure al método sorted(by:) que compare dos tuplas (key, value) y devuelva true si la primera tupla debe aparecer antes que la segunda:

func sortByNameLengthThenValue(_ lhs: (key: String, value: Double), _ rhs: (key: String, value: Double)) -> Bool {
    let left = lhs.value + Double(lhs.key.count)
    let right = rhs.value + Double(rhs.key.count)
    return left < right
}

let sortedConstants = constants.sorted(by: sortByNameLengthThenValue)

Instrucciones

En este ejercicio vas a implementar una forma de llevar un registro de las puntuaciones máximas del juego más popular de tu salón recreativo.

Tienes que implementar 7 funciones, todas relacionadas con devolver y manipular un diccionario de datos de puntuaciones máximas.

1. Define un nuevo diccionario de puntuaciones máximas

Crea una función newScoreBoard() que no reciba parámetros y devuelva un nuevo diccionario de puntuaciones máximas que use valores de tipo String para las claves y valores de tipo Int como valores.

2. Añade jugadores al diccionario de puntuaciones máximas

Para añadir un jugador al diccionario de puntuaciones máximas, define addPlayer(_:_:_:), una función que recibe 3 parámetros:

  • El primer parámetro es el diccionario de puntuaciones. Debe ser un parámetro de entrada y salida.
  • El segundo parámetro es el nombre de un jugador como string.
  • El tercer parámetro es la puntuación como número entero. El parámetro es opcional; implementa el tercer parámetro con un valor por defecto de 0.
var highScores = newScoreBoard()
addPlayer(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0]
addPlayer(&highScores, "José Valim", 486_373)
// Returns ["Dave Thomas": 0, "José Valim": 486_373]

3. Elimina jugadores del diccionario de puntuaciones

Para eliminar a un jugador del diccionario de puntuaciones máximas, define removePlayer(_:_:), que recibe 2 parámetros:

  • El primer parámetro es el diccionario de puntuaciones. Debe ser un parámetro de entrada y salida.
  • El segundo parámetro es el nombre del jugador como string.

Esta función debe eliminar al jugador del diccionario si está en él y no hacer nada en caso contrario.

var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
removePlayer(&highScores, "Dave Thomas")
// Returns ["José Valim": 486_373]
removePlayer(&highScores, "Rose Fanaras")
// Returns ["José Valim": 486_373]

4. Restablece la puntuación de un jugador

Para restablecer la puntuación de un jugador, define resetPlayer(_:_:), que recibe 2 parámetros:

  • El primer parámetro es el diccionario de puntuaciones. Debe ser un parámetro de entrada y salida.
  • El segundo parámetro es el nombre del jugador como string, cuya puntuación quieres restablecer.

La función establecerá la puntuación del jugador a 0. Si el jugador no está en el diccionario, no debe pasar nada.

var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]

5. Actualiza la puntuación de un jugador

Para actualizar la puntuación de un jugador sumándola a la puntuación anterior, define updateScore, que recibe 3 parámetros:

  • El primer parámetro es el diccionario de puntuaciones. Debe ser un parámetro de entrada y salida.
  • El segundo parámetro es el nombre del jugador como string, cuya puntuación quieres actualizar.
  • El tercer parámetro es la puntuación que quieres añadir a la puntuación máxima almacenada.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
addPlayer(&highScores, "Freyja Ćirić", 12_771_008)
updateScore(&highScores, "Freyja Ćirić", 73)
// Returns ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_081]

6. Obtén un array de jugadores con sus puntuaciones ordenado por nombre de jugador

Define la función orderByPlayers, que recibe 1 parámetro:

  • El primer parámetro es el diccionario de puntuaciones.

La función devolverá un array de tuplas (String, Int) que son los jugadores y sus puntuaciones máximas, ordenado de forma ascendente por el nombre del jugador.

var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByPlayers(highScores)
// Returns [("Dave Thomas", 0), ("Freyja Ćirić", 12_771_091), ("José Valim", 486_373)]

7. Obtén un array de jugadores ordenado por puntuación de forma descendente

Para obtener un array de jugadores ordenado por puntuaciones de forma descendente, define orderByScores, que recibe 1 parámetro:

  • El primer parámetro es el diccionario de puntuaciones.

La función devolverá un array de tuplas (String, Int) que son los jugadores y sus puntuaciones máximas, ordenado de forma descendente por la puntuación del jugador.

var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByScores(highScores)
// Returns [("Freyja Ćirić", 12_771_091), ("José Valim", 486_373), ("Dave Thomas", 0)]
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Swift Exercism

¿Listo para empezar Tabla de puntuaciones?

Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.