Skip to content

Instantly share code, notes, and snippets.

@rdivyanshu
Last active July 12, 2023 04:11
Show Gist options
  • Save rdivyanshu/92b28fcad9f7d6fde22261b12d726093 to your computer and use it in GitHub Desktop.
Save rdivyanshu/92b28fcad9f7d6fde22261b12d726093 to your computer and use it in GitHub Desktop.
% square size
#const n = 5.
% number of partition
#const m = 5.
% sum of each partition
#const sm = (n * (n + 1) * (2 * n + 1)) / (6 * m).
% given(N, X, Y) - there is N at (X, Y).
given(4, 1, 2). given(3, 1, 5).
given(5, 5, 1). given(5, 5, 4).
% partition(N, X, Y) - (X, Y) belong to partition N.
partition(1, 1, 1..3). partition(1, 2, 3).
partition(2, 1, 4..5). partition(2, 2, 4).
partition(3, 2, 1..2). partition(3, 3..5, 1).
partition(4, 2, 5). partition(4, 3, 2..5). partition(4, 4, 5). partition(4, 5, 3..5).
partition(5, 4, 2..4). partition(5, 5, 2).
% Encoding
partition(1..m).
% Choose center of hook of N
{ center(N, 1..n, 1..n) } = 1 :- N = 1..n.
% Choose directions of hook of N
{ direction(N, (-1; 1), (-1; 1)) } = 1 :- N = 1..n.
% calculate coordinates of hook of N
span(N, X + (0..N-1) * DX, Y) :- N = 1..n, center(N, X, Y), direction(N, DX, DY).
span(N, X, Y + (0..N-1) * DY) :- N = 1..n, center(N, X, Y), direction(N, DX, DY).
% assign which value will be written in hook of N
{ assign(N, 1..n) } = 1 :- N = 1..n.
% select written block of hooks of N.
{ written(W, X, Y) : span(N, X, Y) } = W :- N = 1..n, assign(N, W).
:- span(N, X, Y), X < 0.
:- span(N, X, Y), X > n.
:- span(N, X, Y), Y < 0.
:- span(N, X, Y), Y > n.
:- span(N1, X, Y), span(N2, X, Y), N1 != N2.
:- written(_, X, Y), written(_, X + 1, Y), written(_, X, Y + 1), written(_, X + 1, Y + 1).
{ start(X, Y) : written(N, X, Y) } = 1.
connected(X, Y) :- start(X, Y).
connected(X + 1, Y) :- connected(X, Y), written(_, X + 1, Y).
connected(X, Y + 1) :- connected(X, Y), written(_, X, Y + 1).
connected(X - 1, Y) :- connected(X, Y), written(_, X - 1, Y).
connected(X, Y - 1) :- connected(X, Y), written(_, X, Y - 1).
:- written(_, X1, Y1), not connected(X1, Y1).
:- span(N, X, Y), not partition(_, X, Y).
:- given(N, X, Y), not written(N, X, Y).
:- partition(G), sm != #sum { N, R, C : written(N, R, C), partition(G, R, C) }.
#show written/3.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment