/* Euler #41 in Picat. """ We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime. What is the largest n-digit pandigital prime that exists? """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. go => time(euler41). euler41 => % Simplification: % n=9 is not possible since 1+2+3+4+5+6+7+8+9=45 is divisible by 3 % n=8 is not possible since 1+2+3+4+5+6+7+8=36 is divisible by 3 N = 7, M = 0, while (M == 0, N >= 4) P = [], foreach(I in N..-1..1) P := P ++ [I] end, % note: it's reversed sorted so we stop at first prime Perms = permutations(P).sort_down(), V = 4, % dummy value for the foreach loop foreach(PP in Perms, not prime_cached(V)) V := [J.to_string() : J in PP].flatten().to_integer(), if prime_cached(V) then M := V % found it end end, N := N-1 end, println(M). % Without the simplification (i.e. starting on N=7): 14.4s euler41b => % Simplification (from one of the answers) N =9, % is not possible since 1+2+3+4+5+6+7+8+9=45 is divisible by 3 % N=8 is not possible since 1+2+3+4+5+6+7+8=36 is divisible by 3 % N = 7, M = 0, while (M == 0, N >= 4) P = [], foreach(I in N..-1..1) P := P ++ [I] end, % note: it's reversed sorted so we stop at first prime Perms = permutations(P).sort_down(), V = 4, % dummy value for the foreach loop foreach(PP in Perms, not prime_cached(V)) V := [J.to_string() : J in PP].flatten().to_integer(), if prime_cached(V) then M := V % found it end end, N := N-1 end, println(M). table prime_cached(N) => prime(N).