# HG changeset patch # User IBBoard # Date 1517687608 0 # Node ID 41c7cd90921893ca974ed2f2485bdafff5c4d238 # Parent 74976fddd25f35ed1fa7aa26323959ee0acec2e6 Write up exercises for Erlang day 2 (including bonus Tic Tac Toe) diff -r 74976fddd25f -r 41c7cd909218 5-Erlang/day2.erl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/5-Erlang/day2.erl Sat Feb 03 19:53:28 2018 +0000 @@ -0,0 +1,58 @@ +-module(day2). +-export([find_tuple/2]). +-export([calc_prices/1]). +-export([score_tictactoe/1]). +-export([has_won/2]). + +% Do a more Erlang-esque "crash if not matched" behaviour rather than an atom of "undefined" or "null" +find_tuple([{Key, Value}|_], Key) -> Value; +find_tuple([{_,_}|Tail], Key) -> find_tuple(Tail, Key). + +calc_prices(ProductList) -> [{Item, Quantity * Price} || {Item, Quantity, Price} <- ProductList]. + +has_won(Board, P) -> + case Board of + { P, P, P, + _, _, _, + _, _, _ } -> true; + + { _, _, _, + P, P, P, + _, _, _ } -> true; + + { _, _, _, + _, _, _, + P, P, P } -> true; + + { P, _, _, + P, _, _, + P, _, _ } -> true; + + { _, P, _, + _, P, _, + _, P, _ } -> true; + + { _, _, P, + _, _, P, + _, _, P } -> true; + + { P, _, _, + _, P, _, + _, _, P } -> true; + + { _, _, P, + _, P, _, + P, _, _ } -> true; + + _ -> false + end. + +score_tictactoe(Board) -> + State = { has_won(Board, x), has_won(Board, o), lists:any(fun(Val) -> Val == b end, tuple_to_list(Board)) }, + case State of + { true, false, _ } -> x; + { false, true, _ } -> o; + { _, _, true } -> no_winner; + { false, false, false } -> cat + % And { true, true, false } exceptions as it is invalid + end. \ No newline at end of file