Use each digit from 1 to 7 exactly once, and place them into the circles of Figure 1 in such a way that the sum along each of the five lines is the same.

The key observations are: There are 7 circles and 7 digits. On each line we have 3 circles, hence 3 digits to place. Which digit should be at the center? Or: what numbers should be at the two ends of a line? Once answered these questions, it is easy to see the solution. Two observations lead to the number in the center: (1) The sum must be even, since otherwise at least four lines must have two even and one odd numbers, but there are only three numbers in {1,…, 7} that are even. (2) the sum of all numbers is 28. The sum on the three lines through the center is 28 + 2D and it must be divisible by 3. Since the sum is even, 28 + 2D can only be 36. Hence the sum is 12 and D = 4.

Let’s now formulate this problem as a mathematical model: Seven integer variables
x_{i} ∈{1,…, 7} with i,j ∈ I = {A,…, G} are to be determined and all must be different from
each other. Furthermore, an additional variable z is introduced for the sum on each
line.

Note that: Depending on the notation of the formulation, the sentence “all must be different from each other” could directly be interpreted as a predicate in the modeling formulation (as done here) or be translated as a set of inequalities as follows:

In the LPL language the predicate is directly integrated as a “global constraint” with the keyword alldiff (another way in LPL is to use the function Alldiff()).

For each of the five straight lines a constraint is specified and the whole model can be formulated as follows :

model Puzzle7 "The 7-Digits Puzzle";

set i,j := ['A','B','C','D','E','F','G'];

alldiff variable x{i} [1..7];

variable z;

constraint

L1: x['A'] + x['D'] + x['G'] = z;

L2: x['A'] + x['C'] + x['F'] = z;

L3: x['B'] + x['E'] + x['G'] = z;

L4: x['B'] + x['D'] + x['F'] = z;

L5: x['C'] + x['D'] + x['E'] = z;

solve;

Write('%s , z=%d' n',{i} Format('%s=%d ', i, x), z));

--draw the solution

parameter X{i}:=[10 50 10 30 50 10 50];

Y{i}:=[10 10 50 50 50 90 90];

set li{i,j}:=[('A','F') ('A','G') ('B','F') ('B','G') ('C','E')];

Draw.Scale(10,5);

Draw.DefFont('Verdana',20,0,2);

{li[i,j]} Draw.Line(X[i],Y[i],X[j],Y[j]);

{i} Draw.Circle(i&'='&x,X,Y,3,1,0);

--{i} Draw.Circle(i&'',X,Y,3,1,0);

end

The solution is given in Figure 2. The sum on each line is z = 12.

[1] MatMod. Homepage for Learning Mathematical Modeling : https://matmod.ch.

[2] Hürlimann T. Reference Manual for the LPL Modeling Language, most recent version. https://matmod.ch/lpl/doc/manual.pdf.