/* Project Euler #65 in Picat. http://projecteuler.net/problem=56 """ Powerful digit sum A googol (10^100) is a massive number: one followed by one-hundred zeros; 100^100 is almost unimaginably large: one followed by two-hundred zeros. Despite their size, the sum of the digits in each number is only 1. Considering natural numbers of the form, ab, where a, b < 100, what is the maximum digital sum? """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => time(euler56). % brute force: 0.55s euler56 => N = 99, println(max([digitsum(I**J) : I in 1..N, J in 1..N])). % slightly slower: 0.56s euler56b => Max = 0, N = 99, foreach(I in 1..N, J in 1..N) K = I**J, DS = digitsum(K), if DS > Max then Max := DS end end, println(Max), nl. % somewhat cheating: 0.024s euler56c => N = 99, println(max([digitsum(I**J) : I in 90..N, J in 90..N])). % even more so: 0.004s euler56d => println(max([digitsum(99**J) : J in 90..99])). digitsum(N) = sum([I.to_integer() : I in N.to_string()]). % caching .to_integer() is slower % digitsum(N) = sum([I.toint() : I in N.to_string()]). table toint(C) = C.to_integer().