Trilhas
/
Crystal
Crystal
/
Exercícios
/
A montanha-russa colossal de Chaitana
A montanha-russa colossal de Chaitana

A montanha-russa colossal de Chaitana

Exercício de aprendizagem

Introdução

Arrays são uma estrutura de dados comum de se trabalhar. Por isso, existe uma coleção de métodos que podem ser usados para lidar com arrays. Isso inclui ordenar, inverter, inserir e muito mais.

Alguns desses métodos são destrutivos, o que significa que eles modificam o array original. Outros são não destrutivos, ou seja, retornam um novo array e não modificam o original.

Veja alguns dos métodos mais comuns que podem ser usados ao lidar com arrays:

insert

Ao inserir um elemento em um array, você pode usar o método insert, que recebe um índice e um elemento como argumentos. O elemento será inserido no índice especificado, e o restante do array será deslocado para a direita. Se o índice estiver fora dos limites, um IndexError será gerado.

numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]

numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)

delete

Quando você quer excluir um elemento específico de um array, pode usar o método delete, que recebe um elemento como argumento. O método retorna o elemento que foi removido. Se o elemento não existir no array, nil será retornado.

numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers           # => [1, 3]

first & last

Quando você quer obter o primeiro ou o último elemento de um array, pode usar os métodos first e last. Esses métodos recebem um argumento opcional que especifica quantos elementos retornar. Eles podem melhorar a legibilidade em comparação com o uso do índice 0 ou -1, ou de um intervalo. Se o array estiver vazio, um Enumerable::EmptyError será gerado.

numbers = [1, 2, 3]
numbers.first # => 1
numbers.last  # => 3

numbers.first(2) # => [1, 2]
numbers.last(2)  # => [2, 3]

empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)

reverse

Quando você quer inverter um array, pode usar o método reverse, que retorna um novo array com os elementos em ordem inversa. É importante observar que reverse retorna um novo array e não modifica o array original. Se você quiser modificar o array original, adicione um ! ao final do nome do método.

numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers         # => [1, 2, 3]

numbers.reverse! # => [3, 2, 1]
numbers          # => [3, 2, 1]

Concat(+)

O método append (<<) é útil quando você quer adicionar objetos a um array. No entanto, ao combinar dois arrays, você pode usar o operador +, que retorna um novo array com os elementos de ambos os arrays.

[1, 2] + [3, 4] # => [1, 2, 3, 4]

Se você adicionar um array a outro array, o array será adicionado como um único elemento.

[1, 2] << [3, 4] # => [1, 2, [3, 4]]

empty?

Ao verificar se um array está vazio, você pode usar o método empty?, que retorna true se o array estiver vazio e false caso contrário. Isso melhora a legibilidade em comparação com verificar o comprimento do array em relação a 0.

[].empty? # => true
[1, 2, 3].empty? # => false

index

Quando você quer obter o índice de um elemento em um array, pode usar o método index, que recebe um elemento como argumento. Se o elemento não existir no array, nil será retornado.

numbers = [1, 2, 3]
numbers.index(2) # => 1

size

Quando você quer saber o número de elementos de um array, pode usar o método size.

numbers = [1, 2, 3]
numbers.size # => 3

count

Quando você quer contar quantas vezes um elemento aparece em um array, pode usar o método count.

fruits = ["apple", "banana", "apple"]
fruits.count("apple")      # => 2
fruits.count("banana")     # => 1
fruits.count("watermelon") # => 0

sort

Quando você quer ordenar um array, pode usar o método sort, que retorna um novo array com os elementos ordenados. Assim como reverse, esse método retorna um novo array e não modifica o array original.

numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers      # => [3, 2, 1]

numbers.sort! # => [1, 2, 3]
numbers       # => [1, 2, 3]

Instruções

Chaitana é dona de um parque temático muito popular. Ela tem apenas uma atração, bem no centro de um terreno com paisagismo belíssimo: A Maior Montanha-Russa do Mundo(TM). Apesar de existir só essa atração, pessoas vêm de todas as partes do mundo e ficam horas na fila pela chance de andar na hipermontanha-russa da Chaitana.

Há duas filas para essa atração, cada uma representada como um array:

  1. Fila normal
  2. Fila expressa (também conhecida como Fast-track), onde as pessoas pagam a mais por acesso prioritário.

Você recebeu a tarefa de escrever um código para gerenciar melhor os visitantes do parque. Você precisa implementar as funções a seguir o quanto antes, antes que os visitantes (e sua chefe, Chaitana!) fiquem de mau humor.

1. Adicionar pessoa à fila

Defina o método ColossalCoaster.add_to_queue, que recebe 4 argumentos <express_queue>, <normal_queue>, <ticket_type>, <person_name> e retorna a fila apropriada atualizada com o nome da pessoa.

  1. <ticket_type> é um Int32, em que 1 == express_queue e 0 == normal_queue.
  2. <person_name> é o nome (como uma String) da pessoa a ser adicionada à fila correspondente.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. Onde estão meus amigos?

Uma pessoa chegou atrasada ao parque, mas quer entrar na fila onde os amigos estão esperando. Só que ela não faz a menor ideia de onde os amigos estão e não há sinal de celular para ligar para eles.

Defina o método ColossalCoaster.find_my_friend, que recebe 2 argumentos, queue e friend_name, e retorna a posição do nome da pessoa na fila.

  1. <queue> é um array de pessoas na fila.
  2. <friend_name> é o nome do amigo cujo índice (posição na fila) você precisa encontrar.
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. Posso entrar na fila junto com eles?

Agora que os amigos foram encontrados (na tarefa 2 acima), quem chegou atrasado quer entrar na fila junto deles, na posição em que estão. Defina o método ColossalCoaster.add_with_friends, que recebe 3 argumentos: queue, friend_name e person_name.

  1. <queue> é um array de pessoas na fila.
  2. <friend_name> é o nome do amigo em cuja posição a pessoa deve ser adicionada.
  3. <person_name> é o nome da pessoa a ser adicionada na posição do índice.

Retorne a fila atualizada com o nome de quem chegou atrasado.

ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. Pessoa mala na fila

Você acabou de ouvir na fila que há uma pessoa muito mala empurrando, gritando e arrumando confusão. Você precisa expulsar esse sujeito por mau comportamento!

Defina o método ColossalCoaster.remove_from_queue, que recebe 2 argumentos, queue e person_name.

  1. <queue> é um array de pessoas na fila.
  2. <person_name> é o nome da pessoa que precisa ser expulsa.

Retorne a fila atualizada, sem o nome da pessoa mala.

ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]

5. Ordene a lista da fila

Por motivos administrativos, você precisa colocar todos os nomes de uma determinada fila em ordem alfabética.

Defina o método ColossalCoaster.sorted_queue, que recebe 1 argumento, queue (o array de pessoas na fila). O método deve retornar uma cópia ordenada do array.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar A montanha-russa colossal de Chaitana?

Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.