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