From 3d2d6e3a39e1dae20343702e22a30fc0e1a48eac Mon Sep 17 00:00:00 2001 From: Adam Millerchip Date: Tue, 1 Dec 2020 14:36:44 +0900 Subject: [PATCH] Day 1 Part 2 --- README.md | 2 +- day1/README | 19 +++++++++++++++++++ day1/day1part2.exs | 27 +++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 day1/day1part2.exs diff --git a/README.md b/README.md index 42dfb60..666324f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir. -image +image ## Strategy diff --git a/day1/README b/day1/README index 1f97bca..dd58507 100644 --- a/day1/README +++ b/day1/README @@ -1,6 +1,25 @@ Day 1 Notes +------ Part1: +------ $ elixir day1part1.exs 618 x 1402 = 866436 + +Thoughts: + +Avoid iterating seen elements by consuming the list, and comparing each list element only to the remaining +elements. + +------ +Part2: +------ + +$ elixir day1part2.exs +547 x 545 x 928 = 276650720 + +Thoughts: + +Use a comprehension over two versions of the remaining list to efficiently compare the three items. + diff --git a/day1/day1part2.exs b/day1/day1part2.exs new file mode 100644 index 0000000..ad0a73d --- /dev/null +++ b/day1/day1part2.exs @@ -0,0 +1,27 @@ +defmodule Day1Part2 do + def run do + {a, b, c} = + File.read!("input") + |> String.trim() + |> String.split("\n") + |> Enum.map(&String.to_integer/1) + |> find_2020() + + IO.puts("#{a} x #{b} x #{c} = #{a * b * c}") + end + + def find_2020([current | rest]) do + pair = + for i <- rest, j <- rest do + if current + i + j == 2020, do: {i, j}, else: nil + end + |> Enum.find(&match?({_, _}, &1)) + + case pair do + {a, b} -> {a, b, current} + nil -> find_2020(rest) + end + end +end + +Day1Part2.run()