Track
/
Crystal
Crystal
/
Esercizi
/
La colossale montagna russa di Chaitana
La colossale montagna russa di Chaitana

La colossale montagna russa di Chaitana

Esercizio di apprendimento

Introduzione

Gli array sono una struttura dati comune con cui si lavora spesso. Per questo motivo esiste una raccolta di metodi che si possono usare per gestirli. Tra questi ci sono l'ordinamento, l'inversione, l'inserimento e molti altri.

Alcuni di questi metodi sono distruttivi, il che significa che modificano l'array originale. Altri sono non distruttivi, cioè restituiscono un nuovo array e non modificano quello originale.

Ecco alcuni dei metodi più comuni che si possono usare quando si lavora con gli array:

insert

Quando inserisci un elemento in un array, puoi usare il metodo insert, che accetta un indice e un elemento come argomenti. L'elemento viene inserito all'indice specificato e il resto dell'array viene spostato a destra. Se l'indice è fuori dai limiti, viene sollevato un IndexError.

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 vuoi eliminare un elemento specifico da un array, puoi usare il metodo delete, che accetta un elemento come argomento. Il metodo restituisce l'elemento rimosso. Se l'elemento non esiste nell'array, viene restituito nil.

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

first & last

Quando vuoi ottenere il primo o l'ultimo elemento di un array, puoi usare i metodi first e last. Questi metodi accettano un argomento opzionale che specifica quanti elementi restituire. Possono migliorare la leggibilità rispetto all'uso dell'indice 0 o -1, oppure di un intervallo. Se l'array è vuoto, viene sollevato un Enumerable::EmptyError.

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 vuoi invertire un array, puoi usare il metodo reverse, che restituisce un nuovo array con gli elementi in ordine inverso. È importante notare che reverse restituisce un nuovo array e non modifica l'array originale. Se vuoi modificare l'array originale, aggiungi un ! alla fine del nome del metodo.

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

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

Concat(+)

Il metodo di aggiunta (<<) è utile quando vuoi aggiungere oggetti a un array. Tuttavia, quando combini due array, puoi usare l'operatore +, che restituisce un nuovo array con gli elementi di entrambi.

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

Se aggiungi un array a un altro array, l'array viene aggiunto come singolo elemento.

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

empty?

Per verificare se un array è vuoto, puoi usare il metodo empty?, che restituisce true se l'array è vuoto e false altrimenti. Questo migliora la leggibilità rispetto a confrontare la lunghezza dell'array con 0.

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

index

Quando vuoi ottenere l'indice di un elemento in un array, puoi usare il metodo index, che accetta un elemento come argomento. Se l'elemento non esiste nell'array, viene restituito nil.

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

size

Quando vuoi sapere il numero di elementi in un array, puoi usare il metodo size.

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

count

Quando vuoi contare quante volte un elemento è presente in un array, puoi usare il metodo count.

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

sort

Quando vuoi ordinare un array, puoi usare il metodo sort, che restituisce un nuovo array con gli elementi ordinati. Come con reverse, questo metodo restituisce un nuovo array e non modifica l'array originale.

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

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

Istruzioni

Chaitana possiede un parco divertimenti molto popolare. Ha una sola attrazione, proprio al centro di un terreno dal paesaggio curatissimo: The Biggest Roller Coaster in the World(TM). Anche se c'è solo questa attrazione, arrivano persone da tutto il mondo e fanno la fila per ore pur di avere la possibilità di salire sull'hypercoaster di Chaitana.

Ci sono due code per questa attrazione, ognuna rappresentata da un array:

  1. Coda normale
  2. Coda express (nota anche come Fast-track), dove le persone pagano un extra per avere accesso prioritario.

Ti è stato chiesto di scrivere del codice per gestire meglio gli ospiti del parco. Devi implementare le seguenti funzioni il prima possibile, prima che gli ospiti (e la tua capa, Chaitana!) si innervosiscano.

1. Aggiungi una persona alla coda

Definisci il metodo ColossalCoaster.add_to_queue, che accetta 4 argomenti <express_queue>, <normal_queue>, <ticket_type>, <person_name> e restituisce la coda appropriata aggiornata con il nome della persona.

  1. <ticket_type> è un Int32 dove 1 == express_queue e 0 == normal_queue.
  2. <person_name> è il nome (come String) della persona da aggiungere alla coda corrispondente.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. Dove sono i miei amici?

Una persona è arrivata tardi al parco, ma vuole mettersi nella coda dove aspettano i suoi amici. Però non ha idea di dove si trovino e non c'è campo per telefono per chiamarli.

Definisci il metodo ColossalCoaster.find_my_friend, che accetta 2 argomenti queue e friend_name e restituisce la posizione nella coda del nome della persona.

  1. <queue> è un array di persone che stanno in coda.
  2. <friend_name> è il nome dell'amico di cui devi trovare l'indice (la posizione nella coda).
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. Posso unirmi a loro?

Ora che i suoi amici sono stati trovati (nel compito 2 qui sopra), il ritardatario vorrebbe unirsi a loro nella loro posizione in coda. Definisci il metodo ColossalCoaster.add_with_friends, che accetta 3 argomenti queue, friend_name e person_name.

  1. <queue> è un array di persone che stanno in coda.
  2. <friend_name> è il nome dell'amico nella cui posizione va aggiunta la persona.
  3. <person_name> è il nome della persona da aggiungere in quella posizione di indice.

Restituisci la coda aggiornata con il nome del ritardatario.

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

4. Una persona maleducata in coda

Hai appena saputo dalla coda che c'è una persona davvero maleducata che spinge, urla e crea problemi. Devi cacciare quel mascalzone per il suo comportamento!

Definisci il metodo ColossalCoaster.remove_from_queue, che accetta 2 argomenti queue e person_name.

  1. <queue> è un array di persone che stanno in coda.
  2. <person_name> è il nome della persona da cacciare.

Restituisci la coda aggiornata senza il nome della persona maleducata.

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

5. Ordina la lista della coda

Per motivi amministrativi, devi ottenere tutti i nomi di una determinata coda in ordine alfabetico.

Definisci il metodo ColossalCoaster.sorted_queue, che accetta 1 argomento, queue (l'array di persone che stanno in coda). Il metodo deve restituire una copia ordinata dell'array.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Crystal Exercism

Vuoi iniziare La colossale montagna russa di Chaitana?

Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.