Question
The series, 1^1 + 2^2 + 3^3 + ... + 10^{10} = 10405071317.
Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^{1000}.
Clojure
#!/usr/bin/env clojuredefn raise [x n]
(
(. (. java.math.BigInteger (valueOf x)) (pow n)))
defn raise-to-itself [number]
(
(raise number number))
defn digits [n]
(map #(- (int %) 48) (str n)))
(
def result (reduce + (map raise-to-itself (range 1 1001))))
(println (apply str (reverse (take 10 (reverse (digits result)))))) (
$ time clojure raise-to-itself.clj
real 0m0.917s
user 0m1.873s
sys 0m0.076s
Haskell
lastN :: Int -> [a] -> [a]
= foldl (const . drop 1) xs (drop n xs)
lastN n xs
main :: IO ()
= putStrLn $ lastN 10 $ show $ sum [x^x | x <- [1..1000]] main
$ ghc -O2 -o self-powers self-powers.hs
$ time ./self-powers
real 0m0.005s
user 0m0.000s
sys 0m0.005s
Ruby
#!/usr/bin/env ruby
puts (1..1000).reduce(0) { |s,n| s + n**n }.to_s[-10..-1]
$ time ruby power-series.rb
real 0m0.048s
user 0m0.040s
sys 0m0.008s