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