16:68f812e39f5a
Anton Shestakov <engored@ya.ru>, Wed, 26 Feb 2014 19:36:35 +0900
Count winning hands too.

previous change 14:ea71408f41b3

rps5.erl

Permissions: -rw-r--r--

Other formats: Feeds:
-module(rps5).
-export([
get_rules/0,
beats/1, test_beats/0,
loses/1, test_loses/0,
winning_hand/1, test_winning_hand/0]).
get_rules() -> [rock, paper, scissors, spock, lizard].
beats(rock) ->
[scissors, lizard];
beats(paper) ->
[spock, rock];
beats(scissors) ->
[lizard, paper];
beats(spock) ->
[rock, scissors];
beats(lizard) ->
[paper, spock].
loses(lizard) ->
[scissors, rock];
loses(spock) ->
[paper, lizard];
loses(scissors) ->
[rock, spock];
loses(paper) ->
[lizard, scissors];
loses(rock) ->
[spock, paper].
test_beats() ->
lists:foreach(
fun(H) ->
io:format("~w beats ~w.~n", [H, beats(H)])
end,
get_rules()).
test_loses() ->
lists:foreach(
fun(H) ->
io:format("~w loses to ~w.~n", [H, loses(H)])
end,
get_rules()).
% winner for 3 hands is:
% rock, rock, rock -> rock
% rock, paper, scissors -> undefined
% rock, paper, paper -> paper
% rock, rock, paper -> paper
winning_hand(Hands) ->
HSet = sets:from_list(Hands),
sets:fold(
fun(Hand, Acc) ->
Loses = loses(Hand),
case sets:is_disjoint(sets:from_list(Loses), HSet) of
true -> Hand;
false -> Acc
end
end, undefined, HSet).
test_winning_hand() ->
Exclude = fun(Hand) -> lists:delete(Hand, get_rules()) end,
Cases = [
[rock, rock, rock],
[rock, paper, scissors],
[rock, paper, paper],
[rock, rock, paper]
|lists:map(Exclude, get_rules())
],
lists:foreach(
fun(Hands) ->
Winner = winning_hand(Hands),
io:format("~w wins in ~w.~n", [Winner, Hands])
end,
Cases).