Pizza Pi

Pizza Pi

Ejercicio de aprendizaje

Introducción

En Common Lisp, como en muchos lenguajes, los números vienen en varios tipos; dos de los más básicos son:

Enteros

Como en muchos lenguajes, Common Lisp incluye números enteros. Son números sin punto decimal (como -6, 0, 25, 1234, etc.)

Common Lisp no define límites para la magnitud de los enteros. Los enteros pueden ser arbitrariamente grandes (o pequeños si son negativos).

En general, si trabajas solo con números enteros, conviene que prefieras los enteros, ya que no sufren la misma pérdida de precisión que los números de punto flotante tras muchos cálculos.

Números de punto flotante

Como en muchos lenguajes, Common Lisp incluye números de punto flotante. Son números fraccionarios o enteros que incluyen un punto decimal (como 3.14, -1.7, 99.99, 2048.0).

Aritmética

Common Lisp usa los operadores aritméticos estándar para casi todas las operaciones, pero es algo particular al usar la «notación de prefijo» en lugar de la más familiar «notación de infijo».

De forma más visual:

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

Aunque la notación de prefijo convierte algunas operaciones como 2 + 2 en la forma algo poco familiar (+ 2 2), hace mucho más fácil operar con más de un número a la vez.

Matemáticas básicas

Common Lisp tiene todas las funciones típicas: +, -, *, / para suma, resta, multiplicación y división.

Al considerar la división, quizás quieras saber el residuo de una división; eso se hace con la función mod (de módulo), que toma un número y un divisor como argumentos:

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

Comparar números

Por último, puede que te resulte útil comparar distintos números con funciones como = (igual), /= (distinto de) y >= (mayor o igual que). Cuando estas comparaciones son verdaderas (como en (= 1 1)), devuelven T y cuando no lo son (como en (> 0 1)), devuelven NIL.

Instrucciones

Lilly, la alienígena de Lisp, ama cocinar. Quiere hacer una fiesta de pizzas con sus amigos pero, para aprovechar al máximo sus ingredientes, le gustaría saber exactamente cuánto necesitará de cada ingrediente antes de empezar.

Para resolver esto, Lilly redactó un programa para automatizar parte de la planificación, pero necesita tu ayuda para terminarlo. ¿Ayudarás a Lilly a hacer la fiesta de pizzas perfectamente proporcional?

1. Una proporción de masa

Lo primero es lo primero: ¡toda gran pizza empieza con una masa deliciosa!

Lilly es fan de las pizzas delgadas y crujientes con un borde más grueso. La masa que se necesita para el centro es una constante de 200 g, pero cada 20 cm de borde requieren 45 g de masa.

Por suerte, Lilly calculó la ecuación para los gramos de masa (g) a partir del número de pizzas (n) y su diámetro (d):

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

Lilly necesita una función que:

  • Reciba el número de pizzas (n) y su diámetro (d)
  • Y devuelva la masa necesaria, redondeada al gramo más cercano (g).

Por ejemplo, para hacer 4 pizzas de 30 cm de diámetro:

(dough-calculator 4 30) ; => 1648

2. Un toque de salsa

Lilly es meticulosa al aplicar su salsa, pero el tamaño de sus pizzas puede ser irregular.

Para calcular el diámetro (d), usa la siguiente ecuación, con la salsa aplicada (s) como variable:

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

Lilly necesita una función que calcule el diámetro de la pizza (d) a partir de cada mililitro de salsa aplicada (s).

Por ejemplo, dado que Lilly usó 250 ml de salsa:

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

3. Un poco de queso, por favor

En el planeta de Lilly, todo el queso viene en cubos perfectos y se vende por tamaño. (¿Qué esperabas? Después de todo, es un planeta alienígena...)

Una vez más, Lilly calculó una ecuación para el número de pizzas (n) de cierto diámetro (d) que se pueden hacer con un cubo de queso de longitud de lado (l):

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

Crea una función que:

  • Reciba la longitud del lado de un cubo de queso (l) y el diámetro de las pizzas (d),
  • Y devuelva el número de pizzas (n) que se pueden hacer, redondeando hacia abajo.

Por ejemplo, dado un cubo de queso de 25x25x25 cm y pizzas de 30 cm de diámetro:

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

4. Una repartición justa

Por último, Lilly quiere que sus pizzas se dividan en 8 porciones cada una y se distribuyan de manera uniforme entre sus amigos.

Crea una función que:

  • Reciba un número de pizzas y un número de amigos
  • y devuelva T si las pizzas se pueden repartir de manera uniforme entre los amigos y NIL en caso contrario.

Por ejemplo:

;; 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
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Common Lisp Exercism

¿Todo listo para empezar Pizza Pi?

Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.