diff --git a/src/bin/d3.rs b/src/bin/d3.rs new file mode 100644 index 0000000..768ec22 --- /dev/null +++ b/src/bin/d3.rs @@ -0,0 +1,40 @@ +use itertools::Itertools; + +const INPUT: &str = include_str!("../input/d3.txt"); + +fn main() -> anyhow::Result<()> { + let p1 = INPUT + .split('\n') + .map(|s| s.split_at(s.len() / 2)) + .map(|(l, r)| { + l.chars().find(|ch| { + r.contains(*ch) + }).expect("No common characters in rucksack") + }) + .map(item_priority) + .sum::(); + println!("{p1}"); + let p2 = INPUT + .split('\n') + .batching(|it| { + it.next_tuple::<(&str,&str,&str)>() + }) + .map(|(a, b, c)| { + a.chars() + .filter(|&ch| b.contains(ch)) + .find(|&ch| c.contains(ch)) + .expect("No common characters in 3 rucksacks") + }) + .map(item_priority) + .sum::(); + println!("{p2:?}"); + anyhow::Ok(()) +} + +fn item_priority(item: char) -> usize { + match item { + 'a'..='z' => item as usize - 96, + 'A'..='Z' => item as usize - 38, + _ => unreachable!(), + } +} diff --git a/src/input/d3.txt b/src/input/d3.txt new file mode 100644 index 0000000..83b5de3 --- /dev/null +++ b/src/input/d3.txt @@ -0,0 +1,300 @@ +VdzVHmNpdVmBBCpmQLTNfTtMhMJnhFhTTf +FgqsZbqDDFqRrhhJnsnLMTfhJG +bRRRPrRRwSwbDqgjvDZbRbQzpzmQVWCzzBdvQBFCzlWV +GcDdRdvhRssRhGDdShCRtqWjlQzqWgqzNfNjfQWWjt +mwwnnPFwmVrPmJmzfNzqCjQCbgVlgC +nPnHHLrHwmJTrCTJpThBscBSdSLGZvZBvRhZ +RVQQcVlcSRclfZCCCnMJJTSTnC +NdHwjdwjbBBZrrZrbJDZJJ +wmhjGGBGwwmjtjtdPlfRcpVQlhRppVJF +pplbNBPPrppllrFNbpvppSTcwqcWFhTTShhJDTchqd +RGzRfLjjmZmfmwLftTWhStStJWTdWmDm +nfsMjQssnpPvNnrPrw +SjjBgllzlQjBZvlBBgcFbgJHsMhJqbMHPggJbM +hRLRVDdRRWnJqnnHTqMCnH +GRfLddRRpVhNVrWSjwQQzSzcGSBQSc +qMwNqqBdQdnTVBBVVhMVnVFzTHPggTPjGRDzvPTjjmvPDj +sbSrWJpStrtPtRPttzmmDD +pfbJJcbsrcLpWLllsnFmcqcwQncnQQqVNQ +RBTWCMwCwdZThPZcZZ +pVmVpHLFFFHHVgVmvNmHSQNvddlPPzZJMPcdhclhjczLdZMP +vnnNnFStGMRDwWnn +fWDdJTpDJzdBBBdmDSbSRHRwPqbPbHgSbz +slQtQvNsMVvrrgPRgRglnhwWPH +sGMMQFrsjvNMfWmdpfFDFZBf +vnMRMWCMJwWWwwWPjmSdVmLdzvVbLrhL +HsNfDHQlZpNqfQzbLbrqhjLmVdjd +dfDZQsNpstHHHptZDDtZWgngtgBMPMMRwCPtBBGW +HwQwwbwFNWHwHBVFQFLQzRznZnSzcjjjpPbcPpSP +vTfTJsCmsftJZmTSSdPvzdjRSvPdjd +TrGtTJfmGDfDhrhJJJsqrZhDBFLHHLLQWFwwlWBVBBVwgLFD +FFTJRLccQgmTbSsbGm +PBPPqCvCwqwhQQVhQngmVmSgglmGnHbnmb +zqthvtQPBfCCzPwQPtwQzPwNLfNRFNLdLRLFRFFNLFdFdW +nszjQnsPwjznzCCrhJqvjqhmBv +tFWdHGWFGtctlNNpZBBhmqTrrbWqvTBT +dlFtcpHDVVVHFdNGHGpGfQgsPDzSMsQwwPwgLLBQ +TzQqTJGvnnSzqrWTnvfbbcflQcVltfcCMPVM +jFjNZFFJLpFwmBwblcpptcVtfbbVlR +jmmJdBBLNdGDWDDrdzqn +pzddqQmGgbqgGpbJmmdnLZDCRZnZvFlLRZLSlLRT +rVwchcBBMwVBHhHTZCTSGSCRTZlTDr +HtccPfjfBhMtVBGHWpNqJdJdpjNJppWz +WThTWWhtPbZRvvWbbvRTSRMjVRLLgFssgLpVsfSF +JdwrlJcCwfzdqwwjsjzpLMgVsMFgML +lQrwHNGJHClvTmfhBmPQmt +lbRLhcLRpLJzgdGddF +qvhwqDDCVtBDVhfMVGFnzGGzTBnGzGGgFg +VjCwCWCMtjVDtChvQhtffcSmHpNWrrcHZHHZpplWbp +DJVDVdvpmZdPgrCbgbgCJC +lzczcWwwznGhBgPSvTlCrNgqNC +wGzzQhzGGsBBGRBcQwGwnwjmmRHpRfmmMpppMjjHDvLL +HJjJQWjFmmWtFmJTMchghhDwNMhVMWML +SznPSRfRSSPdrrPSShbDVhbLPwcwGGwVNh +ddRfzdRrCrRsZDSnFjspvFvqFqFqTvJt +lflfjQfjvljfbfMLTTDCmHNLNVbL +HSJnRrrJZJssnGRrnsrcqqRnDCLBMhVCTLVLhVNVJBBBhhBm +SsrGGqqnSsWSnnqWHSrPfzftvFdvWlwfQgQwWvzz +nQlsGnFGwwqNJWmJJjpplt +HMTLPTRdvsTCCThDCZdLdLDNNpJBWJbjJMpBmbtNptBWmm +DLCzPzTzZDdLdGSGfSGrsnQGzr +LNPPLHNPHQNQSBFDWDPgggFv +hszfWCWJhrBMsSSBgvFD +GGZjfmJTjmZfrJrZrZJRGwNQnlLNHWjLVjlwdVNHpV +BdNVdTcGVclmTwrTnwPwrHCr +zttBWzfLsCggHPwDrf +szsWSMbWzzbqBbzJjtjsvMzzvdmdVpGllpcRNZZhmRpZcGGc +CjdbMmmmZFnzzgHlttGBVqtBGtsldG +LvPPWNcFSSRslWhBsllT +ppccvLPpcSNwLLwrDNNpLvwJHCMDmbCJbFzgmZZmFgbgnM +TTNRwZqhcTTjsNTTsmrJlvrmmmqqHSrlJH +fLQCCdtcfCDDVbVVQdFbQbdJHMHrJHrHnMllHdMHPrMdln +WfQLQWWDbwRTWcRssN +HQGQWHPDHNjMNQGNWNTWCvZllzqFZqzvvzhCtvFj +DfgwdgfcFpchztvt +sRggdwwVdgmnSTnnDBPBNWLn +WbCZCfTVTTJjSwGdWNDGGw +MMRqggMsqhlmlhrssHgRnRmRvdzdczvdNGNLzScGDrNzrLNc +lRqsnRhmqqQnQpgQMlgDqRfBTJVFbJZQtBCbZQJVZFFb +JnhQcCnmLDsmgmgr +bbMZppRFGGRPfBMMRGMZssTTrLlLfsLlVLdsLsdn +GZGSpPGMZtGGPFFRGBCwhvwjjcnJctvQcvHq +vvrPrHZMGJNRMnqn +BVChWWcDVWsBwCWwGrJNhRLJJnJtLqnq +cjDfcfpWWsfWccBsHgPgrPTdpZbbgggv +GshtVtVtjSCVtVvVGtlVvFZLMvLRZmHmZwbLwZdLdZmR +JWzNDQzjcgJgQBJgzgMwLLHZZcdPwRLwRdHZ +QWTppBWfDrrNBTTfffhFCpVSjnhCGsFtsqSl +nmbCnzHHNzCjCJHJNSCWHLBLrvBrrSGRBDhrDRLrGL +TVtPllwcgdmTRhLQTQhT +fdFtccFcpPmggfdfNzHzCMsbCnWnJs +fMgddvjgRRvjvjVJVdTlZGGtGnrlnqTccNjl +HHSFSWSmmpbBpZlGncrNGbNtrn +WDWBDDBDBDCwPBWBDWNQDgzvVvLRvsVLRwvwdJVLwL +ZSmmvcpsmcJmJvqgBZgZqqtCtZjl +WhDwhFSDgtBFjnFg +rTrSTLWTTHNMNwNrMVddwNNhsmJGQcRsRcJGsJzQJsrzPsPm +GBtLmPsCQqsGqgghZHDzzgLbFz +zjjVTzTlRjRJfznrvrfpnNhFSghbbNFgHrbHZbDHbH +vpfcTJVpcVlfcQPMPCGzCBsd +HMhZNffcPZfNMrzjjFdGcJDjvJ +VSBVVLlSQQmTVSWpSQzDrHzTTvDvFjFdGGzT +mQSplVHWbHLSgWQnShNwsZMZPfbsNCRNCt +MMqvDzLwZzlMqQfdGWPfgPffPglH +ShTcJshsrRdnrdfrrfHp +VVRtFhsCJVJVvwQqDdbDQd +dmnNMlFNvmvljnbpMWNDFQvfQJJGvfPCfHGgQQgcJg +bRVzLBSSTRBRBBrwTrVtRwCfcGHcsJgJgzgGsggHCzcC +ZbtVTTrrqrSSVwhqqwBRwFWMDFNdjdZpWjdDDppjMW +MTzqtbLtwFzJgbHgfbdWWH +VMNBjNVjvNfhhhhfNPhP +jmGMvlDZZnVMtzlwzqqCpwFt +PpzGspGmpPsFLrTnTLzzBg +QCWvfjfWjRPFZgrvqrBvTg +wwNRCNQQVNRWjNWfQbHCCClHGDGJdGhpdhtPGhltDlJD +dhbpGzhllzGlPvnzNcvtNVnc +gcFMsTJDMMwrZqfjjqvvfnPtqJ +sWRWTRFwrTgLDDFWgMsTlpSlpbSCdWWdcbmpChGd +QccdFFFcFbcQPQPHMgpPMp +NJlNSSMLDfJfmlSqHZRNpRqNBRPRPq +LlMmJfvDVVTJSmVMscsCFtvwcjWjrjCj +NVVMGWFSMRVGWSthwhTJWzcJCcJsTs +jqRLqlfRZcmjcCzT +rlRRrdrflpdvPbHpflfPlfDBgBMQpGVQMgpVDGMggBDV +VwRhccRsnQStRhtGQVQVsmjgDgqJdggDjqLDgJlLzmLl +BWFZpWHBNCBCNBzBNvWBpzHZqqlMqgNdlllDdqDgJDLlfDdd +pFbTrrrBzbzTtSwStQnnsrVn +DRfFbFqzbddfPFtsJnJRsnClJRsn +cgjgQgWvSLVQgmWWgWVjVSSSBTltThLnqJssnTCZsTThntZT +qjwpSrmWgcSrGMfdFDFdwHFd +RWjDDWDjDNjjgDtSRRgjcjzFpnzwdFbFNdbFbpnldwFF +vQfPfTQJbZdThTzL +PrBQJQsfQqrrbfmPqMBfJbggjRVgWjttsHRSgRctDjSs +NgqNWqqWWdnJdqpBNFtCmJGCDHttDGDsHsHm +BjvzhRLTrTBQhTMQRjRRcjPGtmDCZZDZSCmmMSSZmVmSSt +vQzRvRzQcPcvfQzRnddppFgnFfWwBFlb +nnPvfvgrtPDHgvvGTRRRPZQGpGCLLV +FlBsBdbllFdfWpbGMCVMZLVbZQ +lhchNcqFsJBlBszztvwHjvzgrzmzffgH +zZhdjTpJJpjmmpPZhvqnnZHqZcggvgMbgv +tFpFQFSFtBGlFNwFfNMnHfbHcnvcvcfvcqrM +GBFlNLSNVGVSSGtQSLLBBlNtphDdzpmmPmTPhRmdzdVCCDdR +rpRCCDLpmnCdJCjn +vMhSFvgsMGLmnmWMmm +wVqFFvwvPPHhFhhgHPwHshpqrDDzqlfRbpftRLblrllr +CRNDzdJCVDWzVgDjdjzRJzWRMTbHsMNZNbZMMbsfhTtMTLMB +wSlwQcSpqPpcqcqFSqpwslsTfZtLhtlthtBHtTMZ +SPGFGFFmpcPGDrWDmjDJVffR +dsmdtJthJphWqHRPnRRsvvnnfR +cDBMDDDlBZglDZTMDfzVvNRrvNPVHzRRTV +PGMCCDClBDDbbFqmmhqQdpWGmmWp +BJjcGhcvCnBdGHsmHSzZDzSDMHmRMQ +qLWPLVrTwWlwwwrfrFfGDNmDQRMbQMzzmmbQLNMM +rVWrFlGqlqwVwVGgWGphnvgBBsnvsjdBnCBnBg +sNNsfBsmcGmgNTcHHSpnTWHnpV +QlrhlrlMglhDQrdFblvFtMdnDWwSHDWWwnTSjLwVDSwwwT +QtdMvltZhbFlPPZbQtQthZQdqCsJJGzBqqCBmCNCqgRCBsfP +SZnQnnHRWRQRVjHnqlJTQPfdlqfJftqG +pDzmbDBFbBLvvzttfdlTTl +gsDLLpcmsSZVwlnRsV +LHsWjwjWqCLsqCHcLsjdLqcdbpMGZPPtBhthbZBpBhMllwPG +VFnVbbvJSfbgphSpGlhRBBSP +JrrTgmFgzvNbrmNnmnvzgTLjCQWDLDCsTjssjqcHLc +QmwwqTqsrdqNNqgtvnVDVcGNNtvv +WBFBpzzjSJBJzJbfntgPzVzcvPnzDf +HcpbHZJBFpjpcSZrZsdRQZrCwrwd +JqmLmbtTWThBTWvWGVSrrVDsSGSG +wwzRzNjNNbsPVPds +jfgQRZwpQclQfffHgpRpwpfTcqtLLqCbbFFFLmbmTTBnFB +fGpcccNNqcctqGMprvMPmbbzFSflSRzPBBlBbS +JCjnjTZTTGPSGmTFPb +ZWHhJjHLDVDgHLLDGjnhctsstwqctNwWqNwwQrtv +sDwQhcwhBDDwrhGsQnRBQHHMHHMNJMZFCFRbCRftMM +zjjlmjqfdTqlWdzTqmLzlzVjNCHJNHNFMFtbJNZgVNMMCCtN +vPTfLmPTLWBsPDnSscnS +ngznwDPPTzhPPDCTQnTTDQBQqHNNrHFVppbbjRFFqFhHqRqr +tZJtcGsGtLLcctRqVBbbqrspbHNq +BmZSvGBMdWPzMPgnnz +MpNWPVNWWZWVVNZHVcvJjgBjJMStMJSjjg +rzdCzrCTTLRCslvJDSjjdScgDm +RLhCQzqTCssThRQzRzwGQrrCFffbfWppNpWNWVcHqZbHpVPp +zQzCVWdSSjCdjpchWcGftflGZcgG +RwnJTJwmvFHTBFmtBccZZfBGMstllM +wwvvHRwqDnHFrmqnrSbQVVQfSbqQjbqjbQ +ttDftStSlftPgSHmJbFwnMnFwzbrLHMMzz +GqTBqhBqBvppBvMMTznrCbCnLwfr +RBjjpZZvvZqGcNhjjpNmDPfDcsgfDfgScsQQQg +rsSFccvBHppHPsvQrSHSprFjnbLGdbzLfbGLLtLjjzLzvl +JWWJhmwwTDTGtnzlhdbtLG +CWNqWRNCwnCJVppQFFFFNrgHBB +MSRVnMjnVRVnPlcsrtMtschgDl +NWHBwJBwBBQCHHqwWQGBNgdrFFtsthcqdltdDsqttq +CCTTGCNCCBfNJNNWbGGnvVzDSRfDRSZvLPSzRn +MpRfjRjWpZzzzRzZSpjzZjTCQcGdHLWNGqdBdcBWWBLccn +lrbrsPQDPQglDtwggcLCqnCdNNdHBLsqNd +blwbJggvgbwlvQbvtgwmvVwRfTzfMMjFVfSFjZjMTSTSzj +ttSGjHWVrwWrWWvhzvhmhDfR +qMBdNNsccQgfDRzRmqlhRl +gQJdfJPdQBsMggMjPrTCLjrGrCrtVT +tGFdlwDwGFdNtStghWWdQFSnTVfCfZhrfVTVCVprnRRhVn +cLsBPQJsQPmbmPHTnRRnHprCVfns +MjmvPqqQjPbQzjLwwDWDSlzSlGSgwl +NSCpFgfbscbZZZwrtgPZJT +zGCQlVGmmQGVqqJwGtHZGrPHHRTH +qQvVmvzmqCdhhjzCQLjljLQMnMDSFWcSfnMfpbfnNcFFbFDN +zFgqjQBmWNlWlfHrHdLc +wnbCpSSZZTJSJSnmdrtHfGtftlcpltpH +ZSwhVPPJgNVmNFzs +WNVJthVHRRfLqpqN +gdCGcCgJBCrgScRLzbjQQLfRRR +SCFdGSFvlhTJsnvW +FFZwFZZwRmFFhHtNLNLGRtsqjLMt +gbDnnrMbMCffMPbPLNjGNlcppNtspp +rgbzrzDrgVgnrBzFWMWmWBwHWHShSB +zjRVjDqzRjvSBnBGGsfsrFsV +fLccLLZpJMctwJWWWJWpJGCwFwsgnngFBPsCnnTBPT +LbJlZNWMtpMlHRNHzdfSDfdj +VGbbnJGSTsVTssTTnVVWMtfBBmvftRHfHBMJJfZp +ghqtrzgPrjdzQCjmZMHfRHZHBmQmmB +gltFtDqFVlTVWlTl +HqNqZDTvNvVTLPSTvzfrfHfdndffwnbdnwrH +MpSJlFcMJmcpFlmClcMcRnWbWtthrnfwnCGrrWfrwC +RjcJJmSFMRQpMRFjMNVvTZjNPPvLTBPBBB +MzClDtlzJzFzNGGm +bjcLRHlTBsFJGmRm +HcPSSfTSpLZLbSwtrtvMnlDCDPCl +gWWgQJCsVhgRLCWsdjpmcBHvfvrrnvCvBB +TqDtztqtStlbNTPtllqZpvmcFHjNjvjNvHvmrrmj +ztPPGZqTPSbJgchGgwRQgQ +wVrdtTqtCCvbNgbNTTDN +mhGzWhGzMGWGrRmbFLBHZRNHNvZvgB +hhGhShpnsSrqVCVSSj +HnlbmGnlHZHnlBcjgwfDVfwLsGLGLDgR +WhWMWTvQPWPLDMFRCDMsVD +QdzJQPSPZqJnJRnZ +TTjTjFBcRBGjwsDTBLmrCftfRVrrCftCVNRP +WnqbJWnnQJhSqVfVPfDnggfrVN +hSlDMllvhbQqllZlSWQdSQTBjsFHBjTwGdHBTBszLzcc +rNWqWDLZWcqFqLLLgQQJnndnQdNzzJVMzd +cPtsPvChtRsGswHPGbwcPcdVnpzvnmBmVvJBJdJVJdzn +PfRfRGtsHsSRftbbbbHhwCCsjZgSTgSZWDTcgDZjLqgqFWLq +BNzPnPJNNMwHJRhBGRWRdjFQddFlFjWd +npbZrgnLSCSrWFjjdlZGlcDF +gqtmmngSbmgHJqfqzNBHBJ +stgzttBPRRRdpSVVpdpS +WJFcLQmJZHcCFLJmcZLMfbpGSWMNpGftSSpMrb +mcvvQvHmtLCJmHZQHZHCDHJJnjqPjjPzwvwhnwPqTjPBzPnB +DDmbbPqgFSbSQPtPQJttrltJ +CRfcnZWmRRhJNVtsVnQlsp +fcBvWvWzcZWCzTTCTTvccFMBHGDdSwGFFbqwFSGSmF +tCRBPCPRjzsJszBmtjmCvSpHcppJpvZdHHHcHZJG +qbrlLnWlQDQDNvmHHHHcrZZvdm +nmnWnnWmgQsCFzFCRVCg +sHMHCDZfcwMcRcLMcZDCRCHMPdJqgjvVdvqgdgfdJbQgvWQb +FFhTzmzGrnmtjTBjBBprrmFtqGgQqvVdPbbgqQQWJvvWJQqV +TrNjrnFSlwNZNlNL +JQGdsdzSzsdFQFSdssnndNlZjNPTJZNljVjTPhVPhT +GgGLfRmHGLhNVjjNTLhV +HvGvwpbHHRwpBrvBgSSzSFndtzndCrsFMd +DptFshMrhDhDwmPPhwSNhmmS +RLdcdRvBjnvRVcvlcLbCcbCwwpGBwSmfZqqPPPPwzmfqZq +VlRLvVjCJLnlpvvRdllLcJJWDHgMMHDDHtWFFDDQgH +SsSdrndpDlCdLftd +VGPVJgmQrVGHHZfwLlfCTmfwlDlT +PcJHcGgcWWbJpjRrphRbFpRn +PdPSMHMLzPPSShBdffMMzMRHQQrpppcqTCQQpCccTGTRCnCQ +vsbWmFbmJmZFFsmsbfpGVrGnWrrpVpnnVcTV +JZslstfZNNSSPdlSMwlM +bLLzRzZLbRqJJrDGGVZdwssDvGQw +FCtNJlTFtmPfldSvDvQFVVsjSv +PmCPHBhhPpWLWgzgHJ +qwmwFHCgPgPPqPwMCrHHFBVVRBttVRRffVfmsjVNNB +WSvcSnvbSWbhcbjlQbvlSQhlfBGcspVVsVGfVscpzpNcpBtN +hJSLhlvlTjPFHMLCCq +bggDpTggncGVVWbQcG +sRvSwwwFBSpFzvRvMFZqmPmMVqmcmPPVqhqqWq +SRBBrFZZwrddBFRjlptnLgDnTggdtd +PPfMcZMflbMQcMllPVfTVMwjWWmZvpWWpWhhjjpdWWww +sDQNnzsnQgDNsFzFqtGjGmWWSpWrGhdpvphdSW +nNQNqLBHLqzDnHgnVJfPJPCRBbfCcJlT +fppppWsjcSDPjjDpGhgwbfTgHTCbHJwbHbTR +rLBdQnvMNMmFPbLqHqTqgLHCgL +nrFznvMNMQdttrBcScsDstWcPGtWSc +lclnRSDnGZtvSwnZDZzhLffqdsCNwTBCBBdNsd +mPjmjmrFFpmQjMJQjlNdlhCsCLsTlNLs +ggmrHHVVQVPJpWrgpWScRvzZzGGRnZvlgzZn +GjGJGQJGcMTVfFDQzNVQzP +mHqdbmmdnJqVzVhRVNzPbR +wStmHJsJsLZLjTvM +QssMbVGdMQjZPjwVwHVZPZClllvgSgvlTgwwSSCgSCtC +WmmFBmJrcFRBFrJJBFchzWCStgCTgvhvTlfsNqfTlvTv +sFzzssDLzrBPjDVVddHMQD +fztDZSGrNrlnbnPTgFFpln +jvvQMMcLcjJmQwHdJvjQJnnbTbRFRphnnpsWgmFRPR +vTLHHCQLHBBjJCSZrVCZtSfSfrft +gHfHffHLjwHrRjLrLRZVMnTdTBsNTBwTVBsBnN +DWPhqhhDhvSGvWPzSzMBQBQVMMBBmvssvQvQ +CDGbqCDbChSbWGrHcHRgbcVcfrLJ +frlTLmtllbbbdpJS +qFjhzjThjHTFGHTjqhhjMzBhVpVpdbBnSJQRpBnVVdbRRQJd +vjWPWjWPPPWgwmfCrNvTvZ \ No newline at end of file