/* Problem from Richard Wiseman in Picat. http://richardwiseman.wordpress.com/2013/11/29/its-the-friday-puzzle-235/ """ I am thinking of a 5-digit number. If you put '1' at the beginning of the number you get a number that is three times smaller than if you put '1' at the end of the number. What number am I thinking of? """ This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go => X :: 10000..99999, 3*(100000+X) #= 10*X + 1, solve(X), println(X), fail, nl. go => true. % A much more complex variant go2 => N = 5, NumberA = new_list(N), NumberA :: 0..9, Number :: 10000..99999, OneBeforeA = new_list(N+1), OneBeforeA :: 0..9, OneBefore :: 100000..999999, OneAfterA = new_list(N+1), OneAfterA :: 0..9, OneAfter :: 100000..999999, to_num(NumberA,10,Number), to_num(OneBeforeA,10,OneBefore), to_num(OneAfterA,10,OneAfter), OneBeforeA[1] #= 1, OneAfterA[N+1] #= 1, foreach(I in 1..N) OneBeforeA[I+1] #= NumberA[I], OneAfterA[I] #= NumberA[I] end, OneBefore * 3 #= OneAfter, Vars = NumberA ++ OneBeforeA ++ OneAfterA, solve(Vars), println(Number), fail, nl. % % 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]).