Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 10

live/day10.livemd

Day 10

Mix.install([
  {:kino, "~> 0.6.2"}
])

Input

input = Kino.Input.textarea("dieci")
lines = input |> Kino.Input.read() |> String.split("\n", trim: true) |> Enum.map(&to_charlist/1)
defmodule Chunk do
  def parse(a), do: parse(a, [])

  def parse([], []), do: nil

  def parse([], b) when is_list(b), do: {:missing, b}

  def parse([x | a], [x | b]), do: parse(a, b)

  def parse([?( | a], b), do: parse(a, [?) | b])
  def parse([?< | a], b), do: parse(a, [?> | b])
  def parse([?[ | a], b), do: parse(a, [?] | b])
  def parse([?{ | a], b), do: parse(a, [?} | b])

  def parse([x | _], _), do: {:wrong, x}
end

Part 1

wrong_score = %{
  ?) => 3,
  ?] => 57,
  ?} => 1197,
  ?> => 25137
}
Enum.map(lines, &amp;Chunk.parse/1)
|> Enum.flat_map(fn
  {:wrong, x} -> [wrong_score[x]]
  _ -> []
end)
|> Enum.sum()

Part 2

miss_score = %{
  ?) => 1,
  ?] => 2,
  ?} => 3,
  ?> => 4
}
Enum.map(lines, &amp;Chunk.parse/1)
|> Enum.flat_map(fn
  {:missing, x} -> [Enum.reduce(x, 0, &amp;(&amp;2 * 5 + miss_score[&amp;1]))]
  _ -> []
end)
|> Enum.sort()
|> then(&amp;Enum.at(&amp;1, Integer.floor_div(length(&amp;1), 2)))