Powered by AppSignal & Oban Pro

🎄 Year 2020 🔔 Day 02

elixir/notebooks/2020/day02.livemd

🎄 Year 2020 🔔 Day 02

Parse input

filename = "#{__DIR__}/../../../inputs/2020/day02.txt"

parsed_input_stream =
  File.stream!(filename)
  |> Stream.map(&String.trim(&1))
  |> Stream.map(&String.split(&1, " "))
  |> Stream.map(fn [counts, <<char::bitstring-size(8)>> <> ":", password] ->
    [from, to] = String.split(counts, "-")
    {String.to_integer(from), String.to_integer(to), char, password}
  end)

Part One

parsed_input_stream
|> Stream.filter(fn {from, to, char, password} ->
  password
  |> String.graphemes()
  |> Enum.count(fn e -> e == char end)
  |> then(&(&1 >= from && &1 <= to))
end)
|> Enum.count()

Part two

parsed_input_stream
|> Enum.filter(fn {first, last, char, password} ->
  chars = password |> String.graphemes()

  Enum.at(chars, first - 1) == char != (Enum.at(chars, last - 1) == char)
end)
|> Enum.count()