Skip to content

Commit 04c15f1

Browse files
authored
Merge pull request #190 from rpottsoh/ArmstrongNumbers
armstrong-numbers: New exercise
2 parents 40d2870 + 3fb84d9 commit 04c15f1

File tree

5 files changed

+234
-0
lines changed

5 files changed

+234
-0
lines changed

config.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,16 @@
140140
"unlocked_by": null,
141141
"uuid": "edfc2903-1165-4029-9901-0be72b32865f"
142142
},
143+
{
144+
"core": false,
145+
"difficulty": 2,
146+
"slug": "armstrong-numbers",
147+
"topics": [
148+
"algorithms"
149+
],
150+
"unlocked_by": "collatz-conjecture",
151+
"uuid": "5315f8b0-f2a2-4750-8dc3-b4d182111036"
152+
},
143153
{
144154
"core": false,
145155
"difficulty": 3,
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
program ArmstrongNumbers;
2+
3+
{$IFNDEF TESTINSIGHT}
4+
{$APPTYPE CONSOLE}
5+
{$ENDIF}{$STRONGLINKTYPES ON}
6+
uses
7+
System.SysUtils,
8+
{$IFDEF TESTINSIGHT}
9+
TestInsight.DUnitX,
10+
{$ENDIF }
11+
DUnitX.Loggers.Console,
12+
DUnitX.Loggers.Xml.NUnit,
13+
DUnitX.TestFramework,
14+
uArmstrongNumbersTests in 'uArmstrongNumbersTests.pas',
15+
uArmstrongNumbers in 'uArmstrongNumbers.pas';
16+
17+
var
18+
runner : ITestRunner;
19+
results : IRunResults;
20+
logger : ITestLogger;
21+
nunitLogger : ITestLogger;
22+
begin
23+
{$IFDEF TESTINSIGHT}
24+
TestInsight.DUnitX.RunRegisteredTests;
25+
exit;
26+
{$ENDIF}
27+
try
28+
//Check command line options, will exit if invalid
29+
TDUnitX.CheckCommandLine;
30+
//Create the test runner
31+
runner := TDUnitX.CreateRunner;
32+
//Tell the runner to use RTTI to find Fixtures
33+
runner.UseRTTI := True;
34+
//tell the runner how we will log things
35+
//Log to the console window
36+
logger := TDUnitXConsoleLogger.Create(true);
37+
runner.AddLogger(logger);
38+
//Generate an NUnit compatible XML File
39+
nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
40+
runner.AddLogger(nunitLogger);
41+
runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests;
42+
43+
//Run tests
44+
results := runner.Execute;
45+
if not results.AllPassed then
46+
System.ExitCode := EXIT_ERRORS;
47+
48+
{$IFNDEF CI}
49+
//We don't want this happening when running under CI.
50+
if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
51+
begin
52+
System.Write('Done.. press <Enter> key to quit.');
53+
System.Readln;
54+
end;
55+
{$ENDIF}
56+
except
57+
on E: Exception do
58+
System.Writeln(E.ClassName, ': ', E.Message);
59+
end;
60+
end.

exercises/armstrong-numbers/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Armstrong Numbers
2+
3+
An [Armstrong number](https://en.wikipedia.org/wiki/Narcissistic_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 = 2`
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+
## Testing
15+
16+
In order to run the tests for this track, you will need to install
17+
DUnitX. Please see the [installation](http://www.exercism.io/languages/delphi/installation) instructions for more information.
18+
19+
### Loading Exercises into Delphi
20+
21+
If Delphi is properly installed, and `*.dpr` file types have been associated with Delphi, then double clicking the supplied `*.dpr` file will start Delphi and load the exercise/project. `control + F9` is the keyboard shortcut to compile the project or pressing `F9` will compile and run the project.
22+
23+
Alternatively you may opt to start Delphi and load your project via. the `File` drop down menu.
24+
25+
### When Questions Come Up
26+
We monitor the [Pascal-Delphi](https://gitter.im/exercism/Pascal-Delphi) support room on [gitter.im](https://gitter.im) to help you with any questions that might arise.
27+
28+
### Submitting Exercises
29+
30+
Note that, when trying to submit an exercise, make sure the exercise file you're submitting is in the `exercism/delphi/<exerciseName>` directory.
31+
32+
For example, if you're submitting `ubob.pas` for the Bob exercise, the submit command would be something like `exercism submit <path_to_exercism_dir>/delphi/bob/ubob.pas`.
33+
34+
## Source
35+
36+
Wikipedia [https://en.wikipedia.org/wiki/Narcissistic_number](https://en.wikipedia.org/wiki/Narcissistic_number)
37+
38+
## Submitting Incomplete Solutions
39+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
unit uArmstrongNumbers;
2+
3+
interface
4+
uses System.SysUtils, System.Math;
5+
6+
function isArmstrongNumber(aNumber: integer): Boolean;
7+
8+
implementation
9+
10+
function isArmstrongNumber(aNumber: integer): Boolean;
11+
var wrkString: string;
12+
Exponent: integer;
13+
wrkInteger: integer;
14+
i: integer;
15+
begin
16+
wrkString := aNumber.ToString;
17+
Exponent := length(wrkString);
18+
wrkInteger := 0;
19+
for i := low(wrkString) to high(wrkString) do
20+
wrkInteger := wrkInteger + trunc(Power(string.ToInteger(wrkString[i]), Exponent));
21+
result := wrkInteger = aNumber;
22+
end;
23+
24+
end.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
unit uArmstrongNumbersTests;
2+
3+
interface
4+
uses
5+
DUnitX.TestFramework;
6+
7+
const
8+
CanonicalVersion = '1.0.0';
9+
10+
type
11+
12+
[TestFixture]
13+
ArmstrongNumbersTests = class(TObject)
14+
public
15+
[Test]
16+
// [Ignore('Comment the "[Ignore]" statement to run the test')]
17+
procedure Single_digit_numbers_are_Armstrong_numbers;
18+
19+
[Test]
20+
[Ignore]
21+
procedure There_are_no_2_digit_Armstrong_numbers;
22+
23+
[Test]
24+
[Ignore]
25+
procedure Three_digit_number_that_is_an_Armstrong_number;
26+
27+
[Test]
28+
[Ignore]
29+
procedure Three_digit_number_that_is_not_an_Armstrong_number;
30+
31+
[Test]
32+
[Ignore]
33+
procedure Four_digit_number_that_is_an_Armstrong_number;
34+
35+
[Test]
36+
[Ignore]
37+
procedure Four_digit_number_that_is_not_an_Armstrong_number;
38+
39+
[Test]
40+
[Ignore]
41+
procedure Seven_digit_number_that_is_an_Armstrong_number;
42+
43+
[Test]
44+
[Ignore]
45+
procedure Seven_digit_number_that_is_not_an_Armstrong_number;
46+
end;
47+
48+
implementation
49+
uses uArmstrongNumbers;
50+
51+
{ ArmstrongNumbersTests }
52+
53+
procedure ArmstrongNumbersTests.Four_digit_number_that_is_an_Armstrong_number;
54+
begin
55+
Assert.IsTrue(isArmstrongNumber(9474));
56+
end;
57+
58+
procedure ArmstrongNumbersTests.Four_digit_number_that_is_not_an_Armstrong_number;
59+
begin
60+
Assert.IsFalse(isArmstrongNumber(9475));
61+
end;
62+
63+
procedure ArmstrongNumbersTests.Seven_digit_number_that_is_an_Armstrong_number;
64+
begin
65+
Assert.IsTrue(isArmstrongNumber(9926315));
66+
end;
67+
68+
procedure ArmstrongNumbersTests.Seven_digit_number_that_is_not_an_Armstrong_number;
69+
begin
70+
Assert.IsFalse(isArmstrongNumber(9926314));
71+
end;
72+
73+
procedure ArmstrongNumbersTests.Single_digit_numbers_are_Armstrong_numbers;
74+
var
75+
i: integer;
76+
begin
77+
for i := 0 to 9 do
78+
Assert.IsTrue(isArmstrongNumber(i));
79+
end;
80+
81+
procedure ArmstrongNumbersTests.There_are_no_2_digit_Armstrong_numbers;
82+
var
83+
i: integer;
84+
begin
85+
for i := 10 to 99 do
86+
Assert.IsFalse(isArmstrongNumber(i));
87+
end;
88+
89+
procedure ArmstrongNumbersTests.Three_digit_number_that_is_an_Armstrong_number;
90+
begin
91+
Assert.IsTrue(isArmstrongNumber(153));
92+
end;
93+
94+
procedure ArmstrongNumbersTests.Three_digit_number_that_is_not_an_Armstrong_number;
95+
begin
96+
Assert.IsFalse(isArmstrongNumber(100));
97+
end;
98+
99+
initialization
100+
TDUnitX.RegisterTestFixture(ArmstrongNumbersTests);
101+
end.

0 commit comments

Comments
 (0)