Pizza Pi

Pizza Pi

Ejercicio de aprendizaje

Introducción

En Common Lisp, como en muchos lenguajes, los números existen en varios tipos. Dos de los más básicos son:

Números enteros

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

Common Lisp no define límites en 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, deberías preferir los enteros, ya que no sufren la misma pérdida de precisión que los números de coma flotante tras muchos cálculos.

Números de coma flotante

Como en muchos lenguajes, Common Lisp incluye números de coma 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 la mayoría de las operaciones, pero es algo singular al usar una «notación prefija» en lugar de la más familiar «notación infija».

Más visualmente:

;; 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 prefija convierte algunas operaciones como 2 + 2 en la forma algo desconocida (+ 2 2), hace mucho más fácil operar con más de un número a la vez.

Aritmética básica

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

Cuando trabajas con la división, puede que quieras conocer el residuo de una división; para eso está la función mod (de módulo), que recibe 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, adora cocinar. Quiere organizar una fiesta de pizza con sus amigos, pero, para aprovechar al máximo sus ingredientes, le gustaría saber exactamente cuánto necesitará de cada uno antes de empezar.

Para conseguirlo, Lilly ha esbozado un programa que automatiza parte de la planificación, pero necesita tu ayuda para terminarlo. ¿Ayudarás a Lilly a organizar la fiesta de pizza perfectamente proporcionada?

1. Una proporción de masa

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

A Lilly le encantan las pizzas finas y crujientes con un borde más grueso. La masa necesaria para el centro es de 200 g constantes, pero cada 20 cm de borde requieren 45 g de masa.

Por suerte, Lilly ha calculado la ecuación que da 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 chorrito de salsa

Lilly es muy 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 aplicado (s).

Por ejemplo, dado que Lilly ha usado 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? Al fin y al cabo, es un planeta alienígena...)

Una vez más, Lilly ha calculado 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 lado (l):

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

Crea una función que:

  • Reciba el 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. Un reparto justo

Por último, Lilly quiere que sus pizzas se dividan en 8 porciones cada una y se repartan equitativamente 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 reparten equitativamente 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 pestaña nueva
Common Lisp Exercism

¿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.