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

Day 3

livebooks/2022/3.livemd

Day 3

Mix.install([
  {:req, "~> 0.3.2"},
  {:vega_lite, "~> 0.1.6"},
  {:kino_vega_lite, "~> 0.1.6"}
])

alias VegaLite, as: Vl

aoc_session = System.fetch_env!("LB_AOC_SESSION")
input_url = "https://adventofcode.com/2022/day/3/input"
{:ok, %{body: input}} = Req.get(input_url, headers: [cookie: "session=#{aoc_session}"])

Input

test_input = """
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
"""

Part 1

split_rucksack = fn sack ->
  middle = div(String.length(sack), 2)
  sack |> String.to_charlist() |> Enum.chunk_every(middle)
end

common_item = fn sacks ->
  sets = for sack <- sacks, do: MapSet.new(sack)
  Enum.reduce(sets, &amp;MapSet.intersection/2) |> MapSet.to_list() |> hd()
end

to_priority = fn
  ch when ch in ?a..?z -> ch - ?a + 1
  ch -> ch - ?A + 27
end
# input = test_input

input
|> String.split("\n", trim: true)
|> Enum.map(&amp;split_rucksack.(&amp;1))
|> Enum.map(&amp;common_item.(&amp;1))
|> Enum.map(&amp;to_priority.(&amp;1))
|> Enum.sum()

Part 2

# input = test_input

input
|> String.split("\n", trim: true)
|> Enum.chunk_every(3)
|> Enum.map(fn sacks -> for sack <- sacks, do: String.to_charlist(sack) end)
|> Enum.map(&amp;common_item.(&amp;1))
|> Enum.map(&amp;to_priority.(&amp;1))
|> Enum.sum()