Day 03
Section
defmodule Day03 do
@priorities [?a..?z, ?A..?Z] |> Enum.concat() |> Enum.with_index(1) |> Map.new()
def part1(input_path) do
input_path
|> File.stream!()
|> Stream.map(&String.trim/1)
|> Stream.map(&:binary.bin_to_list/1)
|> Stream.map(&Enum.split(&1, div(length(&1), 2)))
|> Stream.map(fn {f, r} ->
Enum.uniq(f -- f -- r)
end)
|> Stream.flat_map(fn intersection ->
Enum.map(intersection, &@priorities[&1])
end)
|> Enum.sum()
end
def part2(input_path) do
input_path
|> File.stream!()
|> Stream.map(&String.trim/1)
|> Stream.map(&:binary.bin_to_list/1)
|> Stream.map(&MapSet.new/1)
|> Stream.chunk_every(3)
|> Stream.flat_map(fn group ->
Enum.reduce(group, &MapSet.intersection/2)
end)
|> Stream.map(&@priorities[&1])
|> Enum.sum()
end
end
input_path = "#{__DIR__}/day03.txt"
Day03.part1(input_path)
Day03.part2(input_path)