// // Maths challenge 2004-2005 J5 // // // My bank card has a 4 digit pin, abcd. I use the following facts to help me // remember it: // // - no two digits are the same // - the 2-digit number cd is 3 times the 2-digit number ab // - the 2-digit number da is 2 times the 2-digit number bc import choco.Problem; import choco.ContradictionException; import choco.integer.*; import choco.Solver; import choco.Solution; public class MathChallenge { public static void main(String[] args) { Problem pb = new Problem(); IntDomainVar a = pb.makeEnumIntVar("a",0,9); IntDomainVar b = pb.makeEnumIntVar("b",0,9); IntDomainVar c = pb.makeEnumIntVar("c",0,9); IntDomainVar d = pb.makeEnumIntVar("d",0,9); pb.post(pb.allDifferent(new IntVar[]{a,b,c,d})); IntDomainVar ab = pb.makeEnumIntVar("ab",0,99); IntDomainVar bc = pb.makeEnumIntVar("bc",0,99); IntDomainVar cd = pb.makeEnumIntVar("cd",0,99); IntDomainVar da = pb.makeEnumIntVar("da",0,99); pb.post(pb.eq(ab,pb.plus(pb.mult(10,a),b))); pb.post(pb.eq(bc,pb.plus(pb.mult(10,b),c))); pb.post(pb.eq(cd,pb.plus(pb.mult(10,c),d))); pb.post(pb.eq(da,pb.plus(pb.mult(10,d),a))); pb.post(pb.eq(pb.mult(3,ab),cd)); // 3.ab = cd pb.post(pb.eq(pb.mult(2,bc),da)); // 2.bc = da Solver s = pb.getSolver(); pb.solve(true); System.out.println("feasible: " + pb.isFeasible()); System.out.println("nbSol: " + s.getNbSolutions()); /* pb.solve(false); // first solution System.out.println(pb.pretty()); */ } } // // (unique) solution should be that abcd = 2163 //