view 5-Erlang/day2.erl @ 101:1fae0cca1ef8

Reduce large maze to single width corridors This reduces the permutations for a x x x b x To one (two steps north) from four (two steps north; one east, two north, one west; one east, one north, one west, one north; and one north, one east, one north, one west). Longer corridors were worse! We would filter this in the "been here before via another path" but that's still a lot of lookups in lists, which is inefficient.
author IBBoard <dev@ibboard.co.uk>
date Sun, 14 Jul 2019 13:42:24 +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.