Clojure: Running time = 1.56s
+-;digit-split
(defn digit-split [n]
(map #(- (int %) 48) (str n))
)
+-;pow
(defn pow [a b]
(loop [res 1 mult a shift b]
(if (= 0 shift)
res
(if (= 1 (rem shift 2))
(recur (* res mult) (* mult mult) (bit-shift-right shift 1))
(recur res (* mult mult) (bit-shift-right shift 1))
)
)
)
)
(defn p16 []
(println
(apply + (digit-split (pow 2 1000)))
)
)
Erlang: Running time = 0.12s
+-%digit_split
digit_split(N)->
lists:map(fun(X)->X-48 end,integer_to_list(N)).
+-%pow
pow(_,0)->1;
pow(1,_)->1;
pow(A,B)->pow(A,B,1).
pow(_,0,Res)->Res;
pow(Mult,B,Res) when B band 1 == 1 ->
pow(Mult*Mult,B bsr 1, Res*Mult);
pow(Mult,B,Res)->pow(Mult*Mult,B bsr 1, Res).
p16()->io:format("~w~n",[lists:sum(digit_split(pow(2,1000)))]).
Ruby: Running time = 0.02s
+-#Enumerable
module Enumerable
def sum
self.inject{|u,v|u+v}
end
def product
self.inject{|u,v|u*v}
end
def count(ob)
self.select{|i|i==ob}.length
end
def take_while
return [] unless yield(self.first)
if(self.class==Range)
evalPoint=self.first
evalPoint=evalPoint.succ while yield(evalPoint.succ) and not evalPoint==self.last
return self.first..evalPoint
else
s=self.to_a
upTo=1
upTo+=1 while yield(s[upTo]) and upTo<self.length
return self[0...upTo]
end
end
end
+-#dig_split
def dig_split(n)
s=n.to_s
s.split("").map{|i|i.to_i}
end
def p16
puts dig_split(2**1000).sum
end
Scala: Running time = 0.22s
+-//pow
def pow(a: BigInt, b: Int)={
def loop(res: BigInt, mult: BigInt, shift:Int): BigInt={
if(shift==0) res
else{
if(shift%2==0) loop(res, mult*mult, shift >> 1)
else loop(res*mult, mult*mult, shift >>1)
}
}
loop(1,a,b)
}
+-//digitSplit
def digitSplit(n: BigInt)={
n.toString.map(_.toInt - 48)
}
def p16{
println(digitSplit(pow(2,1000)).foldLeft(0)(_+_))
}