Skip to content

Instantly share code, notes, and snippets.

@maruks
Created December 1, 2015 15:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maruks/9a81ef728e00f1782e31 to your computer and use it in GitHub Desktop.
Save maruks/9a81ef728e00f1782e31 to your computer and use it in GitHub Desktop.
London Code Dojo 34
-module(dojo).
-import(lists,[nth/2,split/2,delete/2]).
-compile([export_all]).
deck() ->
[ {Rank, Suit} || Suit <- [hearts, spades, clubs, diamonds] , Rank <- [ace, king, queen, jack, 10, 9 ,8 ,7 , 6, 5 ,4 ,3 ,2] ].
shuffle([]) ->
[];
shuffle(Xs) ->
Elem = nth(rand:uniform(length(Xs)), Xs),
[Elem | shuffle(delete(Elem, Xs))].
split_all([N | Ns], Xs) ->
{First , Rest} = split(N, Xs),
[First | split_all(Ns, Rest)];
split_all(_, Xs) ->
[Xs].
deal(Deck) ->
list_to_tuple(split_all([1,2,3,4,5,6,7,1], Deck) ++ [[]] ++ [[]] ++ [[]] ++ [[]]).
move(From, To, Board) ->
[F | R] = element(From, Board),
Dest = element(To, Board),
D1 = setelement(To, Board, [F | Dest]),
setelement(From, D1, R).
-module(dojo_tests).
-include_lib("eunit/include/eunit.hrl").
deck_has_52_cards_test() ->
?assert(52 == length(dojo:deck())).
deck_can_be_shuffled_test() ->
Unshuffled_deck = dojo:deck(),
Shuffled_deck = dojo:shuffle(dojo:deck()),
?assert(Unshuffled_deck =/= Shuffled_deck).
shuffled_deck_still_has_52_cards_test() ->
?assert(52 == length(dojo:shuffle(dojo:deck()))).
deal_creates_13_piles_test() ->
?assert(13 == tuple_size(dojo:deal(dojo:deck()))).
can_put_ace_on_empty_destination_slot_test() ->
Start_State = dojo:deal(dojo:deck()),
Game = dojo:move(1, 13, Start_State),
?assert(0 == length(element(1, Game))),
?assert(1 == length(element(13, Game))).
%% can_not_put_non_ace_on_empty_destination_slot_test() ->
%% Start_State = dojo:deal(dojo:deck()),
%% Game = dojo:move(2, 13, Start_State),
%% ?assert(2 == length(element(2, Game))),
%% ?assert(0 == length(element(13, Game))).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment