diff options
Diffstat (limited to 'erlang/ttt.erl')
-rw-r--r-- | erlang/ttt.erl | 39 |
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. |