1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

136 lines
3.0 KiB
MiniZinc

/***
!Test
expected:
- !Result
solution: !Solution
D: 6
E: 5
L: 3
O: 9
ODD: 966
P: 1
PUZZLE: 102235
U: 0
Z: 2
num1: 161
num2: 635
num3: 805
num4: 483
x: [9, 6, 1, 0, 2, 3, 5]
***/
% Regression test for a bug in mzn2fzn 1.2. The optimisation pass was leaving
% dangling references to variables it had "eliminated". The symptom was the
% following error from the FlatZinc interpreter:
%
% enigma_1568.fzn:28:
% symbol error: `INT____3' undeclared
% enigma_1568.fzn:30:
% symbol error: `INT____3' undeclared
%
% (This model is from the original bug report.)
% Enigma problem 1568 (Odd puzzle) in MiniZinc.
%
% From New Scientist
% http://www.newscientist.com/article/mg20427311.100-enigma-number-1568.html
% """
% 21 October 2009 by Albert Haddad
%
% Odd puzzle
%
% In this multiplication sum the digits have been replaced by letters and
% dots. Different letters stand for different digits, the same letter
% stands for the same digit, each dot can be any digit, and leading
% digits cannot be zero.
%
% [
% . . . | num1
% * . . . | num2
% -------
% . . . | num3
% . . . | num4
% O D D | ODD
% ---------
% P U Z Z L E | PUZZLE
%
% ]
%
% What is the six-figure odd PUZZLE?
% """
%
% This MiniZinc model was created by Hakan Kjellerstrand, hakank@bonetmail.com
% See also my MiniZinc page: http://www.hakank.org/minizinc
%
include "globals.mzn";
int: n = 7; % number of unknown
set of int: Digits = 0..9;
var Digits: O;
var Digits: D;
var Digits: P;
var Digits: U;
var Digits: Z;
var Digits: L;
var Digits: E;
array[1..n] of var Digits: x;
var 100..999: num1;
var 100..999: num2;
var 100..999: num3;
var 100..999: num4;
var 100..999: ODD ;
var 100000..999999: PUZZLE;
predicate cp1d(array[int] of var int: x, array[int] of var int: y) =
assert(index_set(x) = index_set(y),
"cp1d: x and y have different sizes",
forall(i in index_set(x)) ( x[i] = y[i] ) )
;
% solve satisfy;
solve :: int_search(
x ++ [num1,num2,num3,num4,ODD,PUZZLE],
first_fail,
indomain_min,
complete)
satisfy;
constraint
cp1d(x, [O,D,P,U,Z,L,E]) /\
all_different(x) /\
ODD = 100*O + 10*D + D /\
PUZZLE = 100000*P + 10000*U + 1000*Z + 100*Z + 10*L + E /\
num1 * num2 = num3 + num4*10 + ODD*100 /\
PUZZLE = num1 * num2 /\
PUZZLE mod 2 = 1 /\ % PUZZLE is odd
% And then code the "long multiplication"
num1 * (num2 mod 10) = num3 /\
num1 * ((num2 div 10) mod 10) = num4 /\
num1 * (num2 div 100) = ODD
;
output [
"O = ", show(O), ";\n",
"D = ", show(D), ";\n",
"P = ", show(P), ";\n",
"U = ", show(U), ";\n",
"Z = ", show(Z), ";\n",
"L = ", show(L), ";\n",
"E = ", show(E), ";\n",
"x = ", show(x), ";\n",
"num1 = ", show(num1), ";\n",
"num2 = ", show(num2), ";\n",
"num3 = ", show(num3), ";\n",
"num4 = ", show(num4), ";\n",
"ODD = ", show(ODD), ";\n",
"PUZZLE = ", show(PUZZLE), ";\n"
];