En Common Lisp, como en muchos lenguajes, los números existen en varios tipos. Dos de los más básicos son:
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.
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).
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.
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
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.
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?
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:
Por ejemplo, para hacer 4 pizzas de 30 cm de diámetro:
(dough-calculator 4 30) ; => 1648
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
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:
Por ejemplo, dado un cubo de queso de 25x25x25 cm y pizzas de 30 cm de diámetro:
(pizzas-per-cube 25 30) ; => 3
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:
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
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.