diff --git a/config.json b/config.json index 17e7e2c905..b40853873e 100644 --- a/config.json +++ b/config.json @@ -47,10 +47,20 @@ "difficulty": 2, "topics": [ "sequences", - "strings", + "strings", "regular_expressions" ] }, + { + "slug": "armstrong-numbers", + "uuid": "77c5c7e6-265a-4f1a-9bc4-851f8f825420", + "core": false, + "unlocked_by": "isogram", + "difficulty": 3, + "topics": [ + "math" + ] + }, { "slug": "matrix", "uuid": "3de21c18-a533-4150-8a73-49df8fcb8c61", @@ -209,7 +219,7 @@ "maps", "transforming" ] - }, + }, { "slug": "pangram", "uuid": "fcf07149-b2cb-4042-90e6-fb3350e0fdf6", diff --git a/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb new file mode 100644 index 0000000000..cb7dc25295 --- /dev/null +++ b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb @@ -0,0 +1,7 @@ +class ArmstrongNumbers + def self.is_valid?(number) + exponent = number.digits.size + + number.digits.sum { |digit| digit**exponent } == number + end +end diff --git a/exercises/armstrong-numbers/README.md b/exercises/armstrong-numbers/README.md new file mode 100644 index 0000000000..70626c2951 --- /dev/null +++ b/exercises/armstrong-numbers/README.md @@ -0,0 +1,41 @@ +# Armstrong Numbers + +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. + +For example: + +- 9 is an Armstrong number, because `9 = 9^1 = 9` +- 10 is *not* an Armstrong number, because `10 != 1^2 + 0^2 = 1` +- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153` +- 154 is *not* an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190` + +Write some code to determine whether a number is an Armstrong number. + +* * * * + +For installation and learning resources, refer to the +[Ruby resources page](http://exercism.io/languages/ruby/resources). + +For running the tests provided, you will need the Minitest gem. Open a +terminal window and run the following command to install minitest: + + gem install minitest + +If you would like color output, you can `require 'minitest/pride'` in +the test file, or note the alternative instruction, below, for running +the test file. + +Run the tests from the exercise directory using the following command: + + ruby armstrong_numbers_test.rb + +To include color from the command line: + + ruby -r minitest/pride armstrong_numbers_test.rb + +## Source + +Wikipedia [https://en.wikipedia.org/wiki/Narcissistic_number](https://en.wikipedia.org/wiki/Narcissistic_number) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/exercises/armstrong-numbers/armstrong_numbers_test.rb b/exercises/armstrong-numbers/armstrong_numbers_test.rb new file mode 100644 index 0000000000..677df75112 --- /dev/null +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -0,0 +1,59 @@ +require 'minitest/autorun' +require_relative 'armstrong_numbers' + +class ArmstrongNumbersTest < Minitest::Test + def test_one_digit_numbers_are_armstrong_numbers + assert ArmstrongNumbers.is_valid?(1) + assert ArmstrongNumbers.is_valid?(6) + assert ArmstrongNumbers.is_valid?(9) + end + + def test_two_digit_numbers_aren_t_armstrong_numbers + skip + refute ArmstrongNumbers.is_valid?(11) + refute ArmstrongNumbers.is_valid?(89) + refute ArmstrongNumbers.is_valid?(44) + end + + def test_three_digit_numbers_that_are_armstrong_numbers + skip + assert ArmstrongNumbers.is_valid?(153) + assert ArmstrongNumbers.is_valid?(370) + end + + def test_three_digit_numbers_that_aren_t_armstrong_numbers + skip + refute ArmstrongNumbers.is_valid?(555) + refute ArmstrongNumbers.is_valid?(662) + end + + def test_four_digit_number_that_is_armstrong_number + skip + assert ArmstrongNumbers.is_valid?(1_634) + end + + def test_four_digit_number_that_is_not_armstrong_number + skip + refute ArmstrongNumbers.is_valid?(9_989) + end + + def test_seven_digit_number_that_is_armstrong_number + skip + assert ArmstrongNumbers.is_valid?(9_926_315) + end + + def test_seven_digit_number_that_is_not_armstrong_number + skip + refute ArmstrongNumbers.is_valid?(2_369_989) + end + + def test_ten_digit_number_that_is_armstrong_number + skip + assert ArmstrongNumbers.is_valid?(4_679_307_774) + end + + def test_fourteen_digit_number_that_is_armstrong_number + skip + assert ArmstrongNumbers.is_valid?(28_116_440_335_967) + end +end