/* Enigma 1557 (Reverse division) in Picat. Problem from F1 Compiler: http://www.f1compiler.com/samples/Enigma%201557.f1.html """ Reverse divisiona Enigma 1557 Richard England, New Scientist magazine, August 8, 2009 1. What is the four-digit integer divisible by 11 and 13 whose reverse is a larger integer also divisible by 11 and 13? 2. What is the four-digit integer divisible by 17 and 19 whose reverse is a larger integer also divisible by 17 and 19? Neither of your answers may have a leading zero. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> N = 4, % n-digit numbers MaxNum = 10**N-1, N1 :: 10*N..MaxNum, N2 :: 10*N..MaxNum, enigma_1557(N1,[11,13],N), enigma_1557(N2,[17,19],N), Vars = [N1,N2], solve(Vars), println([N1,N2]), fail, nl. go => true. enigma_1557(X1, Divs, Len) => fd_min_max(X1,Min,Max), X2 :: Min..Max, A1 = new_list(Len), A1 :: 0..9, A2 = new_list(Len), A2 :: 0..9, foreach(I in 1..Divs.len) X1 mod Divs[I] #= 0, X2 mod Divs[I] #= 0 end, X2 #> X1, to_num(A1,10, X1), reverse(A1, A2), to_num(A2, 10, X2), A1[1] #> 0, A2[1] #> 0. % % converts a number Num to/from a list of integer List given a base Base % to_num(List, Base, Num) => Len = length(List), Num #= sum([List[I]*Base**(Len-I) : I in 1..Len]). % % reverse an array % reverse(X, Rev) => Len = X.len, foreach(I in 1..Len) Rev[I] #= X[Len-I+1] end.