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

Advent of Code day 3

2022/day3.livemd

Advent of Code day 3

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

Puzzle input

example = "vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw"
"vJrwpWtwJgWrhcsFMMfFFhFp\njqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL\nPmmdzqPrVvPwwTWBwg\nwMqvLMZHhHMvwLHjbvcjnnSBnvTQFn\nttgJtRGJQctTZtZT\nCrZsJsPPZsGzwwsLwLmpwMDw"
input = Kino.Input.textarea("Puzzle input")
parsed =
  input
  |> Kino.Input.read()
  # example
  |> String.split("\n")
["hqBqJsqHhHvhHHqlBvlfpHQQwLVzVwtVzjzttjQVSjMjwL", "gRTRnCRsFNGbTzLjwcSTMmSz",
 "dGgsRWPGdWgZJqBBqhfpPq", "HNCNJHCWJRRLqNJWlfrrrwsmlwGmmf", "dddvLdLjdDvjvswlmGwlZQtjrt",
 "dvcpbLVcvNJJHNPHSp", "QDprSpLQRLQrQDmQcQFZjbbhZwdRsRFbbBss",
 "gWGGPgNvJlgJzDlNGHCGPNZZgFBbsjbFFBwZwfhdZbZB", "lHTlGMHlGCPNvClzGzJHvGcrMcVtLqMLcrrQVcVDrqrm",
 "SrBpJFfldlFNslFJBZwsmwgVGGsCCVmZZD", "jLtjvzLQMtWjbbQvDZZwGRJGgwggGZgv",
 "MzqqjznQPqnnjznnctnFlSddPfHflhfBJFNdHd", "mPNNGVCRngnSbgNw",
 "WqsqlTssgvqvZWZzhsTzWhScdHtfJJnfbtSJwfczdtSS", "sqTvhpqQvWZQLmDpDGMDGrgL",
 "DQRcLQVLbbcbrFPcRtTBBBJnTZrrnmZTrMgJ", "slGjjjdlhMfvdMQTvg", "jlzNhWHhhWjHlwwwGLDSDtPQVtRzRbSzpp",
 "DzDgfvzfDczfHCHSlgHLCmWG", "PrpNPJtpPMBssmmVdmSVVr", "PSRMwPnMpBNtNBTnnZwDqzQFfwhjZZqfhh",
 "fzfBwhBJFbCwbwwg", "strtgtrPgmPgFRsMdRnZRMFn", "mrmLPDvGmmtSLDgmSqvHchhcHQzcQQJHBfBh",
 "NsgwPPDgsPHqsTqqmLbLrDRhmrRVrbVW", "lFpGFtfFlvSFplGFzptSGSSlhZbhjhfrmWbhLhmLbCZVZjWr",
 "ccplJQSGcSSpVFvNqqsqPNqPQPTwqd", "HFhPNNZGqSZrCDBVZBCB", "RJTtwczTzCRVQrRHpR",
 "mfgblfltwgwwmlJgcHNnGhSbFNnFsFjFqG", "tSRqNRHpHnMSTqpcmrWWfqfmrCQCrW",
 "lhGDtbgVVgDsDbhfldfwrzrfcdzwcr", "vtDDhsgFBTNZFBHS", "LcNpLLBNgdmHGmsBCrRBQDDwnwRj",
 "hSWfZVhfPJJhfVWbhzbnQqQnRRRqPvCCrjvjwj", "ztJSSJhzzSTJrZSbzzJTfzbZmLmggdmNMFNpmtmMGFFGNpmt",
 "TRdFfLbTnLvZVlZvznQV", "pgJGprJNhghhNjjPgPNrhNqqlVVlQVVQqQjfzBfQvZzB",
 "rmGmSwJPwJprrNDbsfMRsdTDcDWHfM", "QMpZZTtwMBttJMMbVqPpqLqbVlbqqN",
 "rjCFGrdGRwdDHSnqflPVLqqVNllrfl", "DHGDRvhvwTZhJWBQ", "LcQCCpLQVhrdcFQCJrmmmwDwvDtJJnnw",
 "TsZqqTzMRqZjfsjTTDjsNJnmnStRSHnnSJmnJSNH", "sMMZZbDjZFdbVCFphV", "FCcdFFGBsdDrbMNSmSdmQR",
 "tVttHVLhvVgfTTtffNSMQRMZSRmMQNmHSb", "gngvvwJtVVTvVvvvfwvJThhCzGcnsCjmCDmscPcGCsGsmz",
 "fsnzRNZswZszPRZSLflPpDhlhvgWHmjWvJjh", "bVcCqjbdjbcMdBrddrQphvHHmHWlggpWpppqJJ", ...]

Part 1

parsed
|> Enum.map(fn bag ->
  String.split_at(bag, bag |> String.length() |> div(2))
end)
|> Enum.map(fn {left, right} ->
  String.myers_difference(left, right) |> Keyword.fetch!(:eq)
end)
|> Enum.map(&String.first/1)
|> Enum.join()
|> String.to_charlist()
|> Enum.map(fn char ->
  cond do
    char < 97 -> Integer.mod(char, 65) + 27
    char >= 97 -> Integer.mod(char, 97) + 1
  end
end)
|> Enum.sum()
7674

Part 2

parsed
|> Enum.chunk_every(3)
|> Enum.map(fn group ->
  [bag1, bag2, bag3] =
    Enum.map(group, fn bag ->
      bag
      |> String.graphemes()
      |> Enum.sort()
      |> Enum.dedup()
      |> Enum.join()
      |> String.to_charlist()
    end)

  MapSet.intersection(MapSet.new(bag1), MapSet.new(bag2))
  |> MapSet.intersection(MapSet.new(bag3))
  |> MapSet.to_list()
  |> Enum.reduce(0, fn char, acc ->
    cond do
      char < 97 -> acc + Integer.mod(char, 65) + 27
      char >= 97 -> acc + Integer.mod(char, 97) + 1
    end
  end)
end)
|> Enum.sum()
2805