По суті, є два типи циклів:
Обидва можливі в 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.
Наша подруга Лі Мей тримає бар, де продає смачні змішані фруктові соки. Ми часто буваємо в її крамниці й розуміємо, що могли б полегшити життя подрузі. Тож вирішуємо скористатися своїми навичками програмування, щоб допомогти Лі Мей у її роботі.
Лі Мей любить заздалегідь казати клієнтам, скільки їм доведеться чекати на замовлений із меню сік. Їй важко запамʼятати точні числа, бо час змішування соків різний.
"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
Багато витворів Лі Мей містять часточки лайма, як інгредієнт або як прикрасу. Тож коли вона починає зміну вранці, їй треба подбати, щоб контейнер із часточками лайма був повний на весь день.
Реалізуйте функцію limes_to_cut, яка приймає кількість часточок лайма, які Лі Мей має нарізати, і масив, що представляє наявний запас цілих лаймів.
З "small" лайма вона отримує 6 часточок, з "medium" - 8 часточок, а з "large" - 10.
Вона завжди нарізає лайми в тому порядку, у якому вони розташовані в масиві, починаючи з першого елемента.
Вона продовжує, доки не досягне потрібної кількості часточок або доки в неї не закінчаться лайми.
Лі Мей хотіла б знати заздалегідь, скільки лаймів їй треба нарізати.
Функція limes_to_cut має повернути кількість лаймів для нарізання.
julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4
Лі Мей любить тримати під контролем, скільки часу займе змішування замовлень, на які чекають клієнти.
Реалізуйте функцію order_times, яка приймає чергу замовлень і повертає вектор часу змішування.
julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]
Лі Мей завжди працює до третьої години дня. Потім її змінює працівник Дмитро. Часто буває, що коли зміна Лі Мей закінчується, частину напоїв уже замовили, але ще не приготували. Тоді Дмитро готує решту соків.
Щоб полегшити передачу зміни, реалізуйте функцію remaining_orders, яка приймає кількість хвилин, що залишилися до кінця зміни Лі Мей, і масив соків, які вже замовили, але ще не приготували.
Функція має повернути замовлення, які Лі Мей не встигне почати готувати до кінця свого робочого дня.
Час, що залишився до кінця зміни, завжди буде більший за 0. Масив соків для приготування ніколи не буде порожнім. Крім того, замовлення готують у тому порядку, у якому вони стоять у масиві. Якщо Лі Мей почала змішувати якийсь сік, вона завжди доведе його до кінця, навіть якщо доведеться попрацювати трохи довше. Якщо жодного замовлення, яким має зайнятися Дмитро, не залишилося, треба повернути порожній вектор.
julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.