this repo has no description
1<!-- vim:set ft=markdown: -->
2
3<!-- livebook:{"persist_outputs":true} -->
4
5# Day 10
6
7```elixir
8input =
9 File.stream!("day10.txt")
10 |> Stream.map(&String.trim/1)
11
12defmodule Day10 do
13 @parens %{?( => ?), ?[ => ?], ?< => ?>, ?{ => ?}}
14
15 def parse(input), do: parse(input, [])
16
17 defp parse(<<c>> <> rest, stack) when c in '([{<', do: parse(rest, [@parens[c] | stack])
18 defp parse(<<c>> <> rest, [c | stack]), do: parse(rest, stack)
19 defp parse(<<>>, []), do: :ok
20 defp parse(<<>>, rest), do: {:incomplete, rest}
21 defp parse(<<c>> <> _, _), do: {:unexpected, [c]}
22end
23```
24
25```output
26{:module, Day10, <<70, 79, 82, 49, 0, 0, 7, ...>>, {:parse, 2}}
27```
28
29## Task 1
30
31```elixir
32points = %{
33 ?) => 3,
34 ?] => 57,
35 ?} => 1197,
36 ?> => 25137
37}
38
39input
40|> Enum.map(&Day10.parse/1)
41|> Enum.map(fn
42 {:unexpected, [c]} -> points[c]
43 _ -> 0
44end)
45|> Enum.sum()
46```
47
48```output
49288291
50```
51
52## Task 2
53
54```elixir
55points = %{
56 ?) => 1,
57 ?] => 2,
58 ?} => 3,
59 ?> => 4
60}
61
62median = fn list ->
63 sorted = Enum.sort(list)
64 middle = div(length(list), 2)
65
66 Enum.at(sorted, middle)
67end
68
69input
70|> Enum.map(&Day10.parse/1)
71|> Enum.flat_map(fn
72 {:incomplete, rest} ->
73 [
74 Enum.reduce(rest, 0, fn c, acc ->
75 acc * 5 + points[c]
76 end)
77 ]
78
79 _ ->
80 []
81end)
82|> median.()
83```
84
85```output
86820045242
87```