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.