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

Day 3 - Rucksack Reorganization

day03.livemd

Day 3 - Rucksack Reorganization

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

Part 1

input = Kino.Input.textarea("Please insert your input")
sample_input =
  input
  |> Kino.Input.read()
  |> String.split("\n", trim: true)
  |> Enum.map(&Kernel.to_charlist/1)
['BdbzzddChsWrRFbzBrszbhWMLNJHLLLLHZtSLglFNZHLJH', 'nnfMwqpQTMffHlNNLllHnZSS',
 'cGpcMwfppfqcjcTCBBzWDsDbDrjzWz', 'LhfjhcdjcGdhFfdGfdjdvwCCZMvvLvWwMLCLSwZC',
 'rDnsbmptPmlbQMCrQWQQBZQW', 'gltgVPngDPbptPsbPzVgmDldfTdfczThjJJjfMcJdFHjjH',
 'dGlgDflTLLLrRLTLVdQLcQMnbvHbbFzNNvMbnHHn', 'sZjWJJCSjWqfCqSjSmJSbFvCzBMBBzHncHNvMBHN',
 'twqqwpZwfrlwRwDGDR', 'zCGGFTQMQrsNRNGZdR', 'cLLQgPDpgcgmvPRHrwBdvrNZ',
 'glWpmJWQDcJpQnpjSmbhFtMnqFfCVTCFCFFM', 'zNZWFNZBFrGTdBcZZBdJTrGrmgvppgDHwHmgVHCHCvCPDjzC',
 'qtqqPnLSfLwvjvvgvvqH', 'MtbLLLQbRfPRfnbnnLMtnsbdBNsrGWNWcNcTBWZrrcrWcJ',
 'sZwstbbDVlHtbhcrhhZLrRpNQN', 'jqGjjFjWnzWGgqWjJJNphnLMRhLhcrhcrSLN', 'qCJzFJdvmHvbtpbb',
 'ZSRsvvQvZpsRQGJghClPCwGPChCP', 'FVdMLDdtDRdDcBtmcVFntwgJJTlnNPwJnlTlwlTPgN', 'VqttMWFmDbjbzrSWRQ',
 'TsDSBcwshdwSCrgRWZBvgGRG', 'LPVJLqqJbbzpFqwpbvgGRmZPrmZgCvCCfr', 'tzJlJzQllFLqtwHhjNSdtthjDhTN',
 'fsDLDDnwvnSdqLSsFSDfsLpbgVttPMpPNjMWVMNfpjgW', 'jhHmBmlrTBBHRPVtMZbppNPPZB',
 'JmTTrTmjRTJqSQQSFqQw', 'HPzZFgPFMCHJCcZMcDQGwpLqPLqppwhGvv',
 'BrWRqbqRsTSTqNddrVrthLQVwnpwphnvnDnGvGDn', 'tSbBfsRbTfqjJqjCqm',
 'pCqrqzmqZzrmCCvCJwJPBRwJBWBmwWBJ', 'VqbqbjFLFfSHnfctBwDdDFTwtRRTDF',
 'LVcnbjHLSqHnhbSGGppCMMZMphpNrQ', 'PhTcTPsSPCMvvhhMRPttbNWfNsWFNfWWtpNw',
 'rdQrDbJBVVjrBVdLjHHHWNWwfHtzzNtFpZZptppg', 'JJVGGdddjDjDJmdjGqqRSbPMTvcRlqnnMlvT',
 'SqGfTrBlSrrrfGGQvCnqZhZmPPhvJh', 'LdVNwgsjdjHmjWwDsDpwsHWtnCnQQQQNnvCnbJZQbNbtZZ',
 'DjssDHLLVppDssdLspswFLVjzfFMTfSBcTRcrFSBzBTzmGzr', 'JSJJqlldpJlcdVWMlgMJrcCjrhzHCwTjHrQzwTzZ',
 'bBvsGBGNFDNRFNFBRDPsDDHCChhhrZRQQzhjhCjTzWCr', 'FvbLFGDDtWDFBnPGFDWGqJMgJpSdVStllttlppVS',
 'clpBdBQBsqGpQbVdqTTWRTSFgLLggffg', 'NzvwmHvZtZZgbDSCLDmfmm',
 'jPJjthHzNwPvvjwjNzPzztZBlrccpbVGBQhlGBVlrpnpBs', 'NmFFGlGmzCrNWHvFmFWCFvQPTdDDlbbdgJPtgbbdPDcc',
 'RwfBqLwZqffqnPbdDgVQDdtRbT', 'hnptqLMMLwqjMMjzSzHmhvNNrvvhhz',
 'hqVrDdPdVDqjsDrjjqsfrrWlctvHJNLfvNcLHNNZRNZHvfZL', 'CSnWQSGBBSnmBnTmSbQbNZZMJNJMccGNHLZNNvNv',
 ...]
defmodule Priority do
  def offset(chr) when chr > 96, do: 96
  def offset(chr) when chr <= 96, do: 38
end

sample_input
# Split into left and right rucksacks
|> Enum.map(fn rucksack ->
  len = round(length(rucksack) / 2)
  Enum.split(rucksack, len)
end)
# Get the intersection using -- list operator
|> Enum.map(fn {left, right} ->
  # get intersection, and since it can be repeated, we get the first one
  (left -- left -- right) |> Enum.at(0)
end)
# Map to the priorirty
|> Enum.map(fn item ->
  # convert to priority using the ascii code and the prio
  item - Priority.offset(item)
end)
# sum total
|> Enum.sum()
7889

Part 2

sample_input
# group rucksacks 3 by 3
|> Enum.chunk_every(3)
# Get the common element within the group
|> Enum.map(fn group ->
  group
  |> Enum.reduce(fn rucksack, rep ->
    rep -- rep -- rucksack
  end)
  |> Enum.at(0)
end)
# Convert to priority with offset
|> Enum.map(fn badge ->
  badge - Priority.offset(badge)
end)
# Sum total
|> Enum.sum()
2825