Project Euler Problem 30 Solution

Question

Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:

\begin{aligned} 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 \end{aligned}

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.

Clojure

#!/usr/bin/env clojure
(defn raise [x n]
  (. (. java.math.BigInteger (valueOf x)) (pow n)))

(defn digits [number]
  (map #(- (int %) 48) (str number))) 

(defn can-be-written-as-sum-of-fifths? [number]
  (and (not (= number 1)) (= (apply + (map #(raise % 5) (digits number))) number)))

(println (reduce + (filter can-be-written-as-sum-of-fifths? (range 500000))))
$ time clojure fifth-powers.clj
real   0m1.929s
user   0m3.137s
sys    0m0.183s

Haskell

digits ::  Integer -> [Integer]
digits n = digits' n []
    where digits' 0 acc = acc
          digits' n acc = digits' (div n 10) (mod n 10 : acc)

main = print $ sum [n | n <- [2..500000], sum (map (^5) (digits n)) == n]
$ ghc -O2 -o sumFifths sumFifths.hs
$ time ./sumFifths
real   0m0.403s
user   0m0.403s
sys    0m0.000s

Ruby

#!/usr/bin/env ruby
puts (2..500000).select { |i|
  i == i.to_s.each_char.map { |d| d.to_i**5 }.reduce(:+)
}.reduce(:+)
$ time ruby sum-of-fifths.rb
real   0m1.229s
user   0m1.220s
sys    0m0.008s