Треки
/
Julia
Julia
/
Вправи
/
Змішані соки
Змішані соки

Змішані соки

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

Вступ

По суті, є два типи циклів:

  1. Повторювати, доки не виконається умова.
  2. Перебирати елементи в колекції.

Обидва можливі в Julia, хоча другий може бути поширенішим.

Цикл while

Для задач, де заздалегідь невідомо, скільки разів ми пройдемо цикл, у Julia є цикл while.

Базова форма досить проста:

while condition
    do_something()
end

У цьому випадку програма продовжуватиме виконувати цикл, доки condition не перестане бути true.

Є два способи достроково вийти з циклу:

  • break завершує цикл, і виконання продовжується з наступного рядка після end циклу.
  • return x зупиняє виконання поточної функції та повертає значення x тому, хто її викликав.

Коли є ці можливості, іноді зручно створити «нескінченний» цикл за допомогою while true ... end, а потім покладатися на те, що умова зупинки всередині тіла циклу викличе break або return.

Цикл по колекції

Найпростіше показати це на циклі по діапазону.

Якщо ми хочемо виконати щось 10 разів:

for n in 1:10
    do_something(n)
end

Якщо поточна ітерація не задовольняє якусь умову, можна одразу перейти до наступної ітерації за допомогою continue:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

У коротшій формі блок if можна замінити на is_useless(n) && continue.

Можна перебирати й багато інших типів колекцій: елементи масиву, символи в рядку тексту (англ. string), ключі у словнику...

У прикладах досі ми перебираємо діапазон 1:10, де значення також є індексом циклу.

Загалом індекс може бути потрібним, а не лише значення. Для цього використовують функцію eachindex(), наприклад for i in eachindex(my_array) ... end.

Вказівки

Наша подруга Лі Мей тримає бар, де продає смачні змішані фруктові соки. Ми часто буваємо в її крамниці й розуміємо, що могли б полегшити життя подрузі. Тож вирішуємо скористатися своїми навичками програмування, щоб допомогти Лі Мей у її роботі.

1. Визначте, скільки часу потрібно, щоб змішати сік

Лі Мей любить заздалегідь казати клієнтам, скільки їм доведеться чекати на замовлений із меню сік. Їй важко запамʼятати точні числа, бо час змішування соків різний. "Pure Strawberry Joy" займає 0.5 хвилини, "Energizer" і "Green Garden" - по 1.5 хвилини, "Tropical Island" - 3 хвилини, а "All or Nothing" - 5 хвилин. Для всіх інших напоїв (наприклад, спеціальних пропозицій) можна припустити, що приготування займає 2.5 хвилини.

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

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. Поповніть запас часточок лайма

Багато витворів Лі Мей містять часточки лайма, як інгредієнт або як прикрасу. Тож коли вона починає зміну вранці, їй треба подбати, щоб контейнер із часточками лайма був повний на весь день.

Реалізуйте функцію limes_to_cut, яка приймає кількість часточок лайма, які Лі Мей має нарізати, і масив, що представляє наявний запас цілих лаймів. З "small" лайма вона отримує 6 часточок, з "medium" - 8 часточок, а з "large" - 10. Вона завжди нарізає лайми в тому порядку, у якому вони розташовані в масиві, починаючи з першого елемента. Вона продовжує, доки не досягне потрібної кількості часточок або доки в неї не закінчаться лайми.

Лі Мей хотіла б знати заздалегідь, скільки лаймів їй треба нарізати. Функція limes_to_cut має повернути кількість лаймів для нарізання.

julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4

3. Перелічіть час змішування кожного замовлення в черзі

Лі Мей любить тримати під контролем, скільки часу займе змішування замовлень, на які чекають клієнти.

Реалізуйте функцію order_times, яка приймає чергу замовлень і повертає вектор часу змішування.

julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]

4. Завершіть зміну

Лі Мей завжди працює до третьої години дня. Потім її змінює працівник Дмитро. Часто буває, що коли зміна Лі Мей закінчується, частину напоїв уже замовили, але ще не приготували. Тоді Дмитро готує решту соків.

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

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

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Julia Exercism

Час розпочати Змішані соки?

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