Percursos
/
Swift
Swift
/
Exercícios
/
Aprendiz de mágico
Aprendiz de mágico

Aprendiz de mágico

Exercício de aprendizagem

Introdução

Os arrays são um dos três tipos de coleção principais do Swift. Um array é uma lista ordenada de elementos. Os arrays podem guardar elementos de qualquer tipo, mas todos os elementos de um dado array têm de ser do mesmo tipo. Os arrays são mutáveis quando são atribuídos a uma variável, o que significa que podes acrescentar, remover ou modificar elementos depois de criares o array. Quando são atribuídos a uma constante, os arrays são imutáveis, ou seja, o seu conteúdo não pode ser alterado.

Os literais de array escrevem-se como uma lista de elementos separados por vírgulas e entre parênteses retos ([...]). O Swift consegue inferir o tipo do array a partir dos elementos que estão dentro do literal.

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

Também podes especificar o tipo explicitamente. Os tipos de array podem escrever-se de duas formas: Array<T> ou a sintaxe abreviada [T], em que T é o tipo dos valores que o array contém.

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!"]

Tamanho de um array

Podes descobrir o número de elementos de um array através da sua propriedade count:

evenInts.count
// returns 6

Arrays vazios

Para criar um array vazio, tens de especificar o seu tipo. Podes fazê-lo com a sintaxe de inicialização de arrays ou com uma anotação de tipo explícita:

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

Arrays multidimensionais

Os arrays podem ser aninhados para criar arrays multidimensionais. Ao especificar explicitamente o tipo de um array aninhado, coloca o tipo dos elementos dentro de parênteses retos aninhados, como em [[Int]] ou 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]]

Acrescentar elementos a um array

Podes acrescentar um elemento ao fim de um array mutável com o 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]

Inserir elementos num array

Podes inserir um elemento numa posição específica com o método insert(_:at:). Este método recebe dois argumentos: o elemento a inserir e o índice onde o queres inserir.

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]

Somar arrays

Podes combinar dois arrays num só com o operador +. O operador + cria e devolve um novo array; não modifica os arrays originais.

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]

Aceder aos elementos de um array

Podes aceder a um elemento individual de um array colocando o seu índice entre parênteses retos ([]) a seguir ao nome do array. Os índices dos arrays são valores Int que começam em zero, sendo 0 o primeiro elemento. Aceder a um índice fora do intervalo válido provoca um erro em tempo de execução e faz o programa terminar abruptamente.

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 elementos de um array

Podes alterar um elemento de um array mutável atribuindo um novo valor a um índice específico. Tal como ao ler elementos, usar um índice fora do intervalo válido provoca um erro em tempo de execução.

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

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

Converter um array numa string e vice-versa

Podes juntar um array de strings numa única string com o método joined(separator:), que recebe uma string separadora:

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

Podes dividir uma string num array de substrings com o método split(separator:), passando-lhe o caráter delimitador:

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

Remover elementos de um array

Podes remover um elemento numa dada posição com o método remove(at:). O índice tem de estar dentro dos limites válidos do array; caso contrário, ocorre um erro em tempo de execução.

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

Para remover o último elemento de um array, usa o método removeLast(). Chamar removeLast() a um array vazio provoca um erro em tempo de execução.

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

Instruções

Como futura ilusionista, a Elyse precisa de praticar o básico. Tem uma pilha de cartas que quer manipular.

Para facilitar um pouco as coisas, usa apenas as cartas de 1 a 10, para que a sua pilha de cartas possa ser representada por um array de números. A posição de uma determinada carta corresponde ao índice no array. Isto significa que a posição 0 corresponde à primeira carta, a posição 1 à segunda carta, e assim por diante.

Note

Todas as funções devem atualizar o array de cartas e depois devolver o array modificado, uma forma comum de trabalhar conhecida como padrão Builder, que te permite encadear funções umas nas outras de forma harmoniosa.

1. Recuperar uma carta de uma pilha

Para escolheres uma carta, devolve a carta que está no índice position da pilha indicada.

Implementa a função getCard(at:from:), que recebe dois argumentos: at, que é a posição da carta na pilha, e from, que é a pilha de cartas. A função deve devolver a carta que está na posição index da pilha indicada.

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

2. Alterar uma carta na pilha

Faz um pouco de prestidigitação e troca a carta no índice position pela carta de substituição indicada.

Implementa a função setCard(at:in:to), que recebe três argumentos: at, que é a posição da carta na pilha, in, que é a pilha de cartas, e to, que é a nova carta que vai substituir a carta na posição index. A função deve devolver uma cópia da pilha com a carta na posição index substituída pela nova carta. Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.

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

3. Inserir uma carta no topo da pilha

Faz aparecer uma carta, inserindo uma nova carta no topo da pilha.

Implementa a função insert(_:atTopOf:), que recebe dois argumentos: a nova carta a inserir e a pilha de cartas. A função deve devolver uma cópia da pilha com a nova carta indicada adicionada ao topo da pilha.

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

4. Remover uma carta da pilha

Faz desaparecer uma carta, removendo da pilha a carta que está na posição position indicada.

Implementa a função removeCard(at:from:), que recebe dois argumentos: at, que é a posição da carta na pilha, e from, que é a pilha de cartas. A função deve devolver uma cópia da pilha com a carta na posição index removida. Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.

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

5. Inserir uma carta na pilha

Faz aparecer uma carta, inserindo uma nova carta na posição position indicada na pilha.

Implementa a função insert(_:at:from:), que recebe três argumentos: a nova carta a inserir, a posição na qual a nova carta deve ser inserida e a pilha de cartas. A função deve devolver uma cópia da pilha com a nova carta indicada adicionada na posição indicada. Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.

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

6. Verificar o tamanho da pilha

Verifica se o tamanho da pilha é igual a stackSize ou não.

Implementa a função checkSizeOfStack(_:_:), que recebe dois argumentos: stack, que é a pilha de cartas, e stackSize, que é o tamanho da pilha. A função deve devolver true se o tamanho da pilha for igual a stackSize e false caso contrário.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Editar via GitHub A ligação abre numa nova janela ou separador
Swift Exercism

Estás pronto para começar Aprendiz de mágico?

Inscreve-te no Exercism para aprenderes e dominares Swift com 35 conceitos116 exercícios, e mentoria humana real, tudo grátis.