Rutas
/
Swift
Swift
/
Ejercicios
/
Aprendiz de mago
Aprendiz de mago

Aprendiz de mago

Ejercicio de aprendizaje

Introducción

Arrays son uno de los tres tipos de colección principales de Swift. Un array es una lista ordenada de elementos. Los arrays pueden almacenar elementos de cualquier tipo, pero todos los elementos de un array dado deben compartir el mismo tipo. Los arrays son mutables cuando se asignan a una variable, lo que significa que puedes añadir, eliminar o modificar elementos después de crear el array. Cuando se asignan a una constante, un array es inmutable, lo que significa que su contenido no se puede cambiar.

Los literales de array se escriben como una lista de elementos separados por comas y encerrada entre corchetes ([...]). Swift puede inferir el tipo del array a partir de los elementos que contiene el literal.

let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]

También puedes especificar el tipo de forma explícita. Los tipos de array se pueden escribir de dos maneras: Array<T> o la sintaxis abreviada [T], donde T es el tipo de los valores que contiene el array.

let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]

Tamaño de un array

Puedes averiguar el número de elementos de un array con su propiedad count:

evenInts.count
// returns 6

Arrays vacíos

Para crear un array vacío, debes especificar su tipo. Puedes hacerlo con la sintaxis de inicialización de arrays o con una anotación de tipo explícita:

let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []

Arrays multidimensionales

Los arrays se pueden anidar para crear arrays multidimensionales. Cuando especificas el tipo de un array anidado de forma explícita, encierra el tipo de los elementos entre corchetes anidados, como [[Int]] o Array<Array<Int>>:

let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Añadir elementos al final de un array

Puedes añadir un elemento al final de un array mutable con el método append(_:):

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]

Insertar elementos en un array

Puedes insertar un elemento en un índice concreto con el método insert(_:at:). Este método toma dos argumentos: el elemento que se va a insertar y el índice en el que insertarlo.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]

Combinar arrays

Puedes combinar dos arrays en uno solo con el operador +. El operador + crea y devuelve un array nuevo; no modifica los arrays originales.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]

Acceder a los elementos de un array

Puedes acceder a un elemento concreto de un array si colocas su índice entre corchetes ([]) después del nombre del array. Los índices de un array son valores Int basados en cero, que empiezan en 0 para el primer elemento. Acceder a un índice fuera del rango válido provoca un error en tiempo de ejecución y bloquea el programa.

let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]

evenInts[2]
// returns 6

oddInts[7]
// Fatal error: Index out of range

Modificar los elementos de un array

Puedes cambiar un elemento de un array mutable si asignas un valor nuevo a un índice concreto. Igual que al leer elementos, usar un índice fuera del rango válido provoca un error en tiempo de ejecución.

var evenInts = [2, 4, 6, 8, 10, 12]

evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]

Convertir un array en un string y viceversa

Puedes unir un array de strings en un solo string con el método joined(separator:), que toma un string separador:

let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"

Puedes dividir un string en un array de subcadenas con el método split(separator:), pasando el carácter delimitador:

let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]

Eliminar elementos de un array

Puedes eliminar un elemento en un índice dado con el método remove(at:). El índice debe estar dentro de los límites válidos del array; de lo contrario, se produce un error en tiempo de ejecución.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]

Para eliminar el último elemento de un array, usa el método removeLast(). Llamar a removeLast() en un array vacío provoca un error en tiempo de ejecución.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]

Instrucciones

Como aspirante a maga, Elyse necesita practicar algunos conceptos básicos. Tiene una pila de cartas que quiere manipular.

Para que todo sea un poco más fácil, solo usa las cartas del 1 al 10, así que su pila de cartas se puede representar con un array de números. La posición de una carta concreta se corresponde con el índice en el array. Es decir, la posición 0 se refiere a la primera carta, la posición 1 a la segunda, etc.

Note

Todas las funciones deben actualizar el array de cartas y luego devolver el array modificado, una forma habitual de trabajar conocida como patrón Builder, que te permite encadenar funciones de forma cómoda.

1. Recuperar una carta de la pila

Para elegir una carta, devuelve la carta que está en el índice position de la pila dada.

Implementa la función getCard(at:from:), que toma dos argumentos: at, que es la posición de la carta en la pila, y from, que es la pila de cartas. La función debe devolver la carta que está en la posición index de la pila dada.

let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4

2. Cambiar una carta de la pila

Haz un poco de juego de manos e intercambia la carta que está en el índice position por la carta de reemplazo proporcionada.

Implementa la función setCard(at:in:to), que toma tres argumentos: at, que es la posición de la carta en la pila, in, que es la pila de cartas, y to, que es la nueva carta que reemplaza a la carta que está en la posición index. La función debe devolver una copia de la pila con la carta que está en la posición index reemplazada por la nueva carta. Si el index dado no es un índice válido en la pila, se debe devolver la pila original, sin cambios.

let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]

3. Insertar una carta en la parte superior de la pila

Haz que aparezca una carta insertando una nueva carta en la parte superior de la pila.

Implementa la función insert(_:atTopOf:), que toma dos argumentos: la nueva carta que se va a insertar y la pila de cartas. La función debe devolver una copia de la pila con la nueva carta proporcionada añadida en la parte superior de la pila.

let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]

4. Eliminar una carta de la pila

Haz que una carta desaparezca eliminando de la pila la carta que está en la position dada.

Implementa la función removeCard(at:from:), que toma dos argumentos: at, que es la posición de la carta en la pila, y from, que es la pila de cartas. La función debe devolver una copia de la pila con la carta que está en la posición index eliminada. Si el index dado no es un índice válido en la pila, se debe devolver la pila original, sin cambios.

let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]

5. Insertar una carta en la pila

Haz que aparezca una carta insertando una nueva carta en la position dada de la pila.

Implementa la función insert(_:at:from:), que toma tres argumentos: la nueva carta que se va a insertar, la posición en la que se debe insertar la nueva carta y la pila de cartas. La función debe devolver una copia de la pila con la nueva carta proporcionada añadida en la posición dada. Si el index dado no es un índice válido en la pila, se debe devolver la pila original, sin cambios.

let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]

6. Comprobar el tamaño de la pila

Comprueba si el tamaño de la pila es igual a stackSize o no.

Implementa la función checkSizeOfStack(_:_:), que toma dos argumentos: stack, que es la pila de cartas, y stackSize, que es el tamaño de la pila. La función debe devolver true si el tamaño de la pila es igual a stackSize y false en caso contrario.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Swift Exercism

¿Listo para empezar Aprendiz de mago?

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