/* Munchhausen numbers in Picat. http://rosettacode.org/wiki/Munchausen_numbers """ A Munchausen number is a natural number n the sum of whose digits (in base 10), each raised to the power of itself, equals n. (Munchausen is also spelled: Münchhausen.) For instance: 3435 = 33 + 44 + 33 + 55 Task Find all Munchausen numbers between 1 and 5000 """ 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 => go. go => println([N : N in 1..5000, munchhausen_number(N)]), nl. munchhausen_number(N) => N == sum([T : I in N.to_string(),II = I.to_int(), T = II**II]). % % checking up to 500_000_000: [1,3435,438579088] % 284.6s % go2 ?=> H = [0] ++ [I**I : I in 1..9], N = 1, Res = [], while (N < 500_000_000) Sum = 0, NN = N, Found = true, while (NN > 0, Found == true) Sum := Sum + H[1+(NN mod 10)], if Sum > N then Found := false end, NN := NN div 10 end, if Sum == N then println(N), Res := Res ++ [N] end, N := N+1 end, println(res=Res), nl. go2 => true.