Trilhas
/
Swift
Swift
/
Exercícios
/
Mágico em Treinamento
Mágico em Treinamento

Mágico em Treinamento

Exercício de aprendizagem

Introdução

Arrays são um dos três principais tipos de coleção do Swift. Um array, também chamado de vetor, é uma lista ordenada de elementos. Arrays podem armazenar elementos de qualquer tipo, mas todos os elementos de um determinado array precisam ser do mesmo tipo. Arrays são mutáveis quando atribuídos a uma variável, o que significa que você pode adicionar, remover ou modificar elementos depois de criar o array. Quando atribuído a uma constante, um array é imutável, o que significa que seu conteúdo não pode ser alterado.

Literais de array são escritos como uma lista de elementos separados por vírgula e entre colchetes ([...]). O Swift consegue inferir o tipo do array a partir dos elementos 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!"]

Você também pode especificar o tipo explicitamente. Os tipos de array podem ser escritos 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

Você pode descobrir o número de elementos em um array usando a propriedade count:

evenInts.count
// returns 6

Arrays vazios

Para criar um array vazio, você precisa especificar o tipo dele. Você pode fazer isso usando a sintaxe de inicializador de array ou uma anotação de tipo explícita:

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

Arrays multidimensionais

Arrays podem ser aninhados para criar arrays multidimensionais. Ao especificar o tipo de um array aninhado explicitamente, coloque o tipo do elemento entre colchetes aninhados, como [[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]]

Adicionar ao final de um array

Você pode adicionar um elemento ao final de um array mutável usando 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 em um array

Você pode inserir um elemento em um índice específico usando o método insert(_:at:). Esse método recebe dois argumentos: o elemento a inserir e o índice no qual inseri-lo.

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

Você pode combinar dois arrays em um único array usando o operador +. O operador + cria e retorna um novo array. Ele 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]

Acessar elementos de um array

Você pode acessar um elemento individual de um array colocando o índice dele entre colchetes ([]) depois do nome do array. Os índices de array são valores Int baseados em zero, começando em 0 para o primeiro elemento. Acessar um índice fora do intervalo válido causa um erro em tempo de execução e faz o programa travar.

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

Você pode alterar um elemento em um array mutável atribuindo um novo valor a um índice específico. Assim como na leitura de elementos, usar um índice fora do intervalo válido causa 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 em uma string e vice-versa

Você pode juntar um array de strings em uma única string usando 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"

Você pode dividir uma string em um array de substrings usando o método split(separator:), passando o caractere 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

Você pode remover um elemento em um determinado índice usando o método remove(at:). O índice precisa 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, use o método removeLast(). Chamar removeLast() em um array vazio causa 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 uma futura maga, Elyse precisa praticar alguns fundamentos. Ela tem uma pilha de cartas que quer manipular.

Para facilitar um pouco as coisas, ela usa apenas as cartas de 1 a 10, então a pilha de cartas dela pode ser representada por um array de números. A posição de uma carta corresponde ao índice no array. Isso significa que a posição 0 se refere à primeira carta, a posição 1 à segunda, e assim por diante.

Note

Todas as funções devem atualizar o array de cartas e então retornar o array modificado, uma forma comum de trabalhar conhecida como padrão Builder, que permite encadear funções de forma elegante.

1. Recupere uma carta de uma pilha

Para pegar uma carta, retorne a carta no índice position da pilha fornecida.

Implemente 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 retornar a carta na posição index da pilha fornecida.

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

2. Troque uma carta na pilha

Faça um truque de mágica e troque a carta no índice position pela carta de substituição fornecida.

Implemente 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 substitui a carta na posição index. A função deve retornar uma cópia da pilha com a carta na posição index substituída pela nova carta. Se o index fornecido não for um índice válido na pilha, a pilha original deve ser retornada, 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. Insira uma carta no topo da pilha

Faça uma carta aparecer inserindo uma nova carta no topo da pilha.

Implemente a função insert(_:atTopOf:) que recebe dois argumentos: a nova carta a ser inserida e a pilha de cartas. A função deve retornar uma cópia da pilha com a nova carta fornecida adicionada ao topo da pilha.

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

4. Remova uma carta da pilha

Faça uma carta desaparecer removendo da pilha a carta na position fornecida.

Implemente 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 retornar uma cópia da pilha com a carta na posição index removida. Se o index fornecido não for um índice válido na pilha, a pilha original deve ser retornada, sem alterações.

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

5. Insira uma carta na pilha

Faça uma carta aparecer inserindo uma nova carta na position fornecida na pilha.

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

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

6. Verifique o tamanho da pilha

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

Implemente 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 retornar 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 O link abre em uma nova janela ou aba
Swift Exercism

Tudo pronto para começar Mágico em Treinamento?

Crie sua conta no Exercism para aprender e dominar Swift com 35 conceitos116 exercícios e mentoria humana de verdade, tudo de graça.