Solve triangle solitaire puzzle: Difference between revisions

Content added Content deleted
(→‎{{header|Racket}}: actual implementation added)
Line 171: Line 171:
Solved</pre>
Solved</pre>


=={{header|Prolog}}==
Works with SWI-Prolog and module(lambda).

<lang Prolog>:- use_module(library(lambda)).

iq_puzzle :-
iq_puzzle(Moves),
display(Moves).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% compute solution
%
iq_puzzle(Moves) :-
play([1], [2,3,4,5,6,7,8,9,10,11,12,13,14,15], [], Moves).

play(_, [_], Lst, Moves) :-
reverse(Lst, Moves).

play(Free, Occupied, Lst, Moves) :-
select(S, Occupied, Oc1),
select(O, Oc1, Oc2),
select(E, Free, F1),
move(S, O, E),
play([S, O | F1], [E | Oc2], [move(S,O,E) | Lst], Moves).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% allowed moves
%
move(S,2,E) :-
member([S,E], [[1,4], [4,1]]).
move(S,3,E) :-
member([S,E], [[1,6], [6,1]]).
move(S,4,E):-
member([S,E], [[2,7], [7,2]]).
move(S,5,E):-
member([S,E], [[2,9], [9,2]]).
move(S,5,E):-
member([S,E], [[3,8], [8,3]]).
move(S,6,E):-
member([S,E], [[3,10], [10,3]]).
move(S,5,E):-
member([S,E], [[4,6], [6,4]]).
move(S,7,E):-
member([S,E], [[4,11], [11,4]]).
move(S,8,E):-
member([S,E], [[4,13], [13,4]]).
move(S,8,E):-
member([S,E], [[5,12], [12,5]]).
move(S,9,E):-
member([S,E], [[5,14], [14,5]]).
move(S,9,E):-
member([S,E], [[6,13], [13,6]]).
move(S,10,E):-
member([S,E], [[6,15], [15,6]]).
move(S,8,E):-
member([S,E], [[9,7], [7,9]]).
move(S,9,E):-
member([S,E], [[10,8], [8,10]]).
move(S,12,E):-
member([S,E], [[11,13], [13,11]]).
move(S,13,E):-
member([S,E], [[12,14], [14,12]]).
move(S,14,E):-
member([S,E], [[15,13], [13,15]]).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display soluce
%
display(Sol) :-
display(Sol, [1]).

display([], Free) :-
numlist(1,15, Lst),
maplist(\X^I^(member(X, Free) -> I = 0; I = 1),
Lst,
[I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15]),
format(' ~w ~n', [I1]),
format(' ~w ~w ~n', [I2,I3]),
format(' ~w ~w ~w ~n', [I4,I5,I6]),
format(' ~w ~w ~w ~w ~n', [I7,I8,I9,I10]),
format('~w ~w ~w ~w ~w~n', [I11,I12,I13,I14,I15]),
writeln(solved).


display([move(Start, Middle, End) | Tail], Free) :-
numlist(1,15, Lst),
maplist(\X^I^(member(X, Free) -> I = 0; I = 1),
Lst,
[I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15]),
format(' ~w ~n', [I1]),
format(' ~w ~w ~n', [I2,I3]),
format(' ~w ~w ~w ~n', [I4,I5,I6]),
format(' ~w ~w ~w ~w ~n', [I7,I8,I9,I10]),
format('~w ~w ~w ~w ~w~n', [I11,I12,I13,I14,I15]),
format('From ~w to ~w over ~w~n~n~n', [Start, End, Middle]),
select(End, Free, F1),
display(Tail, [Start, Middle | F1]).
</lang>
Output :
<pre> ?- iq_puzzle.
0
1 1
1 1 1
1 1 1 1
1 1 1 1 1
From 4 to 1 over 2


1
0 1
0 1 1
1 1 1 1
1 1 1 1 1
From 6 to 4 over 5


1
0 1
1 0 0
1 1 1 1
1 1 1 1 1
From 1 to 6 over 3


0
0 0
1 0 1
1 1 1 1
1 1 1 1 1
From 7 to 2 over 4


0
1 0
0 0 1
0 1 1 1
1 1 1 1 1
From 10 to 3 over 6


0
1 1
0 0 0
0 1 1 0
1 1 1 1 1
From 12 to 5 over 8


0
1 1
0 1 0
0 0 1 0
1 0 1 1 1
From 13 to 6 over 9


0
1 1
0 1 1
0 0 0 0
1 0 0 1 1
From 3 to 10 over 6


0
1 0
0 1 0
0 0 0 1
1 0 0 1 1
From 2 to 9 over 5


0
0 0
0 0 0
0 0 1 1
1 0 0 1 1
From 15 to 6 over 10


0
0 0
0 0 1
0 0 1 0
1 0 0 1 0
From 6 to 13 over 9


0
0 0
0 0 0
0 0 0 0
1 0 1 1 0
From 14 to 12 over 13


0
0 0
0 0 0
0 0 0 0
1 1 0 0 0
From 11 to 13 over 12


0
0 0
0 0 0
0 0 0 0
0 0 1 0 0
solved
</pre>
Bonus : number of solutions :
<pre> ?- setof(L, iq_puzzle(L), LL), length(LL, Len).
LL = [[move(4, 2, 1), move(6, 5, 4), move(1, 3, 6), move(7, 4, 2), move(10, 6, 3), move(12, 8, 5), move(13, 9, 6), move(..., ..., ...)|...], [move(4, 2, 1), move(6, 5, 4), move(1, 3, 6), move(7, 4, 2), move(10, 6, 3), move(12, 8, 5), move(..., ..., ...)|...], [move(4, 2, 1), move(6, 5, 4), move(1, 3, 6), move(7, 4, 2), move(10, 6, 3), move(..., ..., ...)|...], [move(4, 2, 1), move(6, 5, 4), move(1, 3, 6), move(7, 4, 2), move(..., ..., ...)|...], [move(4, 2, 1), move(6, 5, 4), move(1, 3, 6), move(..., ..., ...)|...], [move(4, 2, 1), move(6, 5, 4), move(..., ..., ...)|...], [move(4, 2, 1), move(..., ..., ...)|...], [move(..., ..., ...)|...], [...|...]|...],
Len = 29760.

</pre>
=={{header|Python}}==
=={{header|Python}}==