Day 15 Parts 1 and 2
This commit is contained in:
parent
1318f63b25
commit
bbb8ba7251
3 changed files with 74 additions and 1 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir.
|
My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir.
|
||||||
|
|
||||||
<img width="978" alt="image" src="https://user-images.githubusercontent.com/498229/102170372-8c706900-3ed7-11eb-8bdd-3b0f28b95fde.png">
|
<img width="978" alt="image" src="https://user-images.githubusercontent.com/498229/102176995-f132c000-3ee5-11eb-9dc5-7eb450c4d68f.png">
|
||||||
|
|
||||||
## Strategy
|
## Strategy
|
||||||
|
|
||||||
|
|
43
day15/README
Normal file
43
day15/README
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
Day 15 Notes
|
||||||
|
|
||||||
|
+--------+
|
||||||
|
| Part 1 |
|
||||||
|
+--------+
|
||||||
|
|
||||||
|
$ elixir day15.exs 2020
|
||||||
|
253
|
||||||
|
|
||||||
|
Thoughts:
|
||||||
|
|
||||||
|
Separate function to set the initial state.
|
||||||
|
Store the last two round numbers for each answer.
|
||||||
|
If it's the first time, store the same round number twice, which results in 0
|
||||||
|
when subtracted.
|
||||||
|
|
||||||
|
|
||||||
|
+--------+
|
||||||
|
| Part 2 |
|
||||||
|
+--------+
|
||||||
|
|
||||||
|
$ elixir day15.exs 30000000
|
||||||
|
13710
|
||||||
|
|
||||||
|
Thoughts:
|
||||||
|
|
||||||
|
I'm not sure if this was supposed to be brute-forcible.
|
||||||
|
|
||||||
|
I think it is and that I designed the algorithm efficiently in the first part.
|
||||||
|
The answer is a bit slow, but that's probably due to all the map updates. Using
|
||||||
|
a more efficient data structure would probably speed it up - guessing this is
|
||||||
|
faster in mutable languages.
|
||||||
|
|
||||||
|
Anyway, no code changes here, so for this excercise I decided to combine the
|
||||||
|
two answers, and just specify the last round via the command-line.
|
||||||
|
|
||||||
|
|
||||||
|
+------------------+
|
||||||
|
| Overall Thoughts |
|
||||||
|
+------------------+
|
||||||
|
|
||||||
|
Did this one pretty quickly. May even have time to go back to day 13 and learn
|
||||||
|
about the Chinese Remainder Theorem...
|
30
day15/day15.exs
Normal file
30
day15/day15.exs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
defmodule Day15Part1 do
|
||||||
|
@input [18, 8, 0, 5, 4, 1, 20]
|
||||||
|
|
||||||
|
def run do
|
||||||
|
[stop] = System.argv()
|
||||||
|
|
||||||
|
start(@input, nil, 1, String.to_integer(stop), %{})
|
||||||
|
|> IO.puts()
|
||||||
|
end
|
||||||
|
|
||||||
|
def start([], last, round, stop, state), do: play(last, round, stop, state)
|
||||||
|
|
||||||
|
def start([num | rest], _last, round, stop, state) do
|
||||||
|
start(rest, num, round + 1, stop, Map.put(state, num, {round, round}))
|
||||||
|
end
|
||||||
|
|
||||||
|
def play(num, stop, stop, state) do
|
||||||
|
{a, b} = state[num]
|
||||||
|
b - a
|
||||||
|
end
|
||||||
|
|
||||||
|
def play(num, round, stop, state) do
|
||||||
|
{a, b} = state[num]
|
||||||
|
say = b - a
|
||||||
|
state = Map.update(state, say, {round, round}, fn {_a, b} -> {b, round} end)
|
||||||
|
play(say, round + 1, stop, state)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Day15Part1.run()
|
Loading…
Reference in a new issue