summaryrefslogtreecommitdiff
path: root/erlang/ttt.erl
diff options
context:
space:
mode:
authorGuillermo Ramos2012-05-09 15:45:31 +0200
committerGuillermo Ramos2012-05-09 15:45:31 +0200
commit67a898893884f229d64886a220ba422dd0d66e78 (patch)
tree58cd598350c081acd5ccb508211c670011995dae /erlang/ttt.erl
parent8172bdd6bdc9523ebde5dd8c1022e971c0299ada (diff)
download7l-67a898893884f229d64886a220ba422dd0d66e78.tar.gz
[Erlang] Día 2
Diffstat (limited to 'erlang/ttt.erl')
-rw-r--r--erlang/ttt.erl39
1 files changed, 39 insertions, 0 deletions
diff --git a/erlang/ttt.erl b/erlang/ttt.erl
new file mode 100644
index 0000000..0be7890
--- /dev/null
+++ b/erlang/ttt.erl
@@ -0,0 +1,39 @@
+-module(ttt).
+-export([ttt/1]).
+
+isPlayer(x) -> true;
+isPlayer(o) -> true;
+isPlayer(_) -> false.
+
+winner(Board) ->
+ IsSamePlayer = fun(L) ->
+ case L of
+ [P,P,P] -> isPlayer(P);
+ _ -> false
+ end
+ end,
+
+ Scheme = lists:zip3([1,1,1,2,2,2,3,3,3], [1,2,3,1,2,3,1,2,3], Board),
+ Rows = lists:map(
+ fun(Idx) -> [Val || {Row,_,Val} <- Scheme, Row == Idx] end,
+ [1,2,3]),
+ Cols = lists:map(
+ fun(Idx) -> [Val || {_,Col,Val} <- Scheme, Col == Idx] end,
+ [1,2,3]),
+ Diags = [[Val || {Row,Col,Val} <- Scheme, Row == Col],
+ [Val || {Row,Col,Val} <- Scheme, Row+Col == 4]],
+ Winner = lists:filter(IsSamePlayer, lists:concat([Rows, Cols, Diags])),
+ case Winner of
+ [] -> no;
+ [[W,W,W]] -> W;
+ _ -> error
+ end.
+
+ttt(Board) ->
+ Winner = winner(Board),
+ SpacesLeft = lists:any(fun(C) -> C == sp end, Board),
+ if
+ Winner /= no -> Winner;
+ SpacesLeft -> no_winner;
+ true -> cat
+ end.