Pizza Pi

Pizza Pi

Tanulófeladat

Bevezetés

A Common Lispben, mint sok más nyelvben, a számoknak többféle típusa van. Ezek közül a két legalapvetőbb:

Egész számok

Mint sok más nyelv, a Common Lisp is ismeri az egész számokat. Ezek olyan egész értékek, amelyekben nincs tizedespont (például -6, 0, 25, 1234 stb.).

A Common Lisp nem szab határt az egész számok nagyságának. Az egész számok tetszőlegesen nagyok (vagy negatív esetben kicsik) lehetnek.

Általában, ha csak egész számokkal dolgozol, részesítsd előnyben az egész számokat, mert sok számítás során nem szenvedik el ugyanazt a pontosságvesztést, mint a lebegőpontos számok.

Lebegőpontos számok

Mint sok más nyelvben, a Common Lispben is vannak lebegőpontos számok. Ezek tört- vagy egész értékek, amelyek tizedespontot tartalmaznak (például 3.14, -1.7, 99.99, 2048.0).

Aritmetika

A Common Lisp a legtöbb művelethez a szokásos aritmetikai operátorokat használja, de abban némileg egyedi, hogy „prefix jelölést” használ a megszokottabb „infix jelöléssel” szemben.

Hogy ez vizuálisan is világos legyen:

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

Bár a prefix jelölés néhány műveletet, például a 2 + 2-t a némileg szokatlan (+ 2 2) formába írja át, sokkal könnyebbé teszi, hogy egyszerre több számmal dolgozz.

Alapvető matematika

A Common Lispben megtalálható az összes tipikus függvény: +, -, *, / az összeadáshoz, kivonáshoz, szorzáshoz és osztáshoz.

Az osztásnál felmerülhet, hogy érdekel egy osztás maradéka. Ezt a mod (modulo) függvény végzi el, amely egy számot és egy osztót kap argumentumként:

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

Számok összehasonlítása

Végül hasznos lehet, ha különböző számokat hasonlítasz össze olyan függvényekkel, mint a = (egyenlő), a /= (nem egyenlő) és a >= (nagyobb vagy egyenlő). Amikor ezek az összehasonlítások igazak (mint a (= 1 1) esetén), T-t adnak vissza, amikor pedig nem (mint a (> 0 1) esetén), NIL-t.

Utasítások

Lilly, a Lisp-űrlakó imád főzni. Pizzabulit szeretne rendezni a barátaival, de hogy a lehető legtöbbet hozza ki a hozzávalókból, pontosan tudni szeretné, mennyi kell majd az egyes hozzávalókból, mielőtt belekezd.

Ennek megoldására Lilly írt egy programot, amely a tervezés egy részét automatizálja, de a segítségedre van szüksége, hogy befejezze. Segítesz Lillynek megrendezni az arányaiban tökéletes pizzabulit?

1. A tészta arányai

Kezdjük az elején: minden remek pizza egy finom tésztával kezdődik!

Lilly a vékony, ropogós, de vastagabb szélű pizzákat kedveli. A középső részhez fixen 200 g tészta kell, a perem minden 20 cm-éhez pedig 45 g tészta.

Szerencsére Lilly felírta az egyenletet, amellyel a tészta grammjai (g) kiszámíthatók a pizzák számából (n) és azok átmérőjéből (d):

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

Lillynek egy olyan függvényre van szüksége, amely:

  • megkapja a pizzák számát (n) és azok átmérőjét (d),
  • és visszaadja a szükséges tésztamennyiséget a legközelebbi grammra kerekítve (g).

Például 4 darab 30 cm átmérőjű pizza elkészítéséhez:

(dough-calculator 4 30) ; => 1648

2. Egy csöpp szósz

Lilly nagyon precíz, amikor felkeni a szószt, a pizzái mérete azonban ingadozó lehet.

Az átmérő (d) meghatározásához az alábbi egyenletet használja, amelyben a felhasznált szósz (s) a változó:

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

Lillynek egy olyan függvényre van szüksége, amely a felhasznált szósz minden milliliteréből (s) kiszámítja a pizza átmérőjét (d).

Például ha Lilly 250 ml szószt használt fel:

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

3. Egy kis sajtot, kérem

Lilly bolygóján minden sajt tökéletes kocka formájában kapható, és méretre árulják. (Mire számítottál? Végül is ez egy idegen bolygó...)

Lilly ismét felírt egy egyenletet, amellyel kiszámítható, hány darab (n) adott átmérőjű (d) pizza készíthető egy l oldalhosszúságú sajtkockából:

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

Készíts egy olyan függvényt, amely:

  • megkapja egy sajtkocka oldalhosszát (l) és a pizzák átmérőjét (d),
  • és visszaadja a készíthető pizzák számát (n) lefelé kerekítve.

Például egy 25x25x25 cm-es sajtkocka és 30 cm átmérőjű pizzák esetén:

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

4. Igazságos osztozkodás

Végül Lilly azt szeretné, hogy minden pizzája 8 szeletre legyen vágva, és azok egyenletesen osszanak el a barátai között.

Készíts egy olyan függvényt, amely:

  • megkapja a pizzák számát és a barátok számát,
  • és T-t ad vissza, ha a pizzák egyenletesen eloszthatók a barátok között, egyébként NIL-t.

Például:

;; 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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Common Lisp Exercism

Készen állsz elkezdeni a(z) Pizza Pi feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Common Lisp nyelvet 27 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.