Set puzzle: Difference between revisions

Content added Content deleted
(Added Erlang)
m (Better deck/0)
Line 307: Line 307:
-module( set ).
-module( set ).


-export( [deck/0, is_set/3, task/0] ).
-export( [deck/0, is_set/3, shuffle_deck/1, task/0] ).


-record( card, {number, symbol, shading, colour} ).
-record( card, {number, symbol, shading, colour} ).


deck() -> [#card{number=N, symbol=Sy, shading=Sh, colour=C} || N <- [1,2,3], Sy <- [diamond, squiggle, oval], Sh <- [solid, striped, open], C <- [red, green, purple]].
deck() ->
Sorted = [#card{number=N, symbol=Sy, shading=Sh, colour=C} || N <- [1,2,3], Sy <- [diamond, squiggle, oval], Sh <- [solid, striped, open], C <- [red, green, purple]],
knuth_shuffle:list( Sorted ).


is_set( Card1, Card2, Card3 ) ->
is_set( Card1, Card2, Card3 ) ->
Line 320: Line 318:
andalso is_shading_correct( Card1, Card2, Card3 )
andalso is_shading_correct( Card1, Card2, Card3 )
andalso is_symbol_correct( Card1, Card2, Card3 ).
andalso is_symbol_correct( Card1, Card2, Card3 ).

shuffle_deck( Deck ) -> knuth_shuffle:list( Deck ).


task() ->
task() ->
Line 332: Line 332:


common( X, Y ) ->
common( X, Y ) ->
{Sets, Cards} = find_x_sets_in_y_cards( X, Y ),
{Sets, Cards} = find_x_sets_in_y_cards( X, Y, deck() ),
io:fwrite( "Cards ~p~n", [Cards] ),
io:fwrite( "Cards ~p~n", [Cards] ),
io:fwrite( "Gives sets:~n" ),
io:fwrite( "Gives sets:~n" ),
[io:fwrite( "~p~n", [S] ) || S <- Sets].
[io:fwrite( "~p~n", [S] ) || S <- Sets].


find_x_sets_in_y_cards( X, Y ) ->
find_x_sets_in_y_cards( X, Y, Deck ) ->
{Cards, _T} = lists:split( Y, shuffle_deck(Deck) ),
Deck = deck(),
{Cards, _T} = lists:split( Y, Deck ),
find_x_sets_in_y_cards( X, Y, Cards, make_sets1(Cards, []) ).
find_x_sets_in_y_cards( X, Y, Cards, make_sets1(Cards, []) ).


find_x_sets_in_y_cards( X, _Y, Cards, Sets ) when erlang:length(Sets) =:= X -> {Sets, Cards};
find_x_sets_in_y_cards( X, _Y, _Deck, Cards, Sets ) when erlang:length(Sets) =:= X -> {Sets, Cards};
find_x_sets_in_y_cards( X, Y, _Cards, _Sets ) -> find_x_sets_in_y_cards( X, Y ).
find_x_sets_in_y_cards( X, Y, Deck, _Cards, _Sets ) -> find_x_sets_in_y_cards( X, Y, Deck ).


is_colour_correct( Card1, Card2, Card3 ) -> is_colour_different( Card1, Card2, Card3 ) orelse is_colour_same( Card1, Card2, Card3 ).
is_colour_correct( Card1, Card2, Card3 ) -> is_colour_different( Card1, Card2, Card3 ) orelse is_colour_same( Card1, Card2, Card3 ).