1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.
|