From 40af2299942f22337016f9732d3e4620f5a8be2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Wed, 31 Oct 2018 23:47:06 +0100 Subject: [PATCH 01/11] Add Armstrong Numbers exercise - not using Integer.digits as that is only available on Ruby 2.4 --- .../.meta/solutions/armstrong_number.rb | 10 ++++ exercises/armstrong-numbers/README.md | 41 +++++++++++++++ .../armstrong_numbers_test.rb | 50 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb create mode 100644 exercises/armstrong-numbers/README.md create mode 100644 exercises/armstrong-numbers/armstrong_numbers_test.rb diff --git a/exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb b/exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb new file mode 100644 index 0000000000..90fb5d938e --- /dev/null +++ b/exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb @@ -0,0 +1,10 @@ +class ArmstrongNumber + def self.is_valid?(number) + digits = number.to_s.split('').map(&:to_i) + exponent = digits.size + + digits.reduce(0) do |acc, digit| + digit**exponent + acc + end == 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..122fb854be --- /dev/null +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -0,0 +1,50 @@ +require 'minitest/autorun' +require_relative 'armstrong_number' + +class ArmstrongNumbersTest < Minitest::Test + def test_one_digit_numbers_are_armstrong_numbers + assert ArmstrongNumber.is_valid?(1) + assert ArmstrongNumber.is_valid?(6) + assert ArmstrongNumber.is_valid?(9) + end + + def test_two_digit_numbers_aren_t_armstrong_numbers + refute ArmstrongNumber.is_valid?(11) + refute ArmstrongNumber.is_valid?(89) + refute ArmstrongNumber.is_valid?(44) + end + + def test_three_digit_numbers_that_are_the_armstrong_numbers + assert ArmstrongNumber.is_valid?(153) + assert ArmstrongNumber.is_valid?(370) + end + + def test_three_digit_numbers_that_aren_t_the_armstrong_numbers + refute ArmstrongNumber.is_valid?(555) + refute ArmstrongNumber.is_valid?(662) + end + + def test_four_digit_number_that_is_the_armstrong_numbers + assert ArmstrongNumber.is_valid?(1634) + end + + def test_four_digit_number_that_is_not_the_armstrong_numbers + refute ArmstrongNumber.is_valid?(9989) + end + + def test_seven_digit_number_that_is_the_armstrong_numbers + assert ArmstrongNumber.is_valid?(9926315) + end + + def test_seven_digit_number_that_is_not_the_armstrong_numbers + refute ArmstrongNumber.is_valid?(2369989) + end + + def test_ten_digit_number_that_is_the_armstrong_numbers + assert ArmstrongNumber.is_valid?(4679307774) + end + + def test_fourteen_digit_number_that_is_the_armstrong_numbers + assert ArmstrongNumber.is_valid?(28116440335967) + end +end From 9343e19a91b1edc39c1f558cf068b8fdcfe2ac58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Thu, 1 Nov 2018 11:01:15 +0100 Subject: [PATCH 02/11] Update and rename armstrong_number.rb to armstrong_numbers.rb --- .../solutions/{armstrong_number.rb => armstrong_numbers.rb} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename exercises/armstrong-numbers/.meta/solutions/{armstrong_number.rb => armstrong_numbers.rb} (89%) diff --git a/exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb similarity index 89% rename from exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb rename to exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb index 90fb5d938e..3604503ad4 100644 --- a/exercises/armstrong-numbers/.meta/solutions/armstrong_number.rb +++ b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb @@ -1,4 +1,4 @@ -class ArmstrongNumber +class ArmstrongNumbers def self.is_valid?(number) digits = number.to_s.split('').map(&:to_i) exponent = digits.size From ad27c0bb43e3a8387be8c0c189e565252f9a52da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Thu, 1 Nov 2018 11:02:51 +0100 Subject: [PATCH 03/11] ArmstrongNumber -> ArmstrongNumbers complying with name convention --- .../armstrong_numbers_test.rb | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/exercises/armstrong-numbers/armstrong_numbers_test.rb b/exercises/armstrong-numbers/armstrong_numbers_test.rb index 122fb854be..568df88bb9 100644 --- a/exercises/armstrong-numbers/armstrong_numbers_test.rb +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -1,50 +1,50 @@ require 'minitest/autorun' -require_relative 'armstrong_number' +require_relative 'armstrong_numbers' class ArmstrongNumbersTest < Minitest::Test def test_one_digit_numbers_are_armstrong_numbers - assert ArmstrongNumber.is_valid?(1) - assert ArmstrongNumber.is_valid?(6) - assert ArmstrongNumber.is_valid?(9) + 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 - refute ArmstrongNumber.is_valid?(11) - refute ArmstrongNumber.is_valid?(89) - refute ArmstrongNumber.is_valid?(44) + refute ArmstrongNumbers.is_valid?(11) + refute ArmstrongNumbers.is_valid?(89) + refute ArmstrongNumbers.is_valid?(44) end def test_three_digit_numbers_that_are_the_armstrong_numbers - assert ArmstrongNumber.is_valid?(153) - assert ArmstrongNumber.is_valid?(370) + assert ArmstrongNumbers.is_valid?(153) + assert ArmstrongNumbers.is_valid?(370) end def test_three_digit_numbers_that_aren_t_the_armstrong_numbers - refute ArmstrongNumber.is_valid?(555) - refute ArmstrongNumber.is_valid?(662) + refute ArmstrongNumbers.is_valid?(555) + refute ArmstrongNumbers.is_valid?(662) end def test_four_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumber.is_valid?(1634) + assert ArmstrongNumbers.is_valid?(1634) end def test_four_digit_number_that_is_not_the_armstrong_numbers - refute ArmstrongNumber.is_valid?(9989) + refute ArmstrongNumbers.is_valid?(9989) end def test_seven_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumber.is_valid?(9926315) + assert ArmstrongNumbers.is_valid?(9926315) end def test_seven_digit_number_that_is_not_the_armstrong_numbers - refute ArmstrongNumber.is_valid?(2369989) + refute ArmstrongNumbers.is_valid?(2369989) end def test_ten_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumber.is_valid?(4679307774) + assert ArmstrongNumbers.is_valid?(4679307774) end def test_fourteen_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumber.is_valid?(28116440335967) + assert ArmstrongNumbers.is_valid?(28116440335967) end end From 9fb5995d828810488a2011406be0daa9ecdec14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 21:47:34 +0100 Subject: [PATCH 04/11] use underscore for large numbers --- .../armstrong-numbers/armstrong_numbers_test.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/exercises/armstrong-numbers/armstrong_numbers_test.rb b/exercises/armstrong-numbers/armstrong_numbers_test.rb index 568df88bb9..f02fc7806b 100644 --- a/exercises/armstrong-numbers/armstrong_numbers_test.rb +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -25,26 +25,26 @@ def test_three_digit_numbers_that_aren_t_the_armstrong_numbers end def test_four_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumbers.is_valid?(1634) + assert ArmstrongNumbers.is_valid?(1_634) end def test_four_digit_number_that_is_not_the_armstrong_numbers - refute ArmstrongNumbers.is_valid?(9989) + refute ArmstrongNumbers.is_valid?(9_989) end def test_seven_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumbers.is_valid?(9926315) + assert ArmstrongNumbers.is_valid?(9_926_315) end def test_seven_digit_number_that_is_not_the_armstrong_numbers - refute ArmstrongNumbers.is_valid?(2369989) + refute ArmstrongNumbers.is_valid?(2_369_989) end def test_ten_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumbers.is_valid?(4679307774) + assert ArmstrongNumbers.is_valid?(4_679_307_774) end def test_fourteen_digit_number_that_is_the_armstrong_numbers - assert ArmstrongNumbers.is_valid?(28116440335967) + assert ArmstrongNumbers.is_valid?(28_116_440_335_967) end end From fde015049397f29dca2518b23aefcacc0e4a29af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 21:50:38 +0100 Subject: [PATCH 05/11] add skip to all but first test --- exercises/armstrong-numbers/armstrong_numbers_test.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/exercises/armstrong-numbers/armstrong_numbers_test.rb b/exercises/armstrong-numbers/armstrong_numbers_test.rb index f02fc7806b..93f44aa044 100644 --- a/exercises/armstrong-numbers/armstrong_numbers_test.rb +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -9,42 +9,51 @@ def test_one_digit_numbers_are_armstrong_numbers 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_the_armstrong_numbers + skip assert ArmstrongNumbers.is_valid?(153) assert ArmstrongNumbers.is_valid?(370) end def test_three_digit_numbers_that_aren_t_the_armstrong_numbers + skip refute ArmstrongNumbers.is_valid?(555) refute ArmstrongNumbers.is_valid?(662) end def test_four_digit_number_that_is_the_armstrong_numbers + skip assert ArmstrongNumbers.is_valid?(1_634) end def test_four_digit_number_that_is_not_the_armstrong_numbers + skip refute ArmstrongNumbers.is_valid?(9_989) end def test_seven_digit_number_that_is_the_armstrong_numbers + skip assert ArmstrongNumbers.is_valid?(9_926_315) end def test_seven_digit_number_that_is_not_the_armstrong_numbers + skip refute ArmstrongNumbers.is_valid?(2_369_989) end def test_ten_digit_number_that_is_the_armstrong_numbers + skip assert ArmstrongNumbers.is_valid?(4_679_307_774) end def test_fourteen_digit_number_that_is_the_armstrong_numbers + skip assert ArmstrongNumbers.is_valid?(28_116_440_335_967) end end From 0c6963a9e51a5536ed7ece1e26092a63180b1663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:16:26 +0100 Subject: [PATCH 06/11] rename tests for better English --- .../armstrong-numbers/armstrong_numbers_test.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/exercises/armstrong-numbers/armstrong_numbers_test.rb b/exercises/armstrong-numbers/armstrong_numbers_test.rb index 93f44aa044..677df75112 100644 --- a/exercises/armstrong-numbers/armstrong_numbers_test.rb +++ b/exercises/armstrong-numbers/armstrong_numbers_test.rb @@ -15,44 +15,44 @@ def test_two_digit_numbers_aren_t_armstrong_numbers refute ArmstrongNumbers.is_valid?(44) end - def test_three_digit_numbers_that_are_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + 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_the_armstrong_numbers + def test_fourteen_digit_number_that_is_armstrong_number skip assert ArmstrongNumbers.is_valid?(28_116_440_335_967) end From 19e3900e0797a65b4e4d854e6df4db1056a6ef2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:17:36 +0100 Subject: [PATCH 07/11] entry for config.json --- config.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/config.json b/config.json index 17e7e2c905..e19d09f637 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", From eb5a5ddcd49ff2d06ec5773880ecc7e645a4a890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:18:35 +0100 Subject: [PATCH 08/11] use chars instead of split('') --- .../armstrong-numbers/.meta/solutions/armstrong_numbers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb index 3604503ad4..a3c113be00 100644 --- a/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb +++ b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb @@ -1,6 +1,6 @@ class ArmstrongNumbers def self.is_valid?(number) - digits = number.to_s.split('').map(&:to_i) + digits = number.to_s.chars.map(&:to_i) exponent = digits.size digits.reduce(0) do |acc, digit| From da27025c536500fe4e86add4b6fbcd6d00cae608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:28:39 +0100 Subject: [PATCH 09/11] correct config.json syntax error --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index e19d09f637..394277cd4b 100644 --- a/config.json +++ b/config.json @@ -55,7 +55,7 @@ "slug": "armstrong_numbers", "uuid": "77c5c7e6-265a-4f1a-9bc4-851f8f825420", "core": false, - "unlocked_by": isogram, + "unlocked_by": "isogram", "difficulty": 3, "topics": [ "math" From 96910d4cc4726e7d8ccef6211da6e4f70314a51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:31:11 +0100 Subject: [PATCH 10/11] more idiomatic by using sum instead of reduce and switch to Ruby 2.4 in the process --- .../armstrong-numbers/.meta/solutions/armstrong_numbers.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb index a3c113be00..cb7dc25295 100644 --- a/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb +++ b/exercises/armstrong-numbers/.meta/solutions/armstrong_numbers.rb @@ -1,10 +1,7 @@ class ArmstrongNumbers def self.is_valid?(number) - digits = number.to_s.chars.map(&:to_i) - exponent = digits.size + exponent = number.digits.size - digits.reduce(0) do |acc, digit| - digit**exponent + acc - end == number + number.digits.sum { |digit| digit**exponent } == number end end From 9da8b9b4af81762c8b898d730ee4db5be9da09ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ton=C4=87i=20Gali=C4=87?= Date: Mon, 10 Dec 2018 22:34:54 +0100 Subject: [PATCH 11/11] correct slug to armstrong-numbers --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index 394277cd4b..b40853873e 100644 --- a/config.json +++ b/config.json @@ -52,7 +52,7 @@ ] }, { - "slug": "armstrong_numbers", + "slug": "armstrong-numbers", "uuid": "77c5c7e6-265a-4f1a-9bc4-851f8f825420", "core": false, "unlocked_by": "isogram",