學習軌道
/
Common Lisp
Common Lisp
/
練習
/
披薩圓周率
披薩圓周率

披薩圓周率

學習練習

簡介

在 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函式(modulo,取模)來做,它接受一個數字和一個除數作為引數:

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

比較數字

最後,你可能會發現用=(等於)、/=(不等於)、>=(大於或等於)等函式來比較不同的數字很實用。 當比較結果為真(例如(= 1 1))時,會回傳T;結果不成立時(例如(> 0 1)),則回傳NIL。

說明

Lisp 外星人莉莉熱愛烹飪。她想和朋友們辦一場披薩派對,但為了充分利用食材,她希望在開始之前就精確知道每種食材需要多少。

為了解決這個問題,莉莉已經草擬了一個程式來自動處理部分規劃,但需要你幫忙完成。 你願意幫莉莉辦一場比例完美的披薩派對嗎?

1. 麵團比例

首先,每一塊美味的披薩都從好吃的麵團開始!

莉莉喜歡薄脆、餅皮較厚的披薩。 中間部分固定需要 200 克的麵團,而每 20 公分的餅皮則需要 45 克麵團。

幸好,莉莉已經推導出從披薩數量(n)和直徑(d)計算麵團克數(g)的公式:

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

莉莉需要一個函式,它能:

  • 接受披薩數量(n)和直徑(d)
  • 並回傳所需的麵團克數(g),取最接近的公克。

例如,要做 4 個直徑 30 公分的披薩:

(dough-calculator 4 30) ; => 1648

2. 加點醬料

莉莉塗抹醬料時非常講究,但她做的披薩大小並不總是固定。

為了算出直徑(d),她使用以下公式,其中已塗抹的醬料量(s)是變數:

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

莉莉需要一個函式,能從每毫升已塗抹的醬料(s)計算出披薩直徑(d)。

例如,假設莉莉用了 250 毫升的醬料:

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

3. 來點起司吧

在莉莉的星球上,所有起司都是完美的立方體,並依大小販售。 (不然你以為呢?這可是外星星球⋯)

莉莉再次推導出公式,用邊長(l)的起司立方體,算出能做出多少個直徑(d)的披薩(n):

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

建立一個函式,它能:

  • 接受起司立方體的邊長(l)和披薩的直徑(d),
  • 並回傳能做出的披薩數量(n),採無條件捨去。

例如,給定一個 25x25x25 公分的起司立方體,以及直徑 30 公分的披薩:

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

4. 公平分配

最後,莉莉希望每塊披薩都能切成 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

準備好開始 披薩圓周率 了嗎?

註冊 Exercism,透過 27 個概念92 個練習 和真人引導來學習並精通 Common Lisp,全部免費。