Mercurial > repos > other > SevenLanguagesInSevenWeeks
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.