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

AoC -- Day 03

2022/03.livemd

AoC – Day 03

input = File.stream!("/Users/pw/src/weiland/adventofcode/2022/input/03.txt")

test_input = File.stream!("/Users/pw/src/weiland/adventofcode/2022/input/03test.txt")

Data preprocessing

parse_line = fn line ->
  line
  |> String.replace("\n", "")
  |> String.split("", trim: true)
end

input =
  input
  |> Stream.map(parse_line)

# |> Enum.to_list()
# |> length()

Part one

calculate_priority = fn letter ->
  char =
    String.to_charlist(letter)
    |> hd

  # capital letter
  # lowercase letter
  if char >= 65 &amp;&amp; char <= 90 do
    char - 38
  else
    char - 96
  end
end

find_duplicate = fn [comp1, comp2] ->
  comp1
  |> Enum.filter(fn item -> Enum.member?(comp2, item) end)
  |> Enum.uniq()
  |> List.first()
end

input
|> Stream.map(&amp;Enum.chunk_every(&amp;1, Integer.floor_div(Enum.count(&amp;1), 2)))
|> Stream.map(find_duplicate)
|> Stream.map(calculate_priority)
|> Enum.sum()

Part two

find_badge = fn [comp1, comp2, comp3] ->
  Enum.filter(comp1, fn item -> Enum.member?(comp2, item) &amp;&amp; Enum.member?(comp3, item) end)
  |> Enum.uniq()
  |> List.first()
end

input
|> Enum.chunk_every(3)
|> Enum.map(find_badge)
|> Enum.map(calculate_priority)
|> Enum.sum()