summaryrefslogtreecommitdiff
path: root/erlang/ttt.erl
blob: 0be7890d72a66d860f8aeb251f5c63c4b78e613a (plain) (blame)
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.