Піца й Пі

Піца й Пі

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

Вступ

У Common Lisp, як і в багатьох інших мовах, числа бувають кількох типів. Ось два з найпростіших:

Цілі числа

Як і в багатьох мовах, у Common Lisp є цілі числа. Це цілі числа без десяткової точки (як-от -6, 0, 25, 1234 тощо).

Common Lisp не обмежує величину цілих чисел. Цілі числа можуть бути як завгодно великими (або малими, якщо вони відʼємні).

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

Числа з плаваючою комою

Як і в багатьох мовах, у Common Lisp є числа з плаваючою комою. Це дробові або цілі числа, записані з десятковою точкою (як-от 3.14, -1.7, 99.99, 2048.0).

Арифметика

Для більшості операцій Common Lisp використовує стандартні арифметичні оператори, але дещо вирізняється тим, що застосовує «префіксний запис» замість звичнішого «інфіксного запису».

Наочніше:

;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5)     ; => 15

Хоча префіксний запис перетворює деякі операції, як-от 2 + 2, на дещо незвичну форму (+ 2 2), він значно полегшує роботу з кількома числами водночас.

Основна математика

У Common Lisp є всі типові функції: +, -, *, / для додавання, віднімання, множення й ділення.

Коли маємо справу з діленням, може знадобитися дізнатися остачу від ділення. Для цього є функція mod (від modulo), яка приймає число та дільник як аргументи:

(mod 4 2)  ; => 0
(mod 2 4)  ; => 2
(mod 10 3) ; => 1

Порівняння чисел

Нарешті, порівнювати різні числа може бути корисно за допомогою таких функцій, як = (дорівнює), /= (не дорівнює) та >= (більше або дорівнює). Коли ці порівняння істинні (як-от (= 1 1)), вони повертають T, а коли хибні (як-от (> 0 1)), то повертають NIL.

Вказівки

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

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

1. Пропорція тіста

Почнімо з головного: кожна чудова піца починається зі смачного тіста!

Ліллі любить тонкі хрусткі піци з товстішою скоринкою. Для середини потрібно незмінно 200 г тіста, а на кожні 20 см скоринки йде 45 г тіста.

На щастя, Ліллі вивела рівняння для грамів тіста (g) з кількості піц (n) та їхнього діаметра (d):

g = n * (((45 * pi * d) / 20) + 200)

Ліллі потрібна функція, яка:

  • Приймає кількість піц (n) та їхній діаметр (d)
  • І повертає потрібну кількість тіста, округлену до найближчого грама (g).

Наприклад, щоб приготувати 4 піци діаметром 30 см:

(dough-calculator 4 30) ; => 1648

2. Трохи соусу

Ліллі ретельно наносить соус, але розмір її піц може виходити різним.

Щоб визначити діаметр (d), вона користується наведеним нижче рівнянням, у якому змінна s означає кількість нанесеного соусу:

d = square-root of ((40 * s) / (3 * pi))

Ліллі потрібна функція, яка обчислює діаметр піци (d) з кожного мілілітра нанесеного соусу (s).

Наприклад, якщо Ліллі використала 250 мл соусу:

(size-from-sauce 250) ; => 32.57

3. Трохи сиру, будь ласка

На планеті Ліллі весь сир має форму ідеальних кубів і продається за розміром. (А чого ж іще чекати? Це ж таки інопланетна планета...)

І знову Ліллі вивела рівняння для кількості піц (n) певного діаметра (d), які можна приготувати з куба сиру з довжиною сторони (l):

n = (2 * (l^3)) / (3* pi * (d^2))

Створіть функцію, яка:

  • Приймає довжину сторони куба сиру (l) та діаметр піц (d),
  • І повертає кількість піц (n), округлену в менший бік.

Наприклад, для куба сиру 25x25x25 см і піц діаметром 30 см:

(pizzas-per-cube 25 30) ; => 3

4. Справедлива частка

Нарешті, Ліллі хоче, щоб кожна піца ділилася на 8 шматків і рівномірно розподілялася між її друзями.

Створіть функцію, яка:

  • Приймає кількість піц і кількість друзів
  • і повертає T, якщо піци розподіляться між друзями порівну, та NIL в іншому разі.

Наприклад:

;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Common Lisp Exercism

Час розпочати Піца й Пі?

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