Day 10 Part 2
This commit is contained in:
parent
a5b418cd44
commit
c5745fbaaa
5 changed files with 170 additions and 12 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="975" alt="image" src="https://user-images.githubusercontent.com/498229/101746064-b0663000-3b0e-11eb-81bd-92597dba329e.png">
|
<img width="975" alt="image" src="https://user-images.githubusercontent.com/498229/101786711-97c33d80-3b41-11eb-831a-d6a9b3670f30.png">
|
||||||
|
|
||||||
## Strategy
|
## Strategy
|
||||||
|
|
||||||
|
|
42
day10/README
42
day10/README
|
@ -5,7 +5,7 @@ Day 10 Notes
|
||||||
+--------+
|
+--------+
|
||||||
|
|
||||||
$ elixir day10part1.exs
|
$ elixir day10part1.exs
|
||||||
**solved - will add answer after part 2 is complete**
|
2450
|
||||||
|
|
||||||
Thoughts:
|
Thoughts:
|
||||||
|
|
||||||
|
@ -15,23 +15,47 @@ implementing exactly what the instructions say.
|
||||||
In this case, we just need to sort the data, and compute the difference between all the pairs.
|
In this case, we just need to sort the data, and compute the difference between all the pairs.
|
||||||
|
|
||||||
|
|
||||||
+-------------------+
|
+--------+
|
||||||
| Part 2 [UNSOLVED] |
|
| Part 2 |
|
||||||
+-------------------+
|
+--------+
|
||||||
|
|
||||||
$ elixir day10part2.exs
|
$ elixir day10part2.exs
|
||||||
...
|
32396521357312
|
||||||
|
|
||||||
Thoughts:
|
Thoughts:
|
||||||
|
|
||||||
So far defeated on this one. I'm obviously missing a fundamental trick.
|
Fudge me this took me a long time (hours, including a walk in the park...)
|
||||||
|
|
||||||
I went down a massive rabbit hold calculating combinations, which didn't pay off.
|
I spent far too long trying to find a mathematical answer based on combinations, and went down
|
||||||
Will leave this for now, and maybe come back to it later.
|
another rabbit hole identifying the "removable" items and then trying to calculate the answer
|
||||||
|
based on that information.
|
||||||
|
|
||||||
|
Turns out the trick I was missing is graph theory.
|
||||||
|
|
||||||
|
Finally, after drawing out the example on paper, I realised that the number of combinations
|
||||||
|
forms a directed graph, where the weight of each node inherits the weight of all its parents.
|
||||||
|
For the example case (excuse my ascii drawing skills):
|
||||||
|
|
||||||
|
0(1)-1(1)-4(1)-5(1)-|
|
||||||
|
| ` | |
|
||||||
|
|---6(2) |
|
||||||
|
| | |
|
||||||
|
|---7(4)-|
|
||||||
|
|
|
||||||
|
10(4)-11(4)
|
||||||
|
` |
|
||||||
|
12(8)-18(8)-19(8)
|
||||||
|
|
||||||
|
So just need to make an algorithm that builds this graph, by iterating the sorted list
|
||||||
|
and checking the next 3 elements, keeping track of the weights as we go. It's actually simpler
|
||||||
|
than that, because we don't need to keep the connections around, just the weightings for each node.
|
||||||
|
|
||||||
|
Finally, the weight of the max joltage adapter is the answer.
|
||||||
|
|
||||||
+------------------+
|
+------------------+
|
||||||
| Overall Thoughts |
|
| Overall Thoughts |
|
||||||
+------------------+
|
+------------------+
|
||||||
|
|
||||||
Not committing the input for now, in case somebody decides to @ me my answer or something.
|
Part 1 was very easy, part 2 was fiendish. Glad this wasn't an interview question. Sometimes my
|
||||||
|
brain just doesn't process certain types of problem. This was one of them. Once I made the
|
||||||
|
connection to a weighted graph it was fine.
|
||||||
|
|
31
day10/day10part2.exs
Normal file
31
day10/day10part2.exs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
defmodule Day10Part2 do
|
||||||
|
def run do
|
||||||
|
File.read!("input")
|
||||||
|
|> String.split("\n", trim: true)
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
|> count_arrangements()
|
||||||
|
|> IO.puts()
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_arrangements(list), do: count_arrangements(%{0 => 1}, [0 | Enum.sort(list)])
|
||||||
|
|
||||||
|
def count_arrangements(arrs_to, [last]), do: arrs_to[last]
|
||||||
|
|
||||||
|
def count_arrangements(arrs_to, [current | rest]) do
|
||||||
|
rest
|
||||||
|
|> Enum.take(3)
|
||||||
|
|> count_reachable(current, arrs_to)
|
||||||
|
|> count_arrangements(rest)
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_reachable([], _a, arrs_to), do: arrs_to
|
||||||
|
|
||||||
|
def count_reachable([b | rest], a, arrs_to) when b - a <= 3 do
|
||||||
|
arrs_to = Map.update(arrs_to, b, arrs_to[a], &(&1 + arrs_to[a]))
|
||||||
|
count_reachable(rest, a, arrs_to)
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_reachable([_b | rest], a, arrs_to), do: count_reachable(rest, a, arrs_to)
|
||||||
|
end
|
||||||
|
|
||||||
|
Day10Part2.run()
|
104
day10/input
Normal file
104
day10/input
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
2
|
||||||
|
49
|
||||||
|
78
|
||||||
|
116
|
||||||
|
143
|
||||||
|
42
|
||||||
|
142
|
||||||
|
87
|
||||||
|
132
|
||||||
|
86
|
||||||
|
67
|
||||||
|
44
|
||||||
|
136
|
||||||
|
82
|
||||||
|
125
|
||||||
|
1
|
||||||
|
108
|
||||||
|
123
|
||||||
|
46
|
||||||
|
37
|
||||||
|
137
|
||||||
|
148
|
||||||
|
106
|
||||||
|
121
|
||||||
|
10
|
||||||
|
64
|
||||||
|
165
|
||||||
|
17
|
||||||
|
102
|
||||||
|
156
|
||||||
|
22
|
||||||
|
117
|
||||||
|
31
|
||||||
|
38
|
||||||
|
24
|
||||||
|
69
|
||||||
|
131
|
||||||
|
144
|
||||||
|
162
|
||||||
|
63
|
||||||
|
171
|
||||||
|
153
|
||||||
|
90
|
||||||
|
9
|
||||||
|
107
|
||||||
|
79
|
||||||
|
7
|
||||||
|
55
|
||||||
|
138
|
||||||
|
34
|
||||||
|
52
|
||||||
|
77
|
||||||
|
152
|
||||||
|
3
|
||||||
|
158
|
||||||
|
100
|
||||||
|
45
|
||||||
|
129
|
||||||
|
130
|
||||||
|
135
|
||||||
|
23
|
||||||
|
93
|
||||||
|
96
|
||||||
|
103
|
||||||
|
124
|
||||||
|
95
|
||||||
|
8
|
||||||
|
62
|
||||||
|
39
|
||||||
|
118
|
||||||
|
164
|
||||||
|
172
|
||||||
|
75
|
||||||
|
122
|
||||||
|
20
|
||||||
|
145
|
||||||
|
14
|
||||||
|
112
|
||||||
|
61
|
||||||
|
43
|
||||||
|
141
|
||||||
|
30
|
||||||
|
85
|
||||||
|
101
|
||||||
|
151
|
||||||
|
29
|
||||||
|
113
|
||||||
|
94
|
||||||
|
68
|
||||||
|
58
|
||||||
|
76
|
||||||
|
97
|
||||||
|
28
|
||||||
|
111
|
||||||
|
128
|
||||||
|
21
|
||||||
|
11
|
||||||
|
163
|
||||||
|
161
|
||||||
|
4
|
||||||
|
168
|
||||||
|
157
|
||||||
|
27
|
||||||
|
72
|
|
@ -1,8 +1,7 @@
|
||||||
defmodule DayREPLACE_MEPart1 do
|
defmodule DayREPLACE_MEPart1 do
|
||||||
def run do
|
def run do
|
||||||
File.read!("input")
|
File.read!("input")
|
||||||
|> String.trim()
|
|> String.split("\n", trim: true)
|
||||||
|> String.split("\n")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue