# Solving PuzzlOR "Coins" puzzle with constraint logic programming

PuzzlOR's problem for February 2015–April 2015 was "Coins": http://puzzlor.com/2015-02_Coins.html

The puzzle asks to find an arrangement of 9 coins (3 of each type – 1, 5, and 10 cents) in the 3 × 3 grid in which sums for each row and column correspond to the numbers given in the picture.

The answer submission deadline has passed, and I want to share my solution to the puzzle, for which I used Prolog-based constraint logic programming system ECLiPSe.

Here is my complete program to solve the puzzle (https://github.com/kit1980/sdymchenko-com/blob/master/coins-eclipse/coins.ecl):

:- lib(ic). :- lib(ic_global). main :- dim(Coins, [3, 3]), Coins :: [1, 5, 10], occurrences(1, Coins, 3), occurrences(5, Coins, 3), occurrences(10, Coins, 3), sum(Coins[1, 1..3]) #= 11, sum(Coins[2, 1..3]) #= 12, sum(Coins[3, 1..3]) #= 25, sum(Coins[1..3, 1]) #= 21, sum(Coins[1..3, 2]) #= 16, sum(Coins[1..3, 3]) #= 11, labeling(Coins), ( foreacharg(Row, Coins) do array_list(Row, List), join_string(List, "\t", Line), writeln(Line) ).

First two lines import 2 constraint programming libraries: `ic`

for arithmetic constraints and `ic_global`

for `occurrences`

.
Then 3 by 3 `Coins`

array is declared; the array can only have 1, 5, or 10 as its elements, and each of the numbers must occur 3 times.
After that sums of the rows and columns are constrained according to the problem specification, and `labeling`

finds concrete values for `Coins`

array
that satisfy all constraints. In the end, `foreacharg`

loop is used to output the answer:

1 5 5 10 1 1 10 10 5

This puzzle is much easier than the previous PuzzlOR's problem, Electrifying, for which I also have a solution in ECLiPSe. For "Coins", any bruteforce solution should work, because there are only about 9! / (3 * 3!) = 1680 variants to check. Still, ECLiPSe allows to formulate the problem declaratively and compactly.

To learn more about ECLiPSe see the official site, Hakan Kjellerstrand's ECLiPSe page, and eclipse-clp tag on this blog.