-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.