summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--erlang/double.erl5
-rw-r--r--erlang/keywords.erl6
-rw-r--r--erlang/shopping.erl4
-rw-r--r--erlang/ttt.erl39
4 files changed, 54 insertions, 0 deletions
diff --git a/erlang/double.erl b/erlang/double.erl
new file mode 100644
index 0000000..55d1f47
--- /dev/null
+++ b/erlang/double.erl
@@ -0,0 +1,5 @@
+-module(double).
+-export([double_all/1]).
+
+double_all([]) -> [];
+double_all([H|T]) -> [H+H | double_all(T)].
diff --git a/erlang/keywords.erl b/erlang/keywords.erl
new file mode 100644
index 0000000..ec0648f
--- /dev/null
+++ b/erlang/keywords.erl
@@ -0,0 +1,6 @@
+-module(keywords).
+-export([keywords/2]).
+
+keywords(_, []) -> nil;
+keywords(Key, [{Key,Value}|_]) -> Value;
+keywords(Key, [_|T]) -> keywords(Key, T).
diff --git a/erlang/shopping.erl b/erlang/shopping.erl
new file mode 100644
index 0000000..e1cc4f4
--- /dev/null
+++ b/erlang/shopping.erl
@@ -0,0 +1,4 @@
+-module(shopping).
+-export([shopping/1]).
+
+shopping(List) -> [{Item, Quant*Price} || {Item, Quant, Price} <- List].
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.