Pizza Pi

Pizza Pi

学习练习

简介

和许多语言一样,Common Lisp 中的数字有几种类型,其中最基本的两种是:

整数

和许多语言一样,Common Lisp 包含整数。 整数是不带小数点的完整数字(比如-6、0、25、1234等)。

Common Lisp 对整数的大小没有任何限制。 整数可以任意大(如果是负数,也可以任意小)。

一般来说,如果你只处理整数,就应该优先使用整数,因为经过多次计算之后,它们不会像浮点数那样损失精度。

浮点数

和许多语言一样,Common Lisp 包含浮点数。 浮点数带小数点,可以是小数,也可以是整数(比如3.14、-1.7、99.99、2048.0)。

算术

Common Lisp 的大多数运算都使用标准的算术运算符,但有一点比较特别:它使用“前缀表示法”,而不是大家更熟悉的“中缀表示法”。

更直观地看:

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

前缀表示法会把2 + 2这样的运算变成有点陌生的(+ 2 2)形式,但它让同时对多个数字进行运算变得容易得多。

基本数学运算

Common Lisp 拥有所有常见的函数:+、-、*、/,分别用于加法、减法、乘法和除法。

在考虑除法时,你可能想知道除法的余数,这可以用mod(表示求模)函数来完成,它接受一个数字和一个除数作为实参:

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

比较数字

最后,你可能会发现,用=(等于)、/=(不等于)和>=(大于等于)这类函数来比较不同的数字很有用。 当这些比较成立时(比如(= 1 1)),它们返回T;不成立时(比如(> 0 1)),它们返回NIL。

说明

Lisp 外星人 Lilly 热爱烹饪。她想和朋友们办一场披萨派对,但为了充分利用食材,她希望在开始前就确切知道每种食材需要多少。

为此,Lilly 写了一个程序来自动完成一部分规划工作,但还需要你来帮忙完成。你愿意帮 Lilly 办一场比例完美的披萨派对吗?

1. 面团配比

首先,每一张出色的披萨都从美味的面团开始!

Lilly 喜欢薄而酥脆、饼边更厚的披萨。中间部分的面团固定需要 200 克,而每 20 厘米饼边需要 45 克面团。

所幸,Lilly 根据披萨数量(n)和它们的直径(d)算出了面团克数(g)的公式:

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

Lilly 需要一个函数:

  • 接收披萨数量(n)和它们的直径(d)
  • 并返回所需的面团量,四舍五入到最接近的克数(g)。

例如,要做 4 张直径 30 厘米的披萨:

(dough-calculator 4 30) ; => 1648

2. 加一点酱料

Lilly 涂抹酱料时一丝不苟,但她做的披萨大小可能并不一致。

为了算出直径(d),她使用下面的公式,其中涂上的酱料量(s)是一个变量:

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

Lilly 需要一个函数,根据涂上的每毫升酱料(s)计算披萨的直径(d)。

例如,假设 Lilly 用了 250 毫升酱料:

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

3. 来点奶酪吧

在 Lilly 所在的星球上,所有奶酪都是完美的立方体,并且按尺寸出售。(你还能期待什么呢?这里毕竟是外星球……)

Lilly 又推导出一个公式,用来计算边长为(l)的奶酪立方体能做出多少张直径为(d)的披萨(n):

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

创建一个函数:

  • 接收奶酪立方体的边长(l)和披萨的直径(d),
  • 并返回能做出的披萨数量(n),结果向下取整。

例如,给定一个 25x25x25 厘米的奶酪立方体和直径 30 厘米的披萨:

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

4. 公平分配

最后,Lilly 希望把每张披萨都切成 8 块,并在朋友们之间平均分配。

创建一个函数:

  • 接收披萨数量和朋友的个数
  • 如果披萨能在朋友们之间平均分配,则返回T,否则返回NIL。

例如:

;; 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
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Common Lisp Exercism

准备好开始 Pizza Pi 了吗?

注册 Exercism,借助 27 个概念92 个练习 和真人导师指导,学习并掌握 Common Lisp,全部免费。