Mercurial > repos > other > SevenLanguagesInSevenWeeks
view 5-Erlang/day2.erl @ 93:39084e2b8744
Add a function for word-aware text wrapping
Potentially hugely inefficient because we iterate through the
string character by character, but then splitting it first and
iterating over words still needs to iterate over the string to
know where to split.
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Tue, 18 Jun 2019 21:05:00 +0100 |
parents | 41c7cd909218 |
children |
line wrap: on
line source
-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.