This is for Project Euler #30:
Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:
\$1634 = 1^4 + 6^4 + 3^4 + 4^4\$
\$8208 = 8^4 + 2^4 + 0^4 + 8^4\$
\$9474 = 9^4 + 4^4 + 7^4 + 4^4\$As \$1 = 1^4\$ is not a sum it is not included. The sum of these numbers is \$1634 + 8208 + 9474 = 19316\$.
Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.
list = []
2.upto(1_000_000) do |num|
list << num if num.to_s.split("").map(&:to_i).map { |num| num ** 5 }.inject(:+) == num
end
puts list.inject(:+)
This works, and I am here for three reasons:
- I use map twice, and this smells but I don't know an easier/better way.
- How does the
&
work? Notice I domap(&:to_i)
andinject(:+)
. I have seen examples of this but don't know why they are different and what is going on. - Any suggestions on code improvements?