include "globals.mzn"; %Données %Ensemble des valeurs possibles set of int: X = 0..9; %Ensemble des couleurss possibles set of int: C = 1..3; %Nombre de chiffres dans le code int: n = 5; %Variables %Valeur de chaque chiffre du code array [1..n] of var X: x; %Couleur de chaque chiffre du code array [1..n] of var C: c; %Nombre d'occurence de chaque chiffre dans le code array [1..10] of var 0..2: count; %Contraintes %Les chiffres sont en ordre croissant constraint forall (i in 1..n-1) (x[i] <= x[i+1]); %Les chiffres autres que 5 sont noir ou blanc constraint forall (i in 1..n where x[i] != 5)(c[i] <= 2); %Les 5 sont verts constraint forall (i in 1..n where x[i] == 5)(c[i] = 3); %Les chiffres autres que 5 qui apparaissent deux fois sont d'abord noir puis blanc constraint forall (i in 1..n-1 where x[i] == x[i+1] /\ x[i] != 5)(c[i] = 1 /\ c[i+1] = 2); %count est le nombre d'occurence de chaque valeur dans le code (ce qui impose qu'une valeur apparaît au plus 2 fois) constraint global_cardinality(x, X, count); %Il y a un 2 en deuxième position du code constraint x[2] = 2; %La somme des valeurs des chiffres noirs du code vaut 3 constraint sum(i in 1..n where c[i] == 1) (x[i]) = 3; %La somme des valeurs des chiffres blancs du code vaut 11 constraint sum(i in 1..n where c[i] == 2) (x[i]) = 11; %Il n'y a pas de 0 noir, de 1 blanc, de 7 noir ni de 9 dans le code constraint forall (i in 1..n) ((x[i] != 0 \/ c[i] != 1) /\ (x[i] != 1 \/ c[i] != 2) /\ (x[i] != 7 \/ c[i] != 1) /\ (x[i] != 9)); solve satisfy; output [show(x) ++ show(c) ++ show(count)];