Skip to content

Commit bc8d4c3

Browse files
Add armstrong-numbers exercise (#54)
1 parent ad6fa32 commit bc8d4c3

File tree

14 files changed

+492
-0
lines changed

14 files changed

+492
-0
lines changed

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@
7373
"prerequisites": [],
7474
"difficulty": 2
7575
},
76+
{
77+
"slug": "armstrong-numbers",
78+
"name": "Armstrong Numbers",
79+
"uuid": "c33aa0db-3c1e-4511-ad3e-0123ab8005a9",
80+
"practices": [],
81+
"prerequisites": [],
82+
"difficulty": 2
83+
},
7684
{
7785
"slug": "bob",
7886
"name": "Bob",
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Instructions
2+
3+
An [Armstrong number][armstrong-number] is a number that is the sum of its own digits each raised to the power of the number of digits.
4+
5+
For example:
6+
7+
- 9 is an Armstrong number, because `9 = 9^1 = 9`
8+
- 10 is _not_ an Armstrong number, because `10 != 1^2 + 0^2 = 1`
9+
- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153`
10+
- 154 is _not_ an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190`
11+
12+
Write some code to determine whether a number is an Armstrong number.
13+
14+
[armstrong-number]: https://en.wikipedia.org/wiki/Narcissistic_number
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace ArmstrongNumbers
2+
3+
def extractDigits (measure : Nat) (number : Nat) (acc : List Nat) : List Nat :=
4+
match measure with
5+
| 0 => acc
6+
| .succ measure2 =>
7+
if number < 10 then number :: acc
8+
else extractDigits measure2 (number / 10) ((number % 10) :: acc)
9+
10+
def isArmstrongNumber (number : Nat) : Bool :=
11+
let digits := extractDigits number number []
12+
let exponent := List.length digits
13+
(List.foldl (· + ·) 0 (List.map (Nat.pow · exponent) digits)) == number
14+
15+
end ArmstrongNumbers
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"authors": [
3+
"keiravillekode"
4+
],
5+
"files": {
6+
"solution": [
7+
"ArmstrongNumbers.lean"
8+
],
9+
"test": [
10+
"ArmstrongNumbersTest.lean"
11+
],
12+
"example": [
13+
".meta/Example.lean"
14+
]
15+
},
16+
"blurb": "Determine if a number is an Armstrong number.",
17+
"source": "Wikipedia",
18+
"source_url": "https://en.wikipedia.org/wiki/Narcissistic_number"
19+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# This is an auto-generated file.
2+
#
3+
# Regenerating this file via `configlet sync` will:
4+
# - Recreate every `description` key/value pair
5+
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
6+
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
7+
# - Preserve any other key/value pair
8+
#
9+
# As user-added comments (using the # character) will be removed when this file
10+
# is regenerated, comments can be added via a `comment` key.
11+
12+
[c1ed103c-258d-45b2-be73-d8c6d9580c7b]
13+
description = "Zero is an Armstrong number"
14+
15+
[579e8f03-9659-4b85-a1a2-d64350f6b17a]
16+
description = "Single-digit numbers are Armstrong numbers"
17+
18+
[2d6db9dc-5bf8-4976-a90b-b2c2b9feba60]
19+
description = "There are no two-digit Armstrong numbers"
20+
21+
[509c087f-e327-4113-a7d2-26a4e9d18283]
22+
description = "Three-digit number that is an Armstrong number"
23+
24+
[7154547d-c2ce-468d-b214-4cb953b870cf]
25+
description = "Three-digit number that is not an Armstrong number"
26+
27+
[6bac5b7b-42e9-4ecb-a8b0-4832229aa103]
28+
description = "Four-digit number that is an Armstrong number"
29+
30+
[eed4b331-af80-45b5-a80b-19c9ea444b2e]
31+
description = "Four-digit number that is not an Armstrong number"
32+
33+
[f971ced7-8d68-4758-aea1-d4194900b864]
34+
description = "Seven-digit number that is an Armstrong number"
35+
36+
[7ee45d52-5d35-4fbd-b6f1-5c8cd8a67f18]
37+
description = "Seven-digit number that is not an Armstrong number"
38+
39+
[5ee2fdf8-334e-4a46-bb8d-e5c19c02c148]
40+
description = "Armstrong number containing seven zeroes"
41+
42+
[12ffbf10-307a-434e-b4ad-c925680e1dd4]
43+
description = "The largest and last Armstrong number"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ArmstrongNumbers
2+
3+
def isArmstrongNumber (number : Nat) : Bool :=
4+
sorry
5+
6+
end ArmstrongNumbers
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import LeanTest
2+
import ArmstrongNumbers
3+
4+
open LeanTest
5+
6+
def armstrongNumbersTests : TestSuite :=
7+
(TestSuite.empty "ArmstrongNumbers")
8+
|>.addTest "Zero is an Armstrong number" (do
9+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 0))
10+
|>.addTest "Single-digit numbers are Armstrong numbers" (do
11+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 5))
12+
|>.addTest "There are no two-digit Armstrong numbers" (do
13+
return assertEqual false (ArmstrongNumbers.isArmstrongNumber 10))
14+
|>.addTest "Three-digit number that is an Armstrong number" (do
15+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 153))
16+
|>.addTest "Three-digit number that is not an Armstrong number" (do
17+
return assertEqual false (ArmstrongNumbers.isArmstrongNumber 100))
18+
|>.addTest "Four-digit number that is an Armstrong number" (do
19+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 9474))
20+
|>.addTest "Four-digit number that is not an Armstrong number" (do
21+
return assertEqual false (ArmstrongNumbers.isArmstrongNumber 9475))
22+
|>.addTest "Seven-digit number that is an Armstrong number" (do
23+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 9926315))
24+
|>.addTest "Seven-digit number that is not an Armstrong number" (do
25+
return assertEqual false (ArmstrongNumbers.isArmstrongNumber 9926314))
26+
|>.addTest "Armstrong number containing seven zeroes" (do
27+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 186709961001538790100634132976990))
28+
|>.addTest "The largest and last Armstrong number" (do
29+
return assertEqual true (ArmstrongNumbers.isArmstrongNumber 115132219018763992565095597973971522401))
30+
31+
def main : IO UInt32 := do
32+
runTestSuitesWithExitCode [armstrongNumbersTests]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name = "armstrong-numbers"
2+
version = "0.1.0"
3+
defaultTargets = ["ArmstrongNumbersTest"]
4+
testDriver = "ArmstrongNumbersTest"
5+
6+
[[lean_lib]]
7+
name = "LeanTest"
8+
srcDir = "vendor/LeanTest"
9+
10+
[[lean_lib]]
11+
name = "ArmstrongNumbers"
12+
13+
[[lean_exe]]
14+
name = "ArmstrongNumbersTest"
15+
root = "ArmstrongNumbersTest"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
leanprover/lean4:v4.25.2
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- This module serves as the root of the `LeanTest` library.
2+
-- Import modules here that should be built as part of the library.
3+
import LeanTest.Assertions
4+
import LeanTest.Test

0 commit comments

Comments
 (0)