From 1445104f24b5ca3ab15bae211a29212154ceef23 Mon Sep 17 00:00:00 2001 From: Andrew Coleman Date: Fri, 15 Dec 2017 00:49:58 -0500 Subject: [PATCH] day15 solution --- day15/Makefile | 8 ++++++++ day15/day15.erl | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 day15/Makefile create mode 100644 day15/day15.erl diff --git a/day15/Makefile b/day15/Makefile new file mode 100644 index 0000000..a4ad01b --- /dev/null +++ b/day15/Makefile @@ -0,0 +1,8 @@ +all: day15.beam + erl -noshell -s day15 start -s init stop + +day15.beam: + erlc day15.erl + +clean: + rm -f day15.beam diff --git a/day15/day15.erl b/day15/day15.erl new file mode 100644 index 0000000..c0d394c --- /dev/null +++ b/day15/day15.erl @@ -0,0 +1,43 @@ +-module(day15). +-export([start/0]). + +gen_a_value(Val) + -> (Val * 16807) rem 2147483647. + +gen_b_value(Val) + -> (Val * 48271) rem 2147483647. + +gen_a_value2(Val) + -> Result = (Val * 16807) rem 2147483647, + if Result rem 4 == 0 -> Result; + true -> gen_a_value2(Result) + end. + +gen_b_value2(Val) + -> Result = (Val * 48271) rem 2147483647, + if Result rem 8 == 0 -> Result; + true -> gen_b_value2(Result) + end. + +lower_16_matches(ValA, ValB) + -> PaddedValA = <>, + PaddedValB = <>, + <<_A:16,B:16>> = PaddedValA, + <<_C:16,D:16>> = PaddedValB, + B == D. + +judge_matches(Start, _GenA, _GenB, MatchCount, _GenAFun, _GenBFun) + when Start == 0 -> MatchCount; +judge_matches(Start, GenA, GenB, MatchCount, GenAFun, GenBFun) + -> GenAResult = GenAFun(GenA), + GenBResult = GenBFun(GenB), + Match = lower_16_matches(GenAResult, GenBResult), + if Match -> judge_matches(Start - 1, GenAResult, GenBResult, MatchCount + 1, GenAFun, GenBFun); + true -> judge_matches(Start - 1, GenAResult, GenBResult, MatchCount, GenAFun, GenBFun) + end. + +start() + -> io:fwrite("~p~n", [judge_matches(40000000, 65, 8921, 0, fun gen_a_value/1, fun gen_b_value/1)]), + io:fwrite("~p~n", [judge_matches(40000000, 703, 516, 0, fun gen_a_value/1, fun gen_b_value/1)]), + io:fwrite("~p~n", [judge_matches(5000000, 65, 8921, 0, fun gen_a_value2/1, fun gen_b_value2/1)]), + io:fwrite("~p~n", [judge_matches(5000000, 703, 516, 0, fun gen_a_value2/1, fun gen_b_value2/1)]).