% IQ Mini problem set by SmartGames
% 5x5 board with 3 pins at specified possible positions
% 6 tiles to cover the remaining squares of the board

% Conclusions:
% - every setup can be solved
% - there are 5 setups of the 392 possible where there is a unique solution
%   (or: there are 3 such setups of the 191 possible, excluding rotations/flips)

setup([A,B,C]) :-
member(A, [1-1,2-1,1-2,2-2,3-2,4-2,2-3,2-4]),
member(B, [3-3,4-3,1-4,3-4,1-5,2-5,3-5]),
member(C, [4-1,5-1,5-2,5-3,5-4,4-5,5-5]).

%         OO
% OOoooo  oo
%         oo
piece('I', [[1-0,2-0],[0-1,0-2]]).

% OOoo  ooOO    oo  oo
% oo      oo  ooOO  OOoo
piece(r, [[1-0,0-1],[(-1)-0,0-1],[(-1)-0,0-(-1)],[1-0,0-(-1)]]).

%           oo    oo    oo
% ooOOoo  ooOO  ooOOoo  OOoo
%   oo      oo          oo
piece('T', [[(-1)-0,1-0,0-1],[(-1)-0,0-1,0-(-1)],
[(-1)-0,1-0,0-(-1)],[1-0,0-1,0-(-1)]]).

%         OOoo            oo          ooOO          oo
% oo      oo    ooooOO    oo  OOoooo    oo      oo  oo
% OOoooo  oo        oo  ooOO  oo        oo  ooooOO  OOoo
piece('L', [[0-(-1),1-0,2-0],[1-0,0-1,0-2],
[0-1,(-1)-0,(-2)-0],[(-1)-0,0-(-1),0-(-2)],
[0-1,1-0,2-0],[(-1)-0,0-1,0-2],
[0-(-1),(-1)-0,(-2)-0],[1-0,0-(-1),0-(-2)]]).

% OOoo
% oooo
piece('O', [[1-0,0-1,1-1]]).

%   oo          oo
% OOoo  ooOO    ooOO    oooo
% oo      oooo    oo  ooOO
piece('Z', [[0-1,1-0,1-(-1)],[(-1)-0,0-1,1-1],
[0-1,(-1)-0,(-1)-(-1)],[(-1)-0,0-(-1),1-(-1)]]).

solve(Setup, Pieces, Solution) :-
findall(P, (piece(P, _), \+ member(p(P,_,_), Pieces)), Remaining),
solve(Setup, Pieces, Remaining, Solution).

solve(_, Pieces, [], Pieces).
solve(Setup, Pieces, [R|Remaining], Solution) :-
position(Setup, Pieces, Pos),
piece(R, Forms),
length(Forms, N),
between(1, N, F),
check(Setup, Pieces, p(R,Pos,F)),
solve(Setup, [p(R,Pos,F)|Pieces], Remaining, Solution).

position(Setup, Pieces, X-Y) :-
between(1, 5, X), between(1, 5, Y),
\+ member(X-Y, Setup),
\+ ( member(P, Pieces), covers(P, X-Y) ).

covers(p(_,X-Y,_), X-Y).
covers(p(P,X-Y,F), X1-Y1) :-
piece(P, Forms),
nth1(F, Forms, Form),
member(DX-DY, Form),
X1 =:= X + DX,
Y1 =:= Y + DY.

check(Setup, Pieces, p(P,X-Y,F)) :-
piece(P, Forms),
nth1(F, Forms, Form),
forall(member(DX-DY, Form),
( X1 is X + DX, Y1 is Y + DY,
position(Setup, Pieces, X1-Y1)
)).

show(Pieces) :- show([], Pieces), !.
show(Setup, Pieces) :- show(Setup, Pieces, 1-1), !.
show(_, _, 1-6) :- !.
show(Setup, Pieces, 6-Y) :- Y1 is Y + 1, nl, show(Setup, Pieces, 1-Y1).
show(Setup, Pieces, X-Y) :-
X1 is X + 1,
( member(X-Y, Setup) -> write('_ ')
; member(P, Pieces), covers(P, X-Y) -> P = p(C,_,_), write(C), write(' ')
; write('. ')
),
show(Setup, Pieces, X1-Y).

% 1. Is there any setup without solution?

% ?- setup(S), \+ solve(S, [], X), show(S, []).
% false.

% 2. Is there any (bare) setup with a unique solution?

% ?- setup(S), findall(C, solve(S, [], C), [X]), show(X).

% S = [4-2, 1-4, 5-3]
% r r L L L
% Z r T . L
% Z Z T T .
% . Z T O O
% I I I O O

% S = [4-2, 2-5, 5-3]
% O O L L L
% O O T . L
% I T T T .
% I Z Z r r
% I . Z Z r

% S = [2-4, 1-5, 5-4]
% Z Z I I I
% T Z Z O O
% T T L O O
% T . L r .
% . L L r r

% S = [2-4, 3-5, 4-1]
% r Z Z . I
% r r Z Z I
% L T T T I
% L . T O O
% L L . O O

% S = [2-4, 3-5, 5-2]
% O O I I I
% O O T Z .
% L T T Z Z
% L . T r Z
% L L . r r

% 3. All setups + 1 piece with a unique solution?

one_piece(Setup, p(P,Pos,F)) :-
piece(P, Forms),
length(Forms, N),
between(1, N, F),
position(Setup, [], Pos),
check(Setup, [], p(P,Pos,F)).

% ?- setup(S), write(S), nl, one_piece(S, P), findall(C, solve(S, [P], C), [X]), show(S, [P]), nl, fail.
% ... too many.

% We can restrict it to cases when, e.g., the `r` tile is in the top-left corner:

% ?- setup(S), write(S), nl, one_piece(S, P), P = p(r,1-1,1), findall(C, solve(S, [P], C), [X]), show(S, [P]), nl, fail.
% Even this has many solutions.

% 4. Which setup has the most solutions? How many?

% ?- setup(S), findall(X, solve(S, [], X), Xs), length(Xs, N), write(N), write('\t'), write(S), nl, fail.

% Here's the sorted output:
% 126   [1-1,1-5,5-5]
% 126   [1-1,1-5,5-1]
% 59    [4-2,1-5,5-5]
% 59    [2-2,1-5,5-5]
% 58    [1-1,3-5,5-5]
% 58    [1-1,3-5,5-1]
% 58    [1-1,1-5,5-3]
% 55    [1-2,1-5,5-5]
% 55    [1-1,1-5,4-5]
% 55    [1-1,1-5,4-1]
% 55    [1-1,1-4,5-1]
% 52    [1-1,3-3,5-5]
% 50    [3-2,1-5,5-5]
% 50    [1-1,3-4,5-1]
% 41    [2-3,1-5,5-5]
% 41    [1-2,2-5,5-2]
% 41    [2-1,2-5,5-4]
% 41    [2-1,2-5,5-2]
% 41    [2-1,1-4,5-4]
% 41    [1-1,3-5,4-5]
% 41    [1-1,4-3,5-1]
% 40    [2-1,1-5,5-5]
% 40    [1-1,2-5,5-1]
% 40    [1-1,1-5,5-4]
% 40    [1-1,1-5,5-2]
% 39    [2-2,3-5,5-5]
% 38    [4-2,3-5,5-5]
% 38    [3-2,4-3,5-1]
% 37    [2-2,3-5,5-1]
% 37    [2-2,1-5,5-3]
% 36    [3-2,1-4,5-4]
% 36    [1-2,3-4,5-2]
% 34    [2-3,1-5,5-2]
% 34    [3-2,2-5,5-1]
% 34    [2-2,1-5,5-1]
% 34    [1-2,4-3,5-5]
% 34    [2-1,3-4,5-5]
% 32    [1-1,3-3,5-1]
% 31    [2-3,1-5,5-1]
% 31    [3-2,1-5,5-1]
% 31    [1-2,1-5,5-2]
% 31    [2-1,2-5,5-5]
% 31    [2-1,2-5,5-1]
% 31    [1-1,3-4,5-5]
% 31    [1-1,1-4,5-4]
% 31    [1-1,4-3,5-5]
% 29    [2-3,2-5,5-5]
% 29    [1-2,1-4,5-4]
% 29    [1-2,1-4,5-2]
% 29    [2-1,2-5,4-5]
% 29    [2-1,2-5,4-1]
% 29    [1-1,4-3,4-1]
% 28    [2-3,2-5,4-1]
% 28    [2-3,1-4,5-4]
% 28    [3-2,1-4,5-2]
% 28    [1-2,3-4,5-4]
% 28    [1-2,4-3,5-2]
% 28    [2-1,4-3,4-5]
% 28    [1-1,3-5,5-3]
% 26    [2-3,1-5,4-5]
% 26    [2-3,3-4,5-5]
% 26    [3-2,4-3,5-5]
% 26    [1-2,1-5,5-1]
% 26    [2-1,1-5,5-1]
% 26    [2-1,4-3,5-1]
% 26    [1-1,3-5,5-4]
% 26    [1-1,2-5,5-5]
% 26    [1-1,1-4,5-5]
% 25    [2-3,2-5,5-1]
% 25    [2-3,1-5,5-4]
% 25    [3-2,1-5,5-2]
% 25    [1-2,4-3,5-1]
% 25    [1-1,3-4,5-4]
% 25    [1-1,4-3,4-5]
% 24    [2-3,2-5,5-4]
% 24    [2-3,1-5,4-1]
% 24    [3-2,1-4,5-1]
% 24    [1-2,3-5,5-5]
% 24    [1-2,3-4,5-5]
% 24    [1-2,4-3,4-1]
% 24    [2-1,4-3,5-5]
% 24    [1-1,3-3,5-3]
% 23    [2-3,1-5,5-3]
% 23    [3-2,3-5,4-5]
% 23    [3-2,3-5,5-1]
% 22    [2-4,3-5,5-5]
% 22    [2-4,3-4,5-2]
% 22    [2-3,3-5,5-5]
% 22    [2-3,2-5,4-5]
% 22    [2-3,3-4,5-1]
% 22    [2-3,1-4,4-1]
% 22    [3-2,1-4,4-1]
% 22    [1-2,2-5,5-4]
% 22    [1-2,2-5,4-1]
% 22    [1-2,3-4,4-5]
% 22    [2-1,1-4,4-5]
% 22    [2-1,1-4,5-2]
% 22    [2-1,4-3,5-4]
% 22    [2-1,4-3,4-1]
% 21    [2-4,3-5,5-1]
% 21    [2-3,2-5,5-2]
% 21    [4-2,1-5,5-3]
% 21    [4-2,4-3,4-1]
% 21    [3-2,2-5,5-5]
% 21    [3-2,2-5,5-4]
% 21    [3-2,2-5,5-2]
% 21    [3-2,1-5,4-5]
% 21    [3-2,1-4,4-5]
% 21    [1-2,3-4,4-1]
% 21    [1-2,4-3,4-5]
% 21    [2-1,3-5,5-5]
% 21    [2-1,3-4,5-4]
% 21    [2-1,3-4,5-2]
% 21    [2-1,3-4,5-1]
% 21    [1-1,3-4,4-1]
% 20    [2-3,3-5,4-5]
% 20    [2-3,3-5,5-1]
% 20    [4-2,1-4,5-4]
% 20    [3-2,1-5,5-3]
% 20    [2-2,1-4,5-4]
% 20    [1-1,3-4,5-3]
% 19    [2-4,3-4,5-4]
% 19    [2-4,4-3,4-1]
% 19    [2-3,3-4,5-3]
% 19    [4-2,4-3,4-5]
% 19    [2-2,3-4,5-4]
% 19    [2-2,4-3,4-5]
% 18    [2-4,3-4,4-5]
% 18    [2-4,4-3,4-5]
% 18    [2-3,3-5,5-2]
% 18    [4-2,3-4,5-4]
% 18    [4-2,4-3,5-4]
% 18    [3-2,2-5,5-3]
% 18    [2-2,4-3,4-1]
% 18    [1-2,3-5,4-5]
% 18    [1-2,1-5,4-5]
% 18    [2-1,3-4,5-3]
% 18    [1-1,1-4,4-1]
% 17    [2-4,2-5,4-1]
% 17    [2-4,1-4,5-2]
% 17    [2-4,4-3,5-1]
% 17    [2-4,3-3,5-5]
% 17    [4-2,2-5,5-4]
% 17    [4-2,2-5,4-1]
% 17    [4-2,1-4,5-2]
% 17    [4-2,3-3,5-5]
% 17    [3-2,3-3,5-1]
% 17    [2-2,3-4,5-5]
% 17    [2-2,1-4,4-5]
% 17    [2-2,4-3,5-5]
% 17    [2-2,3-3,5-1]
% 17    [1-2,3-5,4-1]
% 17    [1-2,2-5,4-5]
% 17    [1-2,2-5,5-3]
% 17    [1-2,2-5,5-1]
% 17    [1-2,1-5,5-4]
% 17    [1-2,1-4,4-5]
% 17    [1-2,1-4,4-1]
% 17    [2-1,3-5,4-5]
% 17    [2-1,3-5,5-4]
% 17    [2-1,3-5,5-2]
% 17    [2-1,1-5,4-5]
% 17    [2-1,1-5,5-2]
% 17    [2-1,1-4,5-5]
% 17    [2-1,1-4,5-3]
% 17    [2-1,1-4,4-1]
% 17    [1-1,2-5,5-4]
% 17    [1-1,2-5,4-1]
% 17    [1-1,1-4,5-2]
% 16    [2-3,3-4,5-4]
% 16    [4-2,1-5,4-5]
% 16    [3-2,3-5,5-5]
% 16    [3-2,2-5,4-5]
% 16    [3-2,4-3,4-5]
% 16    [2-2,2-5,5-5]
% 16    [2-2,3-4,5-2]
% 16    [2-2,1-4,4-1]
% 16    [1-2,3-5,5-2]
% 16    [1-2,2-5,5-5]
% 16    [1-2,1-5,4-1]
% 16    [1-2,3-3,5-5]
% 16    [1-2,3-3,4-5]
% 16    [2-1,2-5,5-3]
% 16    [2-1,3-4,4-1]
% 16    [2-1,1-4,5-1]
% 16    [2-1,3-3,5-5]
% 16    [2-1,3-3,5-4]
% 16    [1-1,1-4,4-5]
% 16    [1-1,3-3,4-5]
% 16    [1-1,3-3,5-4]
% 15    [2-4,2-5,5-5]
% 15    [2-4,2-5,5-1]
% 15    [2-4,1-4,5-1]
% 15    [2-4,4-3,5-5]
% 15    [2-3,3-5,5-4]
% 15    [4-2,1-5,5-2]
% 15    [4-2,1-5,4-1]
% 15    [4-2,3-4,5-5]
% 15    [4-2,4-3,5-2]
% 15    [3-2,1-5,5-4]
% 15    [3-2,1-4,5-5]
% 15    [2-2,4-3,5-1]
% 15    [1-2,3-4,5-1]
% 15    [2-1,3-3,5-1]
% 15    [1-1,3-4,5-2]
% 15    [1-1,3-3,4-1]
% 14    [2-4,2-5,4-5]
% 14    [2-4,2-5,5-4]
% 14    [2-4,1-4,4-5]
% 14    [2-4,3-3,5-1]
% 14    [2-3,3-5,4-1]
% 14    [2-3,1-4,5-2]
% 14    [2-3,4-3,5-5]
% 14    [2-3,4-3,5-1]
% 14    [3-2,2-5,4-1]
% 14    [3-2,3-4,5-5]
% 14    [3-2,3-4,5-1]
% 14    [3-2,1-4,5-3]
% 14    [2-2,3-5,5-4]
% 14    [2-2,2-5,5-2]
% 14    [2-2,2-5,5-1]
% 14    [2-2,1-5,5-2]
% 14    [2-2,3-3,5-5]
% 14    [1-2,1-5,5-3]
% 14    [1-2,3-4,5-3]
% 14    [1-2,4-3,5-4]
% 14    [1-2,3-3,5-2]
% 14    [2-1,3-5,5-1]
% 14    [2-1,1-5,5-4]
% 14    [2-1,3-4,4-5]
% 14    [1-1,3-5,4-1]
% 14    [1-1,2-5,5-2]
% 14    [1-1,1-4,5-3]
% 13    [2-3,3-3,5-5]
% 13    [2-3,3-3,5-1]
% 13    [4-2,1-4,4-5]
% 13    [3-2,4-3,5-3]
% 13    [3-2,3-3,5-5]
% 13    [2-2,2-5,5-4]
% 12    [2-4,1-5,5-5]
% 12    [2-4,3-4,5-1]
% 12    [2-3,2-5,5-3]
% 12    [4-2,4-3,5-1]
% 12    [3-2,3-5,5-2]
% 12    [3-2,4-3,5-2]
% 12    [3-2,4-3,4-1]
% 12    [3-2,3-3,5-2]
% 12    [1-2,3-5,5-1]
% 12    [1-2,3-3,5-1]
% 12    [2-1,1-5,5-3]
% 12    [2-1,4-3,5-3]
% 12    [1-1,3-5,5-2]
% 12    [1-1,2-5,5-3]
% 12    [1-1,3-3,5-2]
% 11    [2-4,3-3,5-3]
% 11    [2-3,3-4,5-2]
% 11    [2-3,3-4,4-1]
% 11    [2-3,1-4,5-1]
% 11    [2-3,3-3,5-4]
% 11    [2-3,3-3,5-2]
% 11    [3-2,1-5,4-1]
% 11    [3-2,3-3,4-5]
% 11    [2-2,3-3,5-3]
% 11    [1-2,4-3,5-3]
% 11    [1-1,3-4,4-5]
% 11    [1-1,4-3,5-4]
% 10    [2-4,1-5,5-3]
% 10    [2-4,3-4,5-5]
% 10    [2-4,3-4,5-3]
% 10    [2-4,3-4,4-1]
% 10    [2-3,3-4,4-5]
% 10    [2-3,4-3,4-5]
% 10    [2-3,4-3,5-4]
% 10    [2-3,4-3,5-2]
% 10    [2-3,4-3,4-1]
% 10    [2-3,3-3,4-5]
% 10    [2-3,3-3,5-3]
% 10    [2-3,3-3,4-1]
% 10    [4-2,3-5,5-1]
% 10    [4-2,2-5,4-5]
% 10    [4-2,3-4,5-2]
% 10    [4-2,4-3,5-5]
% 10    [3-2,3-4,4-5]
% 10    [3-2,3-4,5-4]
% 10    [3-2,3-4,5-2]
% 10    [3-2,3-4,4-1]
% 10    [3-2,4-3,5-4]
% 10    [3-2,3-3,5-4]
% 10    [2-2,3-5,4-5]
% 10    [2-2,2-5,4-5]
% 10    [1-2,1-4,5-5]
% 10    [1-2,1-4,5-1]
% 10    [1-2,3-3,4-1]
% 10    [2-1,1-5,4-1]
% 10    [2-1,3-3,5-2]
% 10    [1-1,2-5,4-5]
% 10    [1-1,4-3,5-3]
% 9     [2-4,1-4,5-5]
% 9     [2-4,4-3,5-2]
% 9     [4-2,1-4,5-5]
% 9     [4-2,4-3,5-3]
% 9     [3-2,3-5,5-4]
% 9     [2-2,2-5,4-1]
% 9     [2-2,1-5,5-4]
% 9     [2-2,3-4,4-5]
% 9     [2-2,3-4,5-1]
% 9     [2-2,1-4,5-2]
% 9     [2-2,4-3,5-4]
% 8     [2-4,3-5,5-3]
% 8     [2-4,2-5,5-2]
% 8     [2-4,1-4,5-4]
% 8     [2-4,1-4,4-1]
% 8     [2-4,4-3,5-4]
% 8     [4-2,3-5,4-5]
% 8     [4-2,3-5,5-4]
% 8     [4-2,3-5,5-3]
% 8     [4-2,2-5,5-5]
% 8     [4-2,2-5,5-2]
% 8     [4-2,3-4,4-5]
% 8     [4-2,1-4,4-1]
% 8     [3-2,3-4,5-3]
% 8     [2-2,1-5,4-5]
% 8     [2-2,1-5,4-1]
% 8     [2-2,1-4,5-1]
% 8     [2-2,4-3,5-2]
% 8     [2-1,3-3,4-1]
% 7     [2-4,1-5,4-5]
% 7     [2-4,4-3,5-3]
% 7     [4-2,3-4,4-1]
% 7     [3-2,3-3,5-3]
% 7     [2-2,3-4,4-1]
% 7     [2-2,4-3,5-3]
% 7     [1-2,3-5,5-4]
% 6     [2-4,1-4,5-3]
% 6     [2-3,1-4,4-5]
% 6     [2-3,1-4,5-3]
% 6     [4-2,3-5,4-1]
% 6     [4-2,1-5,5-4]
% 6     [4-2,3-4,5-1]
% 6     [4-2,3-3,5-3]
% 6     [3-2,3-5,4-1]
% 6     [3-2,3-3,4-1]
% 6     [2-2,3-5,5-3]
% 6     [2-2,3-4,5-3]
% 6     [2-2,1-4,5-5]
% 6     [1-2,1-4,5-3]
% 6     [1-2,3-3,5-4]
% 6     [2-1,3-5,4-1]
% 6     [2-1,4-3,5-2]
% 6     [2-1,3-3,4-5]
% 5     [2-4,1-5,5-2]
% 5     [2-4,1-5,4-1]
% 5     [4-2,2-5,5-1]
% 5     [4-2,1-4,5-1]
% 5     [2-2,3-5,5-2]
% 5     [2-2,3-5,4-1]
% 5     [2-2,2-5,5-3]
% 5     [2-2,1-4,5-3]
% 5     [1-2,3-5,5-3]
% 5     [2-1,3-5,5-3]
% 5     [2-1,3-3,5-3]
% 4     [2-4,2-5,5-3]
% 4     [2-4,1-5,5-1]
% 4     [2-3,1-4,5-5]
% 4     [2-3,4-3,5-3]
% 4     [4-2,3-5,5-2]
% 4     [4-2,1-5,5-1]
% 4     [4-2,3-4,5-3]
% 4     [4-2,3-3,5-1]
% 4     [1-1,4-3,5-2]
% 3     [2-4,3-5,4-5]
% 3     [2-4,3-5,5-4]
% 3     [2-4,3-3,5-4]
% 3     [2-4,3-3,5-2]
% 3     [2-4,3-3,4-1]
% 3     [2-3,3-5,5-3]
% 3     [4-2,3-3,4-5]
% 3     [4-2,3-3,5-2]
% 3     [4-2,3-3,4-1]
% 3     [3-2,3-5,5-3]
% 3     [2-2,3-3,4-5]
% 3     [2-2,3-3,5-4]
% 3     [2-2,3-3,5-2]
% 3     [1-2,3-3,5-3]
% 2     [2-4,3-3,4-5]
% 2     [4-2,3-3,5-4]
% 2     [2-2,3-3,4-1]
% 1     [2-4,3-5,5-2]
% 1     [2-4,3-5,4-1]
% 1     [2-4,1-5,5-4]
% 1     [4-2,2-5,5-3]
% 1     [4-2,1-4,5-3]

% Taking one from each, this makes a nice graded set of 43 problems:

% 1.    [1-1,1-5,5-5]
% 2.    [4-2,1-5,5-5]
% 3.    [1-1,3-5,5-5]
% 4.    [1-2,1-5,5-5]
% 5.    [1-1,3-3,5-5]
% 6.    [3-2,1-5,5-5]
% 7.    [2-3,1-5,5-5]
% 8.    [2-1,1-5,5-5]
% 9.    [2-2,3-5,5-5]
% 10.   [4-2,3-5,5-5]
% 11.   [2-2,3-5,5-1]
% 12.   [3-2,1-4,5-4]
% 13.   [2-3,1-5,5-2]
% 14.   [1-1,3-3,5-1]
% 15.   [2-3,1-5,5-1]
% 16.   [2-3,2-5,5-5]
% 17.   [2-3,2-5,4-1]
% 18.   [2-3,1-5,4-5]
% 19.   [2-3,2-5,5-1]
% 20.   [2-3,2-5,5-4]
% 21.   [2-3,1-5,5-3]
% 22.   [2-4,3-5,5-5]
% 23.   [2-4,3-5,5-1]
% 24.   [2-3,3-5,4-5]
% 25.   [2-4,3-4,5-4]
% 26.   [2-4,3-4,4-5]
% 27.   [2-4,2-5,4-1]
% 28.   [2-3,3-4,5-4]
% 29.   [2-4,2-5,5-5]
% 30.   [2-4,2-5,4-5]
% 31.   [2-3,3-3,5-5]
% 32.   [2-4,1-5,5-5]
% 33.   [2-4,3-3,5-3]
% 34.   [2-4,1-5,5-3]
% 35.   [2-4,1-4,5-5]
% 36.   [2-4,3-5,5-3]
% 37.   [2-4,1-5,4-5]
% 38.   [2-4,1-4,5-3]
% 39.   [2-4,1-5,5-2]
% 40.   [2-4,2-5,5-3]
% 41.   [2-4,3-5,4-5]
% 42.   [2-4,3-3,4-5]
% 43.   [2-4,3-5,5-2]

% 5. How many different setups are there (not counting rotations and mirror images)?

rotate(X-Y, Y1-X) :- Y1 is 6 - Y.
flip(X-Y, Y-X).
rotations(P1, [P1,P2,P3,P4,P5,P6,P7,P8]) :-
rotate(P1, P3), rotate(P3, P5), rotate(P5, P7),
flip(P1, P2), flip(P3, P4), flip(P5, P6), flip(P7, P8).

normalize(S, X) :-
maplist(rotations, S, L),
inside_out(L, L1),
filter(L1, L2),
sort(L2, [X|_]).

inside_out([[]|_], []) :- !.
inside_out(Xss, [Xs|Yss]) :-
inside_out(Xss1, Yss).

filter([], []).
filter([X|Xs], [S|Ys]) :-
sort(X, X1),
setup(S), sort(S, X1),
!, filter(Xs, Ys).
filter([_|Xs], Ys) :- filter(Xs, Ys).

all_setups(X) :-
findall(S, setup(S), L),
maplist(normalize, L, L1),
sort(L1, X).

% ?- all_setups(X), length(X, N).
% N = 191.

% Combining the previous results,
% here's a complete set of graded problems:

% 1.      [1-1,1-5,5-1]
% 2.      [2-2,1-5,5-5]
% 3.      [1-1,3-5,5-5]
% 4.      [1-1,1-5,5-3]
% 5.      [1-1,1-4,5-1]
% 6.      [1-1,3-3,5-5]
% 7.      [1-1,3-4,5-1]
% 8.      [1-2,2-5,5-2]
% 9.      [1-1,4-3,5-1]
% 10.     [1-1,3-5,4-5]
% 11.     [1-1,1-5,5-2]
% 12.     [2-2,3-5,5-5]
% 13.     [4-2,3-5,5-5]
% 14.     [3-2,4-3,5-1]
% 15.     [2-2,1-5,5-3]
% 16.     [1-2,3-4,5-2]
% 17.     [2-2,1-5,5-1]
% 18.     [1-2,4-3,5-5]
% 19.     [1-1,3-3,5-1]
% 20.     [1-1,3-4,5-5]
% 21.     [1-1,1-4,5-4]
% 22.     [1-2,1-4,5-2]
% 23.     [1-1,4-3,4-1]
% 24.     [1-2,4-3,5-2]
% 25.     [1-2,3-4,5-4]
% 26.     [1-1,3-5,5-3]
% 27.     [2-3,3-4,5-5]
% 28.     [2-1,4-3,5-1]
% 29.     [1-1,3-5,5-4]
% 30.     [1-1,1-4,5-5]
% 31.     [1-2,4-3,5-1]
% 32.     [1-1,3-4,5-4]
% 33.     [1-2,4-3,4-1]
% 34.     [1-2,3-5,5-5]
% 35.     [1-2,3-4,5-5]
% 36.     [1-1,3-3,5-3]
% 37.     [3-2,3-5,4-5]
% 38.     [2-3,1-5,5-3]
% 39.     [2-4,3-5,5-5]
% 40.     [2-4,3-4,5-2]
% 41.     [2-3,3-5,5-5]
% 42.     [2-3,3-4,5-1]
% 43.     [2-1,4-3,4-1]
% 44.     [1-2,3-4,4-5]
% 45.     [1-2,2-5,4-1]
% 46.     [4-2,4-3,4-1]
% 47.     [2-4,3-5,5-1]
% 48.     [2-1,3-5,5-5]
% 49.     [1-2,4-3,4-5]
% 50.     [1-2,3-4,4-1]
% 51.     [1-1,3-4,4-1]
% 52.     [2-3,3-5,4-5]
% 53.     [2-2,1-4,5-4]
% 54.     [1-1,3-4,5-3]
% 55.     [2-4,3-4,5-4]
% 56.     [2-3,3-4,5-3]
% 57.     [2-2,3-4,5-4]
% 58.     [2-4,3-4,4-5]
% 59.     [2-2,4-3,4-1]
% 60.     [2-1,3-4,5-3]
% 61.     [1-2,3-5,4-5]
% 62.     [1-1,1-4,4-1]
% 63.     [3-2,3-3,5-1]
% 64.     [2-4,1-4,5-2]
% 65.     [2-2,3-4,5-5]
% 66.     [2-2,3-3,5-1]
% 67.     [2-2,1-4,4-5]
% 68.     [2-1,3-5,5-4]
% 69.     [2-1,3-5,4-5]
% 70.     [1-2,2-5,5-3]
% 71.     [1-2,1-4,4-1]
% 72.     [1-1,2-5,5-4]
% 73.     [1-1,1-4,5-2]
% 74.     [3-2,3-5,5-5]
% 75.     [2-3,3-4,5-4]
% 76.     [2-2,3-4,5-2]
% 77.     [2-2,2-5,5-5]
% 78.     [2-2,1-4,4-1]
% 79.     [2-1,3-4,4-1]
% 80.     [1-2,3-5,5-2]
% 81.     [1-2,3-3,4-5]
% 82.     [1-1,3-3,4-5]
% 83.     [1-1,1-4,4-5]
% 84.     [4-2,4-3,5-2]
% 85.     [2-4,2-5,5-5]
% 86.     [2-4,1-4,5-1]
% 87.     [2-3,3-5,5-4]
% 88.     [2-2,4-3,5-1]
% 89.     [1-1,3-4,5-2]
% 90.     [1-1,3-3,4-1]
% 91.     [2-4,2-5,5-4]
% 92.     [2-4,2-5,4-5]
% 93.     [2-4,1-4,4-5]
% 94.     [2-3,4-3,5-1]
% 95.     [2-2,3-5,5-4]
% 96.     [2-2,3-3,5-5]
% 97.     [2-2,2-5,5-2]
% 98.     [2-2,1-5,5-2]
% 99.     [1-2,4-3,5-4]
% 100.    [1-2,3-4,5-3]
% 101.    [1-2,3-3,5-2]
% 102.    [1-1,2-5,5-2]
% 103.    [1-1,1-4,5-3]
% 104.    [3-2,4-3,5-3]
% 105.    [2-3,3-3,5-1]
% 106.    [2-2,2-5,5-4]
% 107.    [4-2,4-3,5-1]
% 108.    [3-2,4-3,4-1]
% 109.    [3-2,3-3,5-2]
% 110.    [2-4,3-4,5-1]
% 111.    [2-4,1-5,5-5]
% 112.    [2-3,2-5,5-3]
% 113.    [2-1,4-3,5-3]
% 114.    [1-1,3-3,5-2]
% 115.    [1-1,2-5,5-3]
% 116.    [2-3,3-4,4-1]
% 117.    [2-3,3-3,5-2]
% 118.    [2-2,3-3,5-3]
% 119.    [1-2,4-3,5-3]
% 120.    [1-1,3-4,4-5]
% 121.    [4-2,3-4,5-2]
% 122.    [2-4,3-4,5-5]
% 123.    [2-4,3-4,5-3]
% 124.    [2-4,3-4,4-1]
% 125.    [2-4,1-5,5-3]
% 126.    [2-3,4-3,5-2]
% 127.    [2-3,4-3,4-1]
% 128.    [2-3,3-4,4-5]
% 129.    [2-3,3-3,5-3]
% 130.    [2-3,3-3,4-1]
% 131.    [2-2,3-5,4-5]
% 132.    [2-2,2-5,4-5]
% 133.    [1-2,3-3,4-1]
% 134.    [1-1,4-3,5-3]
% 135.    [1-1,2-5,4-5]
% 136.    [4-2,4-3,5-3]
% 137.    [3-2,3-5,5-4]
% 138.    [2-4,1-4,5-5]
% 139.    [2-2,3-4,5-1]
% 140.    [2-2,3-4,4-5]
% 141.    [2-2,1-5,5-4]
% 142.    [2-2,1-4,5-2]
% 143.    [4-2,3-5,5-4]
% 144.    [4-2,3-5,4-5]
% 145.    [3-2,3-4,5-3]
% 146.    [2-4,3-5,5-3]
% 147.    [2-4,1-4,5-4]
% 148.    [2-4,1-4,4-1]
% 149.    [2-2,4-3,5-2]
% 150.    [2-2,1-5,4-5]
% 151.    [2-2,1-4,5-1]
% 152.    [2-1,3-3,4-1]
% 153.    [4-2,3-4,4-1]
% 154.    [3-2,3-3,5-3]
% 155.    [2-4,1-5,4-5]
% 156.    [2-2,4-3,5-3]
% 157.    [2-2,3-4,4-1]
% 158.    [1-2,3-5,5-4]
% 159.    [4-2,3-4,5-1]
% 160.    [4-2,3-3,5-3]
% 161.    [3-2,3-3,4-1]
% 162.    [2-4,1-4,5-3]
% 163.    [2-3,1-4,5-3]
% 164.    [2-2,3-5,5-3]
% 165.    [2-2,3-4,5-3]
% 166.    [2-2,1-4,5-5]
% 167.    [2-1,4-3,5-2]
% 168.    [1-2,3-3,5-4]
% 169.    [1-2,1-4,5-3]
% 170.    [2-4,1-5,4-1]
% 171.    [2-2,2-5,5-3]
% 172.    [2-2,1-4,5-3]
% 173.    [2-1,3-3,5-3]
% 174.    [1-2,3-5,5-3]
% 175.    [4-2,3-4,5-3]
% 176.    [4-2,3-3,5-1]
% 177.    [2-4,2-5,5-3]
% 178.    [2-4,1-5,5-1]
% 179.    [2-3,4-3,5-3]
% 180.    [1-1,4-3,5-2]
% 181.    [4-2,3-3,4-1]
% 182.    [2-4,3-5,5-4]
% 183.    [2-4,3-5,4-5]
% 184.    [2-3,3-5,5-3]
% 185.    [2-2,3-3,5-2]
% 186.    [2-2,3-3,4-5]
% 187.    [1-2,3-3,5-3]
% 188.    [2-2,3-3,4-1]
% 189.    [2-4,3-5,5-2]
% 190.    [2-4,3-5,4-1]
% 191.    [2-4,1-5,5-4]