Powered by AppSignal & Oban Pro

Day 03

2022/day03.livemd

Day 03

Mix.install([
  {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
])
:ok

Setup

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2022", "3", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
{:ok,
 "gfWpjRRQffQGCHHJsGqjsj\nSclzJZZvmmnPbJtVSqqNBqVCBdSCsd\ntlbvZJDZtmtPcJmlPnhMFQWWpMRFTfLDRRTWRp\nHjMPgSWjVrjgbHRRSSMRgjRdpdbGdlcdCvQfcCdlwQJfdf\nLNDnhtNtLNFFZDtFnhzvdldDflvvDCdlJfldpJ\nZFLFZZmFtFtTNTSPRrVPWWMpRP\nqLBSBLRwmgzqCbzCffDlrfCV\nTFFFHNWFMFFMpHpGHMTHGNhrldWZCsdZsslZlZfrflDVss\nPTMcPGntTThHhTGctnMvSwjjvmmqLBmnjqqgCR\nnClJtMwwntqVVPJcgZqq\nmjpsDcrcSSFFPZqFBWWgVP\nvQcjsvhrvvrmhbmNHMNnlHbNMtCtNM\nbgvvhnTQtjrrrhsDDf\npLSMltLzLLSjFrSSjrSJHD\nzNWRLBdZPllPQtCvttgCqb\nDRlDrrFTNDNlgzsGTBfcnqhhcnJfcrCSqc\nMMmmdWtdLmvtldHjMmQfPBqSJWnfCCCqcWSSPJ\nvjHMjLmjpLtHptQLmHvwTRgNVVpTzZFZgZRlsVTN\nrzpMpDCGFCFFjRFsRPFRNFPv\nfWclbHCHtSmfvjnmfsvZ\nwTcTlSwwtQtWclBQBLGMLMCLVzVLwJGqLd\nMQSjLNjPPLLSBPjfQhSPHjDVCjDtVVpDHwbwVpbD\nRcmWzsRrzZrmTszWRqWlmRJscbtHwCbndCtcDVddDpdnVnbt\nJTsrGGTqmwTlWmTzJzWmhhPLLGgPFgBffSSPhFFM\nqMMRNZMDDNWLPqfzCgDcGncVDCgG\nwwBFhwhhBgmcVzhghG\ntbJbjjtJvwtdtwjpFtlbvtdTLNSMqNqMMgqNHPlZRTNggL\nqmjMHsZmZSbjbZMjSLFFFFwgsgvFswpwww\nhRJBhmnhhvFFwhcv\nllfWDWzrzBNTRfNBrWzzTmZbGTMjPqMmZPjVbSZGSP\nCRRPLwwcclcGVppQ\nSHFjDjjHDTfSDNTTHfSHjQVGrpmllQQWltVVVZGp\nHFlqzDTfqlzwbgPJLwCP\nWRCNLphpLppSCWVHNfLRzVnQMnBnMddPMQDFQgrhPQFM\njTjJqvqjvPVJFJFBJF\nqTsZbvGqqZlstsmZVljtwqwSHHNWczHSSRcWNSRHzzNfbW\nglgzDzHjSrVHcVgbrjmNsscNGmNWssGNNtst\nhHPQLHJpwdLpdHfQQtnZmNMwnZGZWwsFZM\nQpdhPJRTJfPphJfhCBlVqVvgvVDBbvVqDbHD\nVtHzjZpjVtHrprgGmjHsGHNdSJFQRcLJqCdQcSqJNpcq\nbBWfTPwhbfDlMnhffRwQJQNdqJcLFQLSdR\nbhBhvfMWTnlDnTBfPSmvmjsjmmGtzHtsHm\npcRPRPWrSDcJGZSStmwZZS\nVnLfCfTlfVzfnMMBCqVNZJdtjNtJjhJdGNNbwT\nBLvqCCMVsnRQsPQgDcZH\ncQbqqQhDGhlQfQlhQrqGsTNgLgCpRgLTPPPLNbpg\nwtHVddVFwSHznZwwznCpRBdjppNBNTTdCjRR\nZtWFwWtSmvVnwZDrCMGfQlDDJQmD\nPzPZGCZzrZrlhdjdCqfCsqQdRD\ncbvZLVVFvbbNSNFHSDnsDQdnfqNQDRngsR\nFJHSLSFSScJJbWHFmFVFSZmrrzBmhtBwmzBMPMPzPh\nnlpFcLBgcVcLbssGVBGGrlpGPhJJJJJqPBZPDNMQMJJhJQZZ\nSSTjHzfHwtZSPVQVQMRQ\nTzVHwWfTtzwdVzsbFnGgsbdcGrLc\nFppVBRVZDdLmrDGmmfrQ\nNtNMPNshJCzznLGJSrqRrRrr\ntRssthhPlCWhPzsWtzhzCbVVjwTpVwdZZTpwjbdBbwBc\nTTWblHWScvPCCHTWFzSrqqsNNSmdmqrrpz\nRLRwjjnjZNprzmmZcq\nQQgtQnccQDGjgLDRRcLthQhFBvCbMtMHTWlBFllBbFCMTW\nWnBVNvDnVsNvZWdrWDLVDMbsHpTjpHCSSClsbSCCMH\nGPFtmztzgPhRFtJTdbTwjppSCjpgSl\nhJcfPtQhdtWNVZqNnqNQ\nGLcqZPPsnqQcFsmBBrqRvrddNqrC\nMtHthJwLllwvjRvvtrvBRS\nVHMfDLbpfznszZQG\nWBSdPlQPRfBtGQPfBGPBJgzgjwsJzsszJwCrdwCT\nZpppVpMVpnVHMVVbZRJrCgwRzTJrwNJw\nMvhmnpLqLmhVmBlftRQBFSlR\nhhQlSJqhtCSnqZJnqShSlNDwRzpvdwRlMBMMdcjRjMpMRc\nfrrGmLmWbfFrsmFHmBzBvBcwdJbvpjzbMM\nmmgFrVGLWJLFGsgfhSVtVPqntqnnSStN\nSFJTJTSqswwFQbwf\ncDtcWPclrtPwVsfssQmN\nHDtwWCgWdggdzSGJMSzGMq\nJpqJtWRJMhCMJpMQCWtFrjgHdgdlgllwNjlQjldH\nfBzPZcZvnBmDnZvZBZDmPvglVVVdgHHSwrNRgVgwNPRH\nGbZnZccfvcsZmccsmnnZTRbCCMWFTWJqFCCMJFRT\nvrrFqrFTBTmLmNrLMqMTHddJbHpWnhdWdWbHhJGM\nwBzfwzcQSzWSSshpdWGp\ngwjPPPDQtzQlzQDPqTgLBRmRqZBvqFNR\nbWVptFFsbPcZsGLhsZGmLB\nqnWrnrHdMCDCNqfWmvRRZSSRLdRGZGRG\nnNqqNDfMrMWHDQNHzWfHNDnwzblpzFlbwtFbVVlwVcPJpP\nBHJhlHdJQggvddglJBBhglhQzZHPZpFFPDMzFDDRDFZZDFZD\nrSTfqnCffMfCVfCLNqbzbjWNDbbWDPFpPFbP\nnfnnrSfCTVSwrqSLCGfTGlgQhlvsGMJQJBhhssJhGc\ntBjjDjjqfDjLfJlrLgglvmrlmrcc\nTwNNTVhwwpgvGSNNSssS\nTbwhnvvChhbVRTPPRJBJQQfJttMQQJCQfW\nmWSvSQVgmWQsQvspQJlrlLnJLLpCClhhlp\nbFHRjZdNjjBZzFzhtnCllCcJLrCBll\nHFFNHbdZZLZjfPFjHVQmWDDVsvsmTqVqDf\nJJPllQQClqgBCgdHwHbpjVTwHd\ntmGZtjGjHZpVbfMT\nShGjNGWmDSNcNRtGmshDRzzCvzQJJRBLrvlrBPJv\ncTpqsTWqVVpsNLfvCDFlMFDVFL\nJnndJPddQgzHlvMJFDhLCG\nBjtntgdRnQgzjdBRQBlpNWrTTlNTSwNpWS\nqHmqLVLjmVqsDBLtmjmbtPwCTwwPzGWRgGwGwMwW\nZhcCNCSprRTWTwSnWW\nhflhZvvQhppZfcNpvrhpQHjVjLmbVmmVHVCFDvqVFb\nnnNrwDnZrspwDNnZsNSDsNbCmpjvMTPQjLMmPmmQPGBTQP\nFdVtRdRfctBQPmTtTLQB\nqhzWVWJqVHwbhlLSsS\nhtWmhDhFztnztDhtBmBtghPRSrpfjVwPdfPwpwnRSVrr\ncbCHvgJGcTqbqcbqqqcqsMsRVrSCwffdRPPpVpwCRSwfjj\nGlgGQqTqbgQzttmBNNFz\nNWQNQgdTgjQNddTZfrCQWRDnnnbqnLqnRcjJlqqvDj\nFtSSmSmJhpllcclDvpln\nJBVVSsSFBVBttShFGSPQfCGNdrMfZZTQTZNNdC\nHgHthMhphcbfbMMfHhsGGDCRRVlcVSScsCRz\nnWvPFqLqPNdjnNLnjdJnPdWjGlssDPSsllVCRzlTCTGlSDzS\nRvddJRJQHwQwpZZb\ngdZwgpjZZQtHTdrWrwdpWRnlhNBRlLbFthNhflhBnL\nCVzDCPGMVqVmGsGGbJCmCDvMcRcqnBFFFnRBBNRBBNqhnFfF\nDsmSGsGPzvMGJvdbgTSTbjbSSdgH\njBGmbNBQGdBNNDJNQRLLVDsHtDRzHHZZcH\nwCWPFWPCrPhPrplvprhwpCHHtszttqZslRVHLtzVlJZL\nvprMMvMnJCwnnPShNGSTfGSfNmmgdNff\nbPtLbvVWWztbLSVVnbszpzQsrcDDBdpRcDrs\nllZmgCZqgCFgmdRdJcscBdJsmQ\nFZlgfqCFfgZHlqCMCglwCFGWntLLSMRSPGPVttWRtVGL\nvtnDsDtrnrSvrMVmbrrJg" <> ...}
rucksacks =
  puzzle_input
  |> String.split("\n", trim: true)
["gfWpjRRQffQGCHHJsGqjsj", "SclzJZZvmmnPbJtVSqqNBqVCBdSCsd",
 "tlbvZJDZtmtPcJmlPnhMFQWWpMRFTfLDRRTWRp", "HjMPgSWjVrjgbHRRSSMRgjRdpdbGdlcdCvQfcCdlwQJfdf",
 "LNDnhtNtLNFFZDtFnhzvdldDflvvDCdlJfldpJ", "ZFLFZZmFtFtTNTSPRrVPWWMpRP", "qLBSBLRwmgzqCbzCffDlrfCV",
 "TFFFHNWFMFFMpHpGHMTHGNhrldWZCsdZsslZlZfrflDVss", "PTMcPGntTThHhTGctnMvSwjjvmmqLBmnjqqgCR",
 "nClJtMwwntqVVPJcgZqq", "mjpsDcrcSSFFPZqFBWWgVP", "vQcjsvhrvvrmhbmNHMNnlHbNMtCtNM",
 "bgvvhnTQtjrrrhsDDf", "pLSMltLzLLSjFrSSjrSJHD", "zNWRLBdZPllPQtCvttgCqb",
 "DRlDrrFTNDNlgzsGTBfcnqhhcnJfcrCSqc", "MMmmdWtdLmvtldHjMmQfPBqSJWnfCCCqcWSSPJ",
 "vjHMjLmjpLtHptQLmHvwTRgNVVpTzZFZgZRlsVTN", "rzpMpDCGFCFFjRFsRPFRNFPv", "fWclbHCHtSmfvjnmfsvZ",
 "wTcTlSwwtQtWclBQBLGMLMCLVzVLwJGqLd", "MQSjLNjPPLLSBPjfQhSPHjDVCjDtVVpDHwbwVpbD",
 "RcmWzsRrzZrmTszWRqWlmRJscbtHwCbndCtcDVddDpdnVnbt", "JTsrGGTqmwTlWmTzJzWmhhPLLGgPFgBffSSPhFFM",
 "qMMRNZMDDNWLPqfzCgDcGncVDCgG", "wwBFhwhhBgmcVzhghG",
 "tbJbjjtJvwtdtwjpFtlbvtdTLNSMqNqMMgqNHPlZRTNggL", "qmjMHsZmZSbjbZMjSLFFFFwgsgvFswpwww",
 "hRJBhmnhhvFFwhcv", "llfWDWzrzBNTRfNBrWzzTmZbGTMjPqMmZPjVbSZGSP", "CRRPLwwcclcGVppQ",
 "SHFjDjjHDTfSDNTTHfSHjQVGrpmllQQWltVVVZGp", "HFlqzDTfqlzwbgPJLwCP",
 "WRCNLphpLppSCWVHNfLRzVnQMnBnMddPMQDFQgrhPQFM", "jTjJqvqjvPVJFJFBJF",
 "qTsZbvGqqZlstsmZVljtwqwSHHNWczHSSRcWNSRHzzNfbW", "glgzDzHjSrVHcVgbrjmNsscNGmNWssGNNtst",
 "hHPQLHJpwdLpdHfQQtnZmNMwnZGZWwsFZM", "QpdhPJRTJfPphJfhCBlVqVvgvVDBbvVqDbHD",
 "VtHzjZpjVtHrprgGmjHsGHNdSJFQRcLJqCdQcSqJNpcq", "bBWfTPwhbfDlMnhffRwQJQNdqJcLFQLSdR",
 "bhBhvfMWTnlDnTBfPSmvmjsjmmGtzHtsHm", "pcRPRPWrSDcJGZSStmwZZS",
 "VnLfCfTlfVzfnMMBCqVNZJdtjNtJjhJdGNNbwT", "BLvqCCMVsnRQsPQgDcZH",
 "cQbqqQhDGhlQfQlhQrqGsTNgLgCpRgLTPPPLNbpg", "wtHVddVFwSHznZwwznCpRBdjppNBNTTdCjRR",
 "ZtWFwWtSmvVnwZDrCMGfQlDDJQmD", "PzPZGCZzrZrlhdjdCqfCsqQdRD", "cbvZLVVFvbbNSNFHSDnsDQdnfqNQDRngsR",
 ...]
defmodule Day03 do
  def count(list) do
    list
    |> Enum.map(fn sets ->
      sets
      |> Enum.reduce(&MapSet.intersection/2)
      |> Enum.at(0)
    end)
    |> Enum.map(fn
      c when c in ?a..?z -> c - ?a + 1
      c when c in ?A..?Z -> c - ?A + 27
    end)
    |> Enum.sum()
  end
end
{:module, Day03, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:count, 1}}

Task 1

rucksacks
|> Enum.map(fn rucksacks_pair ->
  size = byte_size(rucksacks_pair)
  half = div(size, 2)

  {b1, b2} = String.split_at(rucksacks_pair, half)

  [MapSet.new(to_charlist(b1)), MapSet.new(to_charlist(b2))]
end)
|> Day03.count()
7845

Task 2

rucksacks
|> Enum.map(&MapSet.new(to_charlist(&1)))
|> Enum.chunk_every(3)
|> Day03.count()
2790