Skip to content

Commit 98b42de

Browse files
authored
[New Exercise]: Armstrong Numbers (#708)
* Add Armstrong Numbers exercise * Add author
1 parent 9364a2d commit 98b42de

File tree

9 files changed

+187
-0
lines changed

9 files changed

+187
-0
lines changed

config.json

+8
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,14 @@
432432
"transforming"
433433
]
434434
},
435+
{
436+
"slug": "armstrong-numbers",
437+
"name": "Armstrong Numbers",
438+
"uuid": "6bd76515-cc17-4238-bc08-7fbdfea14131",
439+
"practices": [],
440+
"prerequisites": [],
441+
"difficulty": 2
442+
},
435443
{
436444
"slug": "grade-school",
437445
"name": "Grade School",
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
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Foundation
2+
3+
func isArmstrongNumber(_ number: Int) -> Bool {
4+
let stringNumber = String(number)
5+
let numberLength = stringNumber.count
6+
let sum = stringNumber.compactMap { Int(String($0)) }.reduce(0) { $0 + Int(pow(Double($1), Double(numberLength))) }
7+
return sum == number
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"authors": ["meatball133"],
3+
"files": {
4+
"solution": [
5+
"Sources/ArmstrongNumbers/ArmstrongNumbers.swift"
6+
],
7+
"test": [
8+
"Tests/ArmstrongNumbersTests/ArmstrongNumbersTests.swift"
9+
],
10+
"example": [
11+
".meta/Sources/ArmstrongNumbers/ArmstrongNumbersExample.swift"
12+
]
13+
},
14+
"blurb": "Determine if a number is an Armstrong number.",
15+
"source": "Wikipedia",
16+
"source_url": "https://en.wikipedia.org/wiki/Narcissistic_number"
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import XCTest
2+
@testable import {{exercise|camelCase}}
3+
class {{exercise|camelCase}}Tests: XCTestCase {
4+
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false
5+
6+
{% for case in cases %}
7+
{% if forloop.first -%}
8+
func test{{case.description |camelCase }}() {
9+
{% else -%}
10+
func test{{case.description |camelCase }}() throws {
11+
try XCTSkipIf(true && !runAll) // change true to false to run this test
12+
{% endif -%}
13+
{%- if case.expected -%}
14+
XCTAssertTrue(isArmstrongNumber({{case.input.number}}))
15+
{%- else -%}
16+
XCTAssertFalse(isArmstrongNumber({{case.input.number}}))
17+
{%- endif %}
18+
}
19+
{% endfor -%}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
include = false
42+
43+
[12ffbf10-307a-434e-b4ad-c925680e1dd4]
44+
description = "The largest and last Armstrong number"
45+
include = false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// swift-tools-version:5.3
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "ArmstrongNumbers",
7+
products: [
8+
.library(
9+
name: "ArmstrongNumbers",
10+
targets: ["ArmstrongNumbers"])
11+
],
12+
dependencies: [],
13+
targets: [
14+
.target(
15+
name: "ArmstrongNumbers",
16+
dependencies: []),
17+
.testTarget(
18+
name: "ArmstrongNumbersTests",
19+
dependencies: ["ArmstrongNumbers"]),
20+
]
21+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
func isArmstrongNumber(_ number: Int) -> Bool {
2+
// Write your code for the 'Armstrong Numbers' exercise here.
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import XCTest
2+
3+
@testable import ArmstrongNumbers
4+
5+
class ArmstrongNumbersTests: XCTestCase {
6+
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false
7+
8+
func testZeroIsAnArmstrongNumber() {
9+
XCTAssertTrue(isArmstrongNumber(0))
10+
}
11+
12+
func testSingleDigitNumbersAreArmstrongNumbers() throws {
13+
try XCTSkipIf(true && !runAll) // change true to false to run this test
14+
XCTAssertTrue(isArmstrongNumber(5))
15+
}
16+
17+
func testThereAreNoTwoDigitArmstrongNumbers() throws {
18+
try XCTSkipIf(true && !runAll) // change true to false to run this test
19+
XCTAssertFalse(isArmstrongNumber(10))
20+
}
21+
22+
func testThreeDigitNumberThatIsAnArmstrongNumber() throws {
23+
try XCTSkipIf(true && !runAll) // change true to false to run this test
24+
XCTAssertTrue(isArmstrongNumber(153))
25+
}
26+
27+
func testThreeDigitNumberThatIsNotAnArmstrongNumber() throws {
28+
try XCTSkipIf(true && !runAll) // change true to false to run this test
29+
XCTAssertFalse(isArmstrongNumber(100))
30+
}
31+
32+
func testFourDigitNumberThatIsAnArmstrongNumber() throws {
33+
try XCTSkipIf(true && !runAll) // change true to false to run this test
34+
XCTAssertTrue(isArmstrongNumber(9474))
35+
}
36+
37+
func testFourDigitNumberThatIsNotAnArmstrongNumber() throws {
38+
try XCTSkipIf(true && !runAll) // change true to false to run this test
39+
XCTAssertFalse(isArmstrongNumber(9475))
40+
}
41+
42+
func testSevenDigitNumberThatIsAnArmstrongNumber() throws {
43+
try XCTSkipIf(true && !runAll) // change true to false to run this test
44+
XCTAssertTrue(isArmstrongNumber(9_926_315))
45+
}
46+
47+
func testSevenDigitNumberThatIsNotAnArmstrongNumber() throws {
48+
try XCTSkipIf(true && !runAll) // change true to false to run this test
49+
XCTAssertFalse(isArmstrongNumber(9_926_314))
50+
}
51+
}

0 commit comments

Comments
 (0)