Download
language ESSENCE 1.2.0
$ prob023.essence: Magic Hexagon
$ Problem details available at http://www.csplib.org/Problems/prob023/
$ 03 September 2007
$
$ d: the diameter of the hexagon (length of the longest row)
given d : int(1..)
$ d must be an odd integer
where d % 2 = 1
$ o: the order of the hexagon (length of the shortest row)
$ maxval: the maximum value that will appear in the hexagon
$ maxsum: the maximum value that a row could sum to
$ Value: the domain consisting of the integers contained in the hexagon
letting o be d/2 + 1,
maxval be 3 * o**2 - 3 * o + 1,
maxsum be sum i : int(maxval + 1 - d..maxval) . i,
Value be domain int(1..maxval)
$ hexagon: the hexagon is represented by a matrix. for any row i, we are only
$ interested in the first d - |d/2 + 1 - i| elements of the row
$ s: the magic number that all rows and diagonals sum to
find hexagon : matrix indexed by [int(1..d),int(1..d)] of Value,
s : int(1..maxsum)
such that
$ all elements are different (and therefore all values are included)
forAll r1,r2 : int(1..d) . forAll i1 : int(1..d - |o - r1|) .
forAll i2 : int(1..d - |o - r2|) . r1 != r2 \/ i1 != i2 ->
hexagon[r1,i1] != hexagon[r2,i2],
$ all rows sum to s
forAll r : int(1..d) . (sum i : int(1..d - |o - r|) . hexagon[r,i]) = s,
$ all right-sloping diagonals sum to s
forAll r : int(1..d) . (sum i : int(1..d - |o - r|) .
hexagon[i + max({0,o-r}), r - max({0,o-(i + max({0,o-r}))})]) = s,
$ all left-sloping diagonals sum to s
forAll r : int(1..d) . (sum i : int(1..d - |o - r|) .
hexagon[i + max({0,r-o}), r - max({0,(i + max({0,r-o}))-o})]) = s