Set puzzle: Difference between revisions

Content added Content deleted
(Added C#)
(Added Prolog)
Line 3,063: Line 3,063:
6: purple squiggle three solid
6: purple squiggle three solid
8: red diamond two open
8: red diamond two open
</pre>

=={{header|Prolog}}==

<lang Prolog>do_it(N) :-
card_sets(N, Cards, Sets),
!,
format('Cards: ~n'),
maplist(print_card, Cards),
format('~nSets: ~n'),
maplist(print_set, Sets).
print_card(Card) :- format(' ~p ~p ~p ~p~n', Card).
print_set(Set) :- maplist(print_card, Set), nl.

n(9,3).
n(12,4).

card_sets(N, Cards, Sets) :-
n(N,L),
repeat,
random_deal(N, Cards),
setof(Set, is_card_set(Cards, Set), Sets),
length(Sets, L).

random_card([C,S,N,Sh]) :-
random_member(C, [red, green, purple]),
random_member(S, [oval, squiggle, diamond]),
random_member(N, [one, two, three]),
random_member(Sh, [solid, open, striped]).
random_deal(N, Cards) :-
length(Cards, N),
maplist(random_card, Cards).
is_card_set(Cards, Result) :-
select(C1, Cards, Rest),
select(C2, Rest, Rest2),
select(C3, Rest2, _),
match(C1, C2, C3),
sort([C1,C2,C3], Result).
match([],[],[]).
match([A|T1],[A|T2],[A|T3]) :-
match(T1,T2,T3).
match([A|T1],[B|T2],[C|T3]) :-
dif(A,B), dif(B,C), dif(A,C),
match(T1,T2,T3).</lang>
{{out}}
<pre>
?- do_it(9).
Cards:
purple oval one striped
purple squiggle three open
purple oval three open
green diamond three open
red oval three striped
red diamond one open
red squiggle two solid
red squiggle one open
green squiggle one striped

Sets:
green diamond three open
purple oval one striped
red squiggle two solid

green squiggle one striped
purple squiggle three open
red squiggle two solid

red diamond one open
red oval three striped
red squiggle two solid

true.

?- do_it(12).
Cards:
red diamond three solid
green diamond three solid
purple squiggle three striped
purple squiggle two open
red squiggle one open
green oval three open
green diamond three striped
red oval two solid
red diamond one solid
green oval two solid
purple squiggle one solid
red diamond one striped

Sets:
green diamond three solid
purple squiggle one solid
red oval two solid

green oval three open
purple squiggle three striped
red diamond three solid

green oval two solid
purple squiggle one solid
red diamond three solid

purple squiggle one solid
purple squiggle three striped
purple squiggle two open

true.
</pre>
</pre>