Home More Samples
```
///////////////////////////////////////////////////////////////////////////////
// Squares from squares
///////////////////////////////////////////////////////////////////////////////
// Enigma 1553 Susan Denham, New Scientist magazine, July 11, 2009
///////////////////////////////////////////////////////////////////////////////
//
// Your task is to place a digit in each of these 16 squares:
//
//   +--+--+--+--+
//   |  |  |  |  |
//   +--+--+--+--+
//   |  |  |  |  |
//   +--+--+--+--+
//   |  |  |  |  |
//   +--+--+--+--+
//   |  |  |  |  |
//   +--+--+--+--+
//
// When you have finished, the grid should have the following properties:
//
// * no digit occurs more than once in any row
// * the sum of the four digits in each row is the same
// * the sum of the four digits in each column is the same
// * each row should form a different four-figure perfect square.
//
// Please send in the four perfect squares in increasing order.
//
///////////////////////////////////////////////////////////////////////////////
//
// Solve the problem by running the query:
//
//       Enigma_1553()
//
///////////////////////////////////////////////////////////////////////////////
//
// Results:
//
// [1764,3249,5184,9801],Nil
// Success
// Elapsed time: 00:00:00
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// Collect all solutions in a list and print the list
//
proc Enigma_1553() iff
all  x in results
Enigma_1553x(x)
end & Print(results)

///////////////////////////////////////////////////////////////////////////////
//
// a b c d
// e f g h
// i j k l
// m n o p
//
local pred Enigma_1553x(res :: [0..]->L) iff
letters :: [0..]->L[0..9] &
letters = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p]  &

// Note there is no explicit requirement for no leading zeroes.
// Constraints for each row...

_AllDifferent(a,b,c,d) & sum1 = a + b + c + d &
_AllDifferent(e,f,g,h) & sum1 = e + f + g + h &
_AllDifferent(i,j,k,l) & sum1 = i + j + k + l &
_AllDifferent(m,n,o,p) & sum1 = m + n + o + p &

// There is no requirement for column digits to be different...
sum2 = a + e + i + m &
sum2 = b + f + j + n &
sum2 = c + g + k + o &
sum2 = d + h + l + p &

// The four-figure numbers for each row...
x1 = 1000*a + 100*b + 10*c + d &
x2 = 1000*e + 100*f + 10*g + h &
x3 = 1000*i + 100*j + 10*k + l &
x4 = 1000*m + 100*n + 10*o + p &

// We want the results in ascending order
_AllAscending(x1,x2,x3,x4) &

// And each four-figure number must be a perfect square...
RtlIsPowerOf2(x1) &
RtlIsPowerOf2(x2) &
RtlIsPowerOf2(x3) &
RtlIsPowerOf2(x4) &

// Return the calculated numbers in an array
res = [x1,x2,x3,x4]

```