Треки
/
Crystal
Crystal
/
Вправи
/
Колосальні гірки Чайтани
Колосальні гірки Чайтани

Колосальні гірки Чайтани

Навчальна вправа

Вступ

Масиви - це поширена структура даних, з якою ми працюємо. Для роботи з масивами існує чимало методів. До них належать сортування, обернення, вставлення та багато інших.

Деякі з цих методів деструктивні, тобто вони змінюють початковий масив. Інші не деструктивні: вони повертають новий масив і не змінюють початковий.

Ось кілька найпоширеніших методів, які можна використовувати під час роботи з масивами:

insert

Коли ми вставляємо елемент у масив, можна скористатися методом insert, який приймає індекс і елемент як аргументи. Елемент буде вставлено за вказаним індексом, а решту масиву буде зсунуто праворуч. Якщо індекс виходить за межі, виникне помилка 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

Коли потрібно видалити конкретний елемент з масиву, можна скористатися методом delete, який приймає елемент як аргумент. Метод повертає елемент, який було видалено. Якщо такого елемента в масиві немає, буде повернено nil.

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

first & last

Коли потрібно отримати перший або останній елемент масиву, можна скористатися методами first і last. Ці методи приймають необовʼязковий аргумент, який указує, скільки елементів повернути. Це може покращити читабельність порівняно з використанням індексу 0 або -1 чи діапазону. Якщо масив порожній, виникне помилка 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

Коли потрібно обернути масив, можна скористатися методом reverse, який повертає новий масив із елементами у зворотному порядку. Важливо зауважити, що reverse повертає новий масив і не змінює початковий. Якщо ми хочемо змінити початковий масив, додамо ! у кінець назви методу.

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

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

Конкатенація (+)

Метод додавання (<<) стає в пригоді, коли потрібно додати обʼєкти до масиву. Однак для поєднання двох масивів можна скористатися оператором +, який повертає новий масив з елементами обох масивів.

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

Якщо додати масив до іншого масиву, масив буде додано як один елемент.

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

empty?

Коли потрібно перевірити, чи масив порожній, можна скористатися методом empty?, який повертає true, якщо масив порожній, і false в іншому разі. Це покращує читабельність порівняно з перевіркою довжини масиву на рівність 0.

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

index

Коли потрібно отримати індекс елемента в масиві, можна скористатися методом index, який приймає елемент як аргумент. Якщо такого елемента в масиві немає, буде повернено nil.

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

size

Коли потрібно дізнатися кількість елементів у масиві, можна скористатися методом size.

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

count

Коли потрібно порахувати, скільки разів елемент трапляється в масиві, можна скористатися методом count.

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

sort

Коли потрібно відсортувати масив, можна скористатися методом sort, який повертає новий масив із відсортованими елементами. Як і у випадку з reverse, цей метод повертає новий масив і не змінює початковий.

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

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

Вказівки

Чайтана володіє дуже популярним парком розваг. У неї є лише один атракціон у самому центрі гарно облаштованої території: Найбільші американські гірки у світі(TM). Хоча тут є лише ця одна атракція, люди з усього світу приїжджають і годинами стоять у черзі, щоб мати можливість прокататися на гіперкостері Чайтани.

Для цього атракціону є дві черги, кожна з яких представлена як array:

  1. Звичайна черга
  2. Експрес-черга (також відома як швидка доріжка), де люди доплачують за пріоритетний доступ.

Нас попросили написати код, щоб краще керувати відвідувачами парку. Нам потрібно якнайшвидше реалізувати наведені нижче функції, перш ніж відвідувачі (і наш начальник, Чайтана!) почнуть дратуватися.

1. Додати людину в чергу

Визначте метод ColossalCoaster.add_to_queue, який приймає 4 аргументи <express_queue>, <normal_queue>, <ticket_type>, <person_name> і повертає відповідну чергу з доданим іменем людини.

  1. <ticket_type> має тип Int32, де 1 == express_queue, а 0 — normal_queue.
  2. <person_name> — це імʼя (як String) людини, яку потрібно додати до відповідної черги.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. Де мої друзі?

Одна людина прийшла до парку пізно, але хоче приєднатися до черги, де чекають її друзі. Але вона гадки не має, де стоять її друзі, і немає сигналу, щоб їм зателефонувати.

Визначте метод ColossalCoaster.find_my_friend, який приймає 2 аргументи queue і friend_name та повертає позицію в черзі людини з таким іменем.

  1. <queue> — це array з людей, що стоять у черзі.
  2. <friend_name> — це імʼя друга, індекс якого (місце в черзі) потрібно знайти.
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. Чи можна до них приєднатися?

Тепер, коли їхніх друзів знайдено (у завданні №2 вище), той, хто запізнився, хотів би приєднатися до них на їхньому місці в черзі. Визначте метод ColossalCoaster.add_with_friends, який приймає 3 аргументи queue, friend_name і person_name.

  1. <queue> — це array з людей, що стоять у черзі.
  2. <friend_name> — це імʼя друга, на позицію якого потрібно додати людину.
  3. <person_name> — це імʼя людини, яку потрібно додати на цю позицію.

Поверніть чергу, оновлену іменем того, хто запізнився.

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

4. Зла людина в черзі

Ми щойно почули від черги, що там є дуже зла людина, яка штовхається, кричить і влаштовує сварки. Нам потрібно вигнати цього бешкетника за погану поведінку!

Визначте метод ColossalCoaster.remove_from_queue, який приймає 2 аргументи queue і person_name.

  1. <queue> — це array з людей, що стоять у черзі.
  2. <person_name> — це імʼя людини, яку потрібно вигнати.

Поверніть чергу, оновлену без імені цієї злої людини.

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

5. Відсортувати список черги

З адміністративних міркувань нам потрібно отримати всі імена в заданій черзі в алфавітному порядку.

Визначте метод ColossalCoaster.sorted_queue, який приймає 1 аргумент queue (array з людей, що стоять у черзі). Метод має повертати відсортовану копію array.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Колосальні гірки Чайтани?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.