Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % USAGE: clingo -n 0 <thisfile.txt # show all solutions to puzzle
- %
- % Works with clingo 3 (NOT clingo 4). Download from:
- % http://sourceforge.net/projects/potassco/files/clingo/3.0.5/
- %
- % See https://news.ycombinator.com/item?id=8606193
- % Two colors: 1 = red, 2 = blue. (0 = empty)
- color(1). color(2).
- #const size = 6.
- % coord(Y,X) = Y,X is a valid coordinate of a cell in the puzzle.
- coord(0..size-1,0..size-1).
- % p(Y,X,C) = cell [Y,X] is color C in the original puzzle.
- % - O - - - -
- % X X O O X O
- % - - - - - -
- % O - X - O -
- % - - - - - O
- % X - O - X -
- p(0,0,0). p(0,1,1). p(0,2,0). p(0,3,0). p(0,4,0). p(0,5,0).
- p(1,0,2). p(1,1,2). p(1,2,1). p(1,3,1). p(1,4,2). p(1,5,1).
- p(2,0,0). p(2,1,0). p(2,2,0). p(2,3,0). p(2,4,0). p(2,5,0).
- p(3,0,1). p(3,1,0). p(3,2,2). p(3,3,0). p(3,4,1). p(3,5,0).
- p(4,0,0). p(4,1,0). p(4,2,0). p(4,3,0). p(4,4,0). p(4,5,1).
- p(5,0,2). p(5,1,0). p(5,2,1). p(5,3,0). p(5,4,2). p(5,5,0).
- % q(Y,X,C) = cell[Y,X] is color C in the solved puzzle.
- % The colors in the original puzzle must not change in the solution.
- q(Y,X,C) :- p(Y,X,C), C != 0.
- % Each empty square in the original puzzle must be colored red or blue in the solution.
- 1 { q(Y,X,C) : color(C) } 1 :- p(Y,X,0).
- % f(Y,X) = cell(Y,X) is filled with some color.
- f(Y,X) :- q(Y,X,C), C != 0.
- % Solution cannot have empty squares.
- :- coord(Y,X), not f(Y,X).
- % Solution cannot have three adjacent cells of the same color horizontally.
- :- q(Y,X,C), q(Y,X+1,C), q(Y,X+2,C).
- % Solution cannot have three adjacent cells of the same color vertically.
- :- q(Y,X,C), q(Y+1,X,C), q(Y+2,X,C).
- % Exactly half of the cells in every row in the solution must be red.
- :- K = #count { q(Y,X,1) : coord(_,X) }, coord(Y,_), K != size/2.
- % Exactly half of the cells in every column in the solution must be red.
- :- K = #count { q(Y,X,1) : coord(Y,_) }, coord(_,X), K != size/2.
- % diffrow(Y1, Y2) = rows Y1 and Y2 differ.
- diffrow(Y1, Y2) :- q(Y1,X,C1), q(Y2,X,C2), C1 != C2, coord(Y1,_), coord(Y2,_), Y1 < Y2.
- % diffcol(X1, X2) = columns X1 and X2 differ.
- diffcol(X1, X2) :- q(Y,X1,C1), q(Y,X2,C2), C1 != C2, coord(_,X1), coord(_,X2), X1 < X2.
- % Solution cannot have duplicate rows.
- :- coord(Y1,_), coord(Y2,_), Y1 < Y2, not diffrow(Y1, Y2).
- % Solution cannot have duplicate columns.
- :- coord(_,X1), coord(_,X2), X1 < X2, not diffcol(X1, X2).
- #hide.
- #show q/3. % Show the solution
Advertisement
Add Comment
Please, Sign In to add comment