Skip to content

Commit 3b65aa9

Browse files
committed
Syncing perfect-numbers exercise
Used the exercise generator and updated the example file with better variable name.
1 parent 615668c commit 3b65aa9

File tree

5 files changed

+64
-52
lines changed

5 files changed

+64
-52
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
{
2-
"authors": [
3-
"Average-user"
4-
],
5-
"files": {
6-
"solution": [
7-
"perfect-numbers.lisp"
8-
],
9-
"test": [
10-
"perfect-numbers-test.lisp"
11-
],
12-
"example": [
13-
".meta/example.lisp"
14-
]
15-
},
16-
"blurb": "Determine if a number is perfect, abundant, or deficient based on Nicomachus' (60 - 120 CE) classification scheme for positive integers.",
17-
"source": "Taken from Chapter 2 of Functional Thinking by Neal Ford.",
18-
"source_url": "https://www.oreilly.com/library/view/functional-thinking/9781449365509/"
2+
"title": "Perfect Numbers",
3+
"blurb": "Determine if a number is perfect, abundant, or deficient based on Nicomachus' (60 - 120 CE) classification scheme for positive integers.",
4+
"source": "Taken from Chapter 2 of Functional Thinking by Neal Ford.",
5+
"source_url": "https://www.oreilly.com/library/view/functional-thinking/9781449365509/",
6+
"files": {
7+
"test": ["perfect-numbers-test.lisp"],
8+
"solution": ["perfect-numbers.lisp"],
9+
"example": [".meta/example.lisp"]
10+
},
11+
"authors": ["verdammelt"],
12+
"contributors": []
1913
}

exercises/practice/perfect-numbers/.meta/example.lisp

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
(in-package :perfect-numbers)
66

7-
(defun divisors (n)
8-
(remove-if-not (lambda (x) (= 0 (rem n x)))
9-
(loop for x from 1 to (floor n 2) collect x)))
7+
(defun divisors (number)
8+
(remove-if-not (lambda (x) (= 0 (rem number x)))
9+
(loop for x from 1 to (floor number 2) collect x)))
1010

11-
(defun classify (n)
12-
(if (> n 0)
13-
(let ((div-sum (reduce #'+ (divisors n))))
14-
(cond ((= n div-sum) "perfect")
15-
((< n div-sum) "abundant")
16-
(T "deficient")))
17-
(warn "Just defined for natural numbers")))
11+
(defun classify (number)
12+
(if (> number 0)
13+
(let ((div-sum (reduce #'+ (divisors number))))
14+
(cond ((= number div-sum) "perfect")
15+
((< number div-sum) "abundant")
16+
(T "deficient")))
17+
(warn "Just defined for natural numbers")))

exercises/practice/perfect-numbers/.meta/tests.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ description = "Large deficient number is classified correctly"
3636
description = "Edge case (no factors other than itself) is classified correctly"
3737

3838
[72445cee-660c-4d75-8506-6c40089dc302]
39-
description = "Zero is rejected (not a natural number)"
39+
description = "Zero is rejected (as it is not a positive integer)"
4040

4141
[2d72ce2c-6802-49ac-8ece-c790ba3dae13]
42-
description = "Negative integer is rejected (not a natural number)"
42+
description = "Negative integer is rejected (as it is not a positive integer)"

exercises/practice/perfect-numbers/perfect-numbers-test.lisp

+40-22
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,57 @@
1515
;; Define and enter a new FiveAM test-suite
1616
(def-suite* perfect-numbers-suite)
1717

18-
(test smallest-perfect-number
19-
(is (equal "perfect" (perfect-numbers:classify 6))))
18+
(test smallest-perfect-number-is-classified-correctly
19+
(let ((number 6))
20+
(is (string= "perfect" (perfect-numbers:classify number)))))
2021

21-
(test medium-perfect-number
22-
(is (equal "perfect" (perfect-numbers:classify 28))))
22+
(test medium-perfect-number-is-classified-correctly
23+
(let ((number 28))
24+
(is (string= "perfect" (perfect-numbers:classify number)))))
2325

24-
(test large-perfect-number
25-
(is (equal "perfect" (perfect-numbers:classify 33550336))))
26+
(test large-perfect-number-is-classified-correctly
27+
(let ((number 33550336))
28+
(is (string= "perfect" (perfect-numbers:classify number)))))
2629

27-
(test smallest-abundant-number
28-
(is (equal "abundant" (perfect-numbers:classify 12))))
30+
(test smallest-abundant-number-is-classified-correctly
31+
(let ((number 12))
32+
(is (string= "abundant" (perfect-numbers:classify number)))))
2933

30-
(test medium-abundant-number
31-
(is (equal "abundant" (perfect-numbers:classify 30))))
34+
(test medium-abundant-number-is-classified-correctly
35+
(let ((number 30))
36+
(is (string= "abundant" (perfect-numbers:classify number)))))
3237

33-
(test large-abundant-number
34-
(is (equal "abundant" (perfect-numbers:classify 33550335))))
38+
(test large-abundant-number-is-classified-correctly
39+
(let ((number 33550335))
40+
(is (string= "abundant" (perfect-numbers:classify number)))))
3541

36-
(test smallest-prime-deficient-number
37-
(is (equal "deficient" (perfect-numbers:classify 2))))
42+
(test smallest-prime-deficient-number-is-classified-correctly
43+
(let ((number 2))
44+
(is (string= "deficient" (perfect-numbers:classify number)))))
3845

39-
(test smallest-non-prime-deficient-number
40-
(is (equal "deficient" (perfect-numbers:classify 1))))
46+
(test smallest-non-prime-deficient-number-is-classified-correctly
47+
(let ((number 4))
48+
(is (string= "deficient" (perfect-numbers:classify number)))))
4149

42-
(test medium-deficient-number
43-
(is (equal "deficient" (perfect-numbers:classify 32))))
50+
(test medium-deficient-number-is-classified-correctly
51+
(let ((number 32))
52+
(is (string= "deficient" (perfect-numbers:classify number)))))
4453

45-
(test large-deficient-number
46-
(is (equal "deficient" (perfect-numbers:classify 33550337))))
54+
(test large-deficient-number-is-classified-correctly
55+
(let ((number 33550337))
56+
(is (string= "deficient" (perfect-numbers:classify number)))))
4757

48-
(test undefinded-0 (is (equal nil (perfect-numbers:classify 0))))
58+
(test edge-case-no-factors-other-than-itself-is-classified-correctly
59+
(let ((number 1))
60+
(is (string= "deficient" (perfect-numbers:classify number)))))
4961

50-
(test undefined-negative (is (equal nil (perfect-numbers:classify -3))))
62+
(test zero-is-rejected-as-it-is-not-a-positive-integer
63+
(let ((number 0))
64+
(is (equal NIL (perfect-numbers:classify number)))))
65+
66+
(test negative-integer-is-rejected-as-it-is-not-a-positive-integer
67+
(let ((number -1))
68+
(is (equal NIL (perfect-numbers:classify number)))))
5169

5270
(defun run-tests (&optional (test-or-suite 'perfect-numbers-suite))
5371
"Provides human readable results of test run. Default to entire suite."

exercises/practice/perfect-numbers/perfect-numbers.lisp

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44

55
(in-package :perfect-numbers)
66

7-
(defun classify (n))
7+
(defun classify (number))

0 commit comments

Comments
 (0)