/* Missing digit in Picat. From Emissary (Mathematical Sciences Research Institute), Spring/Fall 2006 http://www.msri.org/communications/emissary/pdfs/EmissarySpringFall2006.pdf - """ The number 2^29 is a 9-digit number with distinct digits. Which digit is missing? """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp,ordset. main => go. go ?=> N = 9, X = new_list(N), X :: 0..N, Num = 2**29, Missing :: 0..N, all_different(X), to_num(X,10,Num), foreach(I in 1..N) Missing #!= X[I] end, Vars = X ++ [Missing], solve(Vars), println(x=X), println(missing=Missing), nl, fail, nl. go => true. % % Plain logic programming % go2 ?=> Num = [I.to_int : I in (2**29).to_string()], println(num=Num), member(Missing,0..9), not member(Missing,Num), println(missing=Missing), fail, nl. go2 => true. % % Another CP variant % go3 ?=> Num = [I.to_int : I in (2**29).to_string()], Missing :: 0..9, foreach(I in 1..Num.len) Missing #!= Num[I] end, solve([Missing]), println(missing=Missing), fail, nl. go3 => true. % % Another CP variant % go4 ?=> Num = [I.to_int : I in (2**29).to_string()], Missing :: 0..9, sum([Missing #= Num[I] : I in 1..Num.len]) #= 0, solve([Missing]), println(missing=Missing), fail, nl. go4 => true. % % Using ordset % go5 ?=> Num = [I.to_int : I in (2**29).to_string()], println(subtract(0..9,Num.sort).first()), % this works since we sort Num % println(subtract(new_ordset(0..9),new_ordset(Num)).first()), % more formal fail, nl. go5 => true. % % 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]).