У 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.
Ліллі, інопланетянка з планети Лісп, любить готувати. Вона хоче влаштувати вечірку з піцою для своїх друзів, але, щоб оптимально використати інгредієнти, їй хотілося б точно знати, скільки кожного з них знадобиться, перш ніж почати.
Щоб розвʼязати цю задачу, Ліллі написала чернетку програми, яка автоматизує частину планування, але їй потрібна наша допомога, щоб її завершити. Допоможемо Ліллі влаштувати ідеально пропорційну вечірку з піцою?
Почнімо з головного: кожна чудова піца починається зі смачного тіста!
Ліллі любить тонкі хрусткі піци з товстішою скоринкою. Для середини потрібно незмінно 200 г тіста, а на кожні 20 см скоринки йде 45 г тіста.
На щастя, Ліллі вивела рівняння для грамів тіста (g) з кількості піц (n) та їхнього діаметра (d):
g = n * (((45 * pi * d) / 20) + 200)
Ліллі потрібна функція, яка:
Наприклад, щоб приготувати 4 піци діаметром 30 см:
(dough-calculator 4 30) ; => 1648
Ліллі ретельно наносить соус, але розмір її піц може виходити різним.
Щоб визначити діаметр (d), вона користується наведеним нижче рівнянням, у якому змінна s означає кількість нанесеного соусу:
d = square-root of ((40 * s) / (3 * pi))
Ліллі потрібна функція, яка обчислює діаметр піци (d) з кожного мілілітра нанесеного соусу (s).
Наприклад, якщо Ліллі використала 250 мл соусу:
(size-from-sauce 250) ; => 32.57
На планеті Ліллі весь сир має форму ідеальних кубів і продається за розміром. (А чого ж іще чекати? Це ж таки інопланетна планета...)
І знову Ліллі вивела рівняння для кількості піц (n) певного діаметра (d), які можна приготувати з куба сиру з довжиною сторони (l):
n = (2 * (l^3)) / (3* pi * (d^2))
Створіть функцію, яка:
Наприклад, для куба сиру 25x25x25 см і піц діаметром 30 см:
(pizzas-per-cube 25 30) ; => 3
Нарешті, Ліллі хоче, щоб кожна піца ділилася на 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.