Pizza Pi

Pizza Pi

Esercizio di apprendimento

Introduzione

In Common Lisp, come in molte lingue, i numeri esistono in diversi tipi: i due più fondamentali sono:

Numeri interi

Come in molte lingue, Common Lisp contiene numeri interi. Sono numeri interi senza punto decimale (come -6, 0, 25, 1234, ecc.)

Common Lisp non definisce limiti alla grandezza degli interi. Gli interi possono essere arbitrariamente grandi (o piccoli, se negativi).

In generale, se lavori solo con numeri interi, conviene preferire gli interi, perché non soffrono della stessa perdita di precisione dei numeri in virgola mobile su molti calcoli.

Numeri in virgola mobile

Come in molte lingue, Common Lisp contiene numeri in virgola mobile. Sono numeri frazionari o interi che includono un punto decimale (come 3.14, -1.7, 99.99, 2048.0).

Aritmetica

Common Lisp usa gli operatori aritmetici standard per la maggior parte delle operazioni, ma è piuttosto insolito nell'usare una «notazione prefissa» invece della più familiare «notazione infissa».

Per vederlo più chiaramente:

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

Sebbene la notazione prefissa trasformi alcune operazioni come 2 + 2 nella forma un po' insolita (+ 2 2), rende molto più facile operare su più numeri contemporaneamente.

Matematica di base

Common Lisp ha tutte le funzioni tipiche: +, -, *, / per addizione, sottrazione, moltiplicazione e divisione.

Quando si considera la divisione, può essere utile conoscere il resto di una divisione; questo si ottiene con la funzione mod (per modulo), che prende come argomenti un numero e un divisore:

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

Confrontare i numeri

Infine, può essere utile confrontare numeri diversi usando funzioni come = (uguale), /= (diverso da) e >= (maggiore o uguale a). Quando questi confronti sono veri (come in (= 1 1)), restituiscono T, mentre quando non lo sono (come in (> 0 1)), restituiscono NIL.

Istruzioni

Lilly l'aliena di Lisp adora cucinare. Vuole organizzare una festa della pizza con i suoi amici ma, per sfruttare al meglio i suoi ingredienti, vorrebbe sapere esattamente quanto di ogni ingrediente le servirà prima di iniziare.

Per risolvere il problema, Lilly ha abbozzato un programma per automatizzare una parte della pianificazione, ma ha bisogno del tuo aiuto per finirlo. Aiuterai Lilly a organizzare la festa della pizza dalle proporzioni perfette?

1. Il rapporto dell'impasto

Prima di tutto, ogni grande pizza inizia con un impasto delizioso!

Lilly adora le pizze sottili e croccanti con una crosta più spessa. L'impasto necessario per il centro è un valore costante di 200 g, ma ogni 20 cm di crosta richiede 45 g di impasto.

Per fortuna, Lilly ha calcolato l'equazione per i grammi di impasto (g) a partire dal numero di pizze (n) e dal loro diametro (d):

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

Lilly ha bisogno di una funzione che:

  • Prenda il numero di pizze (n) e il loro diametro (d)
  • E restituisca l'impasto necessario, arrotondato al grammo più vicino (g).

Per esempio, per fare 4 pizze di 30 cm di diametro:

(dough-calculator 4 30) ; => 1648

2. Un tocco di salsa

Lilly è meticolosa quando stende la salsa, ma le dimensioni delle sue pizze possono essere incostanti.

Per calcolare il diametro (d), usa l'equazione seguente, con la salsa applicata (s) come variabile:

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

Lilly ha bisogno di una funzione che calcoli il diametro della pizza (d) a partire da ogni millilitro di salsa applicata (s).

Per esempio, dato che Lilly ha usato 250 ml di salsa:

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

3. Un po' di formaggio, per favore

Sul pianeta di Lilly, tutto il formaggio arriva in cubi perfetti e viene venduto in base alla dimensione. (Cosa ti aspettavi? Dopotutto è un pianeta alieno...)

Ancora una volta, Lilly ha calcolato un'equazione per il numero di pizze (n) di un certo diametro (d) che si possono fare con un cubo di formaggio di lato (l):

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

Crea una funzione che:

  • Prenda il lato di un cubo di formaggio (l) e il diametro delle pizze (d),
  • E restituisca il numero di pizze (n) fatte, arrotondando per difetto.

Per esempio, dato un cubo di formaggio di 25x25x25 cm e pizze di 30 cm di diametro:

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

4. Una divisione equa

Infine, Lilly vuole che le sue pizze si dividano in 8 fette ciascuna e siano distribuite equamente tra i suoi amici.

Crea una funzione che:

  • Prenda un numero di pizze e un numero di amici
  • e restituisca T se le pizze si distribuiranno equamente tra gli amici e NIL altrimenti.

Per esempio:

;; 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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Common Lisp Exercism

Vuoi iniziare Pizza Pi?

Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.