From 67f7c4c47fcb395f5bf9c3822199f261d8b1f740 Mon Sep 17 00:00:00 2001 From: kageru Date: Sat, 3 Dec 2022 13:13:30 +0100 Subject: [PATCH] Add 2022/03 --- 2022/inputs/day03 | 300 ++++++++++++++++++++++++++++++++++++++++++ 2022/src/bin/day03.rs | 56 ++++++++ 2 files changed, 356 insertions(+) create mode 100644 2022/inputs/day03 create mode 100644 2022/src/bin/day03.rs diff --git a/2022/inputs/day03 b/2022/inputs/day03 new file mode 100644 index 0000000..f41c84e --- /dev/null +++ b/2022/inputs/day03 @@ -0,0 +1,300 @@ +TZZjzzZLfZbzgzZNNJZjwCVbwMmhwCbBpCMMBCbM +qRQPDqnWFQDtCCBQmQwmGGVG +FPllWPDPrncZsLVrgSZTSZ +RczPzRzvflVwfplrZQglmmJJDGQJ +nFbBWWFZbZtJDjmgmqqF +bnMNZWnWWHTLBBdwcCwcPCwpCSpPLc +CjpMtptpChnpMnCSGjSShMqpTVVWFFTVNVNLmHwmHLTcFnVT +fglsGJsJssBPszvddgTFVTFFFBwwTVVmHVFF +JgJrDgsPfMDhGhCRQC +PSMDSMhwmPwqDMmzrtttNQvNFmFFGFtLld +nRTCCQjcTVJJTVTbggTnFvtNdGdlFbFvbHtWFLNt +gjfTZZCRCnZJjJRRQBCBszDMPppfsPwMzfMqDsSs +LTmnZTgMmbWWGWZQZb +cHCCHHwsPtsHQtWfWjtGlWjbjt +JNQQzzPwwHsRwNSRdnnddqqvSMqMvDqm +CZFNGZfHvgfgZzFZfNfPVJMBrqVhjrrrhvvSjbqv +czlDnlcDWLnlnLQwTbqJqMwqjhVBbhJhJJ +RDQTTWzLWsDGsNHNNgpZmC +rWzbWWMWcrCbfzbwpDrQNqmqNwTNBN +FvsVggVvLGsHQHfppmwTNBfN +VGhsghvZLjPSLshgFVPGFPVJWCtMCJMflJtdJWCMcttljz +bgScSbJwPNqrQLCgLg +BzTsRVGmTDBZBwRVmzGQNZjrMCqLjWrqWNQNnr +GvdRDdzGzdvdDdmTzfwhfFlFPlbfchvlpl +JlqjMtqtSGGZjqSMlmvZZbChRRQbbPhBhCbRBr +dLfzFNVfLLzwznLdFzzwWQBQVBhWbJDrCPVBBBPP +HLgdNddfMjGJJgJt +nZHZDJHLTDnrHrbGpRrRzR +QmsBjdmBmqQzpRbZbp +ttSjjjdWvsFsmBMBfWWMMtwCNCZJvLCnnnJCZcLTvnhN +bbgngMMPfnwPmPgPDPNZMtptHzHtRRvpVHRz +rsWWhJCWqBHBNJNZpvJtzRvF +rWBrjGGsQQWlQcllCDLfwHQTDDgfQPmnDT +lWDFllmGhbWzCglHHlRHMqCq +fBtjwNwfJfZvJJBwBJZjVLNnnnMRVTzgMVVqTLzT +vJQtJrprvrbcdcpmzDDd +bmhbRmhjwddjHMGHnNtHNQNm +nBzVpgFnzVgLpFfHNGqtGfLGGNfH +BTgVVPPSPBSVlTzpzsbWhjWjnhWZlwsWZR +lBQVBBMDTMSTHHCqgLHCzv +ccWcNhtfpFvphspFcttHwwqzmdsCqLgLzLPdLL +tNjFZpnFtJNZJFfjJNpNNFjVbVDMVGRZMGlbQlQrBrbvQr +bRJtJRfRdwRBbwJzhGGcHpwrpCwDclpHDD +hSgnjPVmVVGcWVGWpV +STmFgSnPqQTjNmqJftLszfMqBhdz +WzjrRLWnlRsVRLLwtGmdhNBmbmwN +ZccgcpMfQTpgcpDDvNbtdhhhMGHtdFBNHB +vpDggvPPTvZTfTvpZcPQSZDsqrlrnRGjsrjRCrSlWRljjS +DbZfRRZfPjWDfDntnzggvgMLmVqMMmlLQjFM +NCJCCfBTThBJssSHcgFMlmMvlVHVqVgmLl +rfTJJcJrJdShscSBZbtpnPRDDdnPDRbt +zrTfLGVVLZsrsJcGJVsvQMhdlmMPfjlhlflflbDP +pCWCwRbWBgHlDhPMDPRjjd +pSggBwBCNSbrJLVTTVNG +CNCMSMgQCgQNQhfMGSGSzgfGJhchrHHwBlnJlHPqBBrHwsww +ZVWDptmTtbptpDvZWsPlwblrJPbnHcqnJwrP +pRFtWZVVpVWWZVWtQLzsLQMLzCfFsGgz +MlcpDmgWNlPqcmmqmcgcPdNDRjhLSRRVLjRRShGFjFWRSLLW +bwQJnzbzJTbvMJSHhGGHRjzLGRjR +wZbBwwQvtbtQtBbnvJwbCnwmsMpNcccgDmdPcsqqqsDqCc +zMhMnRbZMpCblpzLlhJPRjDFcQPtJQPcDdWj +mNSGvgdSsBGwwNDvWtQJWjJWPHFF +GmdgGdgfqqNBgVGrbCMhrMfLLflhpL +PVHHPMLMgLQSLLsnHBCZfhzpRfhTpdRppSfdZf +rgmWvWgFrmGlZGGfphhpZG +bJgDFqFcmmWDJWbvJFtMCPQsHPHBVPVCQPcCsQ +VJJHNNmtGqRmMVVwRfTCRfnQpFTFnF +vSvjSvbBzvldhcGwGffFCQCwgrFd +jLhhlGjvczDhLSlDWjLzctHMZtJtHmqHJZqWmVsMqW +LhchvRJtHzhdTTdJjQLQjQVVnjSmLMLQ +NFpClSPqwqNgPPNPNglllrBQBrQVjQjmBQnfBfjQjC +wWGGpSwSZNpNPFDwPDDhzDdvbvJzHHJbhtzv +gtFtNNmlGzQtNPttfDMwwfbbMR +LVcBjsBjFJrLFWVrBrMbbMSSPpDPPqVDfpPb +JrCBnsdWJJrHZdFmGglmmg +BmCCWSLmWsmtCCSppSmmpcpRfMZjjBgJJGGjBwZfgjZjFwJw +TPTPnTPrPVvQTTzTVdPMrJJZwggjfHwJJgjHZrJFwH +NQvvNnQPDPhNcstcStDMWWWS +hntthHVQVbbbSzgjgZjngjRD +TTvJJCldFJTvFFTBFlpTzvvsRgZWGWSLGrlWWRSGLjRGjRDL +TzCcFcvcsCmqPMQwQPcwPM +DltVvVLvbGPDhjRhhjSZjSSL +CffszNzssHCCqJjJnqRnpgRpZB +CszNWdsfDWtZwwDG +DdbmddmzDDNbsqzvzmdzsdsRJLjqtVWWjWJBBVBwVjWJtB +CnFPCcCcPFFFGffjjCWBVwwtRwNwCw +QNZlphpNDpHsDrvg +gdHSCbCTGgQbtNLvgrjwNMMwrr +BnzVRHFZVHvNhNRNMMhW +zFzFcnlZPHlbQdlT +GmddjTrgFgmgWGmFvmmmFFfwSCVpwHVrHpwhwrpCBfBC +tctRcRRCMtsMsMDPlDtDbMzbQJJbhwHVQJhBHJVQHBbpfB +tPDDtcnRRqzzcCzLPMLPRddWTdqgdZqZTZqdGmjFWv +sWvfGlGqsSggNcNcmf +JBwwVccFJtrzpMwtrMMMLTnNnJngJgQNSgmTJgLN +wtPMHrRrBwtPVRHrrHVPZvqDWWWcsGsvqDlZZd +jBjBBJRhCJbjffCjWlDfmbFQmZFgPpmmgpmbSSQF +dsqGrttGhswQmqpFFqQw +THdsdrdTHzLLdLTsTdtHNshlDffDCHJDjfBcBRlJRfjV +lDNlPBQlccQttcNBcDPvFFJmdTwtFJFdTdFgzg +bCWMLfpZLZLVhMbGLLsVzTwmhvTgSJHwHdTvSFSwJJ +RCZZVZLZWLRZpZsfpVsscjzQRRPQcPcDQzPljzPB +tVfCLfRVCGTRCPtRMPftHGqpnnqpdzqNbHGdqzHd +DlDlWmvDWsWJmMmmsWvWDlSHzHpnpbNqnbnrppbbpprJdd +DvhWDFBhvslFSDFPVPVBfgwgfCtMLV +FtlLQqlDnMmFJRPM +hwlpwBphHplpdHfZnjRRjMmCgfPZgJ +BdpwvzcNpBrDbLTslszG +RjPhcnNzRcLcFlsFNlFRfTffdhJhSTVqqSdDMVMf +ZWtZgrgPCvrbHSSfMqJTDWpdMf +vBvHgCmgHtgvtrHbwcLjNLNFcnPBNcPLQQ +FZhtMtddjCGQSVjmjC +qbvcnvPqBWcPVVCTCmSQLVCq +vVBVzBNpDNhgdZDg +lNVtllQFQVnQNrZpCtQCdZZjSbfRbcDjZqSfTqDffJ +HzBJBvPJLWHvwmBwHWRsbsqfbSbzbTbTTRDs +vLwPHLLMGHwGBWBHLvBgBVCgrQQpdprNVttQJrpQdQ +TbZDQlZDCHjwtbjnRSTRTPPTBWWWPB +GhpgpLJFcvgcMRqfBBmSQggzWq +LcFQpGdGsrjDDDHssl +qzpPgTpnNWRfTBBCWf +rLFsVcFltVBfdGClPdGf +vmtZvwsZrLFFFrPDqzDvjzDqJMjv +lDlzzsMPDssjsSGTjlTTsqbbftfqNwJNfHqqbfDmbW +FFgpFndhQLnhnLRpQCLnVrgtHttvfqJmNbqWWbJHNHtb +pBFrVVrmZGSBBZsz +bGMfcMCPPCtcLqPLCRqPZnjLVTdnjjWsVLHVlllVVL +SwzDBmzgwFSFQzvgBrgvwFdVHjHwWHJsjnVsTWVHHWHJ +FFrBNpQWpFrgFSmmSpQmrQQNZPPRRbfGMqCGcCPGtMqqcZ +PBhcVpBRPcqHfnjRRJJl +GsMrsGTszsrMdnsGZmzMsCfDtvHfHqvjJlvdqfHflvtq +gmrGMGGmGgbmsrrCThnBFSQSFVFhSnVcpg +QCDnqdqVPswpJZMLLCHZMJ +RhchlRBRWlLmZzVWVJGV +VrhfhhBgTcRTVhdDFwdwqTDnnnjw +jVsSsLjJJmSLlmJSlPthrhHZGthLpZLdWZ +nqFTFNbRfnDCRzfnzqPBpGcdGHttWHdcZGRrtchh +bqNzTTbFTnwnTmPjvwsVgQVjgl +BBlNWWMlVWQlLPNjVLWWGMQcJCscFSmwRCSnCFJscwcw +bbHZHvHpHgrqSCcwvSsFFRsv +wwbhdfdwZlWljdtNdW +NmlnhSNwzjjswNvqqqbjgddqtgVt +TQMTMrFJHDFTFBrTMDMQDQgdnCVggtpLpvggnQdvdQ +fJPJHrFZFBHTDPrTJHZrFswsWnWGmmGNlwwlRsmSZN +bdntqdNMQCtcnnbqtNtcgQWWjjFDjhSBSjJDWSfDFWBc +RwsZzRvZQPQsGPWjphzpfjfBffzf +GPsrRQvvQlwlMnHHlTgMNT +TnnnQTLnBPQMRMpgGRLGwp +VNcvvjjVczRRjsZvvqgmpMGwZWZmJSqwwW +tzvsdrsVdFndRDbdbC +qSfbWlZVPdWmmcjvjjwrcwQm +TpTTpPJzTBnNsshnnTsctLwjvQMzrLrjjFMtjv +NPsNBhNJhBJgNnqSSZlSdVgVGqdq +pQsgcsdSpmsJctQhrhqDHPjrjNQH +VVGGbfvvMMBZPjjHqVVrTjmC +fZbfnRLBfbZGblbfMZnBGZFlzJcRdttwtJtdzmdswcJJdpRs +TDqDqTZFFqDqdDvSMwtCbjbFjbmGGwCffG +hQQnchQZpQzCfmGtblfLhw +RnNpRPrcpsRsVWHSDZSqWrDJ +gLqgTfgwTCwmgWWrfCcRdvBCGGBZjGRvvZ +MFbPMPnNzFbssQFpQNNScQSdjvBBBSRllBvZvc +sHMHpzsJnpNMNnHsnMJbWLVwmwgVwDdDJwgDffrJ +QGdbSLSzBVbGRQrJfllDbnfpJfltJl +ZMwPCFPwPmFgCFvZgZmcFwcPhJnphhscQnJhJnsptnDNthts +PHZgCmwggvMjZFWjFvQTBzRGHqSRRTdRVGGQ +zJRppmjPMCjJgtBQWtZZgPtg +tTFsltFtVGWnllQBnn +swLfbFSvsmJCCSRCRt +MZVRQzMwfRQgQQDvncrvrSHHdSfS +tWWBhJbhnBsWCWCGdDbvSpvDpcrrcqHq +NBTCBJsCTFJFjzjFMwnzLR +RBhlNZsgrZNdbfrrmFGbjb +ztJLFLzLQDtnnCLLCzSTwzJmqmGGjddPmSPPmGjpdqGMPj +JcLLFVtLJDTQCsZgscvlWBZHgv +hznggMvgwwPCDwhnCMWsDlHjtJPjtjrZlljtPJjZHt +mvvGVVcvHJtppGpS +bVQvQLfRRbfFFwhMsFshsqsFzM +BBRWFZHWSGRZvQtQRpRtHHBjTTcqhzfnBcfzchjTTnhncT +PbwdVMbmlDZmNPTfjrcfnzjf +sMVLmsdmldLVmJLCDHFgSJgZSSGHtFppFZ +SGwFSCvtwjjDvDGDCjjDCNRnzbbnpnBppHBNhbbTpqbB +rBBllQlgslmnmbzqRm +scQsLMZsPMVfMrFwBZtvvCWFtJwS +nlhLFFSggjMnLnLHTPlMTSBfRzrMQBCBCRDDdCdQrzWr +ZwFcssmNJqNNcZGFzdBrRZCDCdCffDrR +mwbwGNcwwpSjPlFgpPlH +HsvNvddbZJDDsNbDqvsqNsqnjtllczmjjbBjzjQzjlncnc +VTCTPGhpwGLfChfGCpTrnrgQrlntrQGQcrcgQr +WpPfLTPWPhMPhwCNdStvSdWHHWHDdH +hjtjnnbLMCwCMhbgfJpfDZpSsGHDHNSmsf +BqBQBccqFrWcPTWdWTcHHNHJpsHpmDDsHHSFSD +QRcPzqWzzzrdzzWvTqQcBcRgnhmhmCbnhtvMmggbLLgLvg +zdTNLLdRdTPFFJFllQSzwJ +mhmBmBBjtjhHmjvvBhvthThnFwQwwSnWbGwlQbQtnnGJtS +cTvHTgjCmVHZgHvhHHdRfMddfLsrRfZNpsPL +lfLnsHhHJBBfBGrBpS +VPjqqwVVqNjqQVVCVPNNVQpGpmppcBcDmGmpsmsDsCrD +QdQNFwQdvjvRqFFqvRPqLgngshhRJsLnHLWgLRhh +dwRwQVNwwJQNnnhmBtZZdCZhFBrP +MMHTvMjsWlmhhBrrrlhm +jWTcWWDWsWMTgjMGsHvGGMsnJzVNpRQQDDpbJVbnnwNrnV +NcRvJCGnWnNMwtMPlMMF +rqRLrVmTrjjRmBqjQLrjzZgMgDHltVPMgFbMFDbPwMwH +fzjrZQSQzBjnvfnsJcGspR +fHPFZPsmffftTpsTqJGhhDjC +bbBdcbcwNGzzbNdBdcNQqJDDTJhDCNjQpRRCJT +VcWBbgBMWbMdzPmPtGWZmLWPFv +zDWFvgCCvWDgVVmrZppPbCPZ +wdqsBhcMdbJJmlBgHg +hTwTQgLNMTsQstjzvSTTWjvfRW +vGGwWsvjpsCShrjTCCrj +CmMCZCtqzmMzNgZgdZzSrzPFrThnrPPHTcrSnH +VVMtQZdgZqLtqLZVMffwwDRCLGWlCsJvwpwlRv +fJfhpVVzMpgczZSqSSnZ +NvPNvRsmNCRsbsvNbhjqgcDZSqSFFmgGGnZZDg +TChvRBBRPsJLTMHMQfwV +CvNPsrfrjvwwfsjwsrNlgDzzBmgmNhlNBHgg +JVmdMJmcMTSqVlnlnnzBHBGg +SmLqSSWqbcbbWqJqqFcTJfPwPwtwWCfrrPrsQvQZZf +hMRnnvfRntfvcGqccDqhHlSLSgjGLWlLHlWPgWPS +bJsssbJFCZsQCsdQFzJWwSPSdSgdWwvwmHWWmj +QBQbTzFzrrzTTtfvffcfqTDM +fdcRNRvdNwczRFLcvNvzRvDSjhlmhclShjSnmMlSmDSS +VtJqbCqqVCfQqVpJHqZfmGDhgmjlMHmDllmggShG +qqtqTpVqJpVPZbffWTNfwzvRrFLL +mmhccmZGNcNhWNmDDGCmvlLWjpjbJRSpdrnzzbRzSjLJpJJz +BQHBgtZQqwTTtfndpSJJbJfbjjRp +THFVBZqQsqTgwtswWWlMclMDNlNclVVM +GPmLbhQmDbbDHfpCQCfdCfTr +SlWVScMgpzFSjgSMtBjTrNNdrfjrHrBd +ZzzsWWnzWFcsRqpJmPhqsw +cfNQdfdRcNHNFcqRcqqdWmLQgMwwMssLggpLLsmm +rTtGGhBTJSThwssmgssGzpHC +VbTTlJvVHbBJthtVbrJRdFnjljqZdfPqPnRdFN +tLtpstBLtzPnQBtFBtMpnpQPhmGGRRhMhGNRRCCmRJmmbvNJ +ffflfqqVVHllVHDVNVZHlTDGSGbGSvhmvTRCCSTjShShCv +DldDlZgWcDdfDZggfddccsnzLWsnNwPFQzPBwLwzzF +FpRCrNpMrCpNRZCrsCpZrCpqvmJnvnLPBwfvfmvzBJnwswBw +DbbVStQgdbJmLbJm +SHlSShlhSHHWcWlghFMNqcRqcZrFpFppTJ +QFPnsjqjtQPWfCZZlZbT +dwrMzzWRVWJVDDlfDlrfDlhl +BNzVdLWwRNmzwWBRVBVzSQQLtnnqSqssFvtQFsjL +TGfDmTcCMMmDsCspRbCCbsMJvWPvSSjZSwhFwwFgjPJZwG +NNHLHBNHrgVFFjJwFJZLhv +BzzqQQnVtrdnVNrtVNBlppbbDCRmdfggRCgmTscf +rmbcvbRbzrsZZCCNQjwdgRGjwGQGLVML +htDnDtHWnWPjVHQdgdNwHg +PFFTlhllffsNsscl +hFSlSlShLppwNlwH +fjSvvfbzBfDjPQvBDqjfsBGdwwLppMHmmHHHbNNwGnmG +SqzVBZDPPDQVFWgrWJTtCg +ghlqSlFhCFRgFsssSqjhlsVsvNPtcNdndctVzdzJPndQPnJd +TwfBmZmLwLZDfWZTbGQPtvzJzdLNcLdrQrcL +GmGwDbZHbmpBmwBWmGDCpvShClvSjgMjRpMqjv +vDDQpzjbqDQDmJvmRFBgNdWcQtdcHcctWcdN +hTfsLlSMCCSCfGCPlhfnGtgBcBHBdgLdVttvNtBBdg +lZvlfPffnZSnMzDjzzmZzDbwqq +cwgNgWWNccLcHnLGnnHD +JRrPNPNlGHPDtzLv +jmBJljNljRZZbpQZBgZp +WWcWLtwHcHLwWRwPWDwZGrCMvvFvZnDrvF +JVVmdbZmCvzGCvzm +ZQgdjVgdjQhJZQbhblbNQqjJLsPSsppscPPWhhWtSctpHsHs +fZtsGZsQQtpFrLqZrLQGZfHmdBjSMNmmRNddbFcMcbmBcc +vnwnlhlTWllgnJVTTgDTnvTwdcjSbRdbHMdcMMNdVdBNjRHj +zDvHnPvTwhnDDCZpLLftqzffst +hdCvWvQQlvlZzgCcGgjCPSLC +HMTHMDRRtmBNtTRDrRmmPcjGPPrdSzcLjjzdfzzL +tqMsNmmVMTNmtMHbZbnJdblZnlwWbV +bzQNPzMbVrfPfLrjrj +ZvZnzsTmnlnTWnJTvSHSsJDvBrdwwwLBtjrBBRtjwHqqrfLf +zpWDWSnnTnJmDzSMNchQcGNMQpQGGN +McCNssGmscnNmmsNzLwwLTSTRBJBBZLFTz +WTbhQbfPvWThFwFWJHBZWwLH +jThbtbPjvDDvDhqjppdcsgcGGcMmNlNldtNt +VsRLrPMPrrNRRDMDNsDMRdGCdGGZZZwljjCCjHCHQwcG +qhmfBgtqlfqzfTtggSWwbHjcwGjjbwwcTQCC +lnSfStzhvfvzFgvqsLJLrpPpFsRsMNPP +mFfWmmTbcFNFZWbcCftLCsCLGLfCGqGV +DQQMlJhjGqtswZDD +BpBhQSSQRSljRJRvQllnTWNHrWccHrNppbNZWp +llSWcPmCDRCSmjPTCCSPHtLrfJnwrJfVBRfJwrqB +FFFgdFdpGVHtVGwBtn +gMbbsNdvbsQgppppvvszvzWTTTlMCnlPDjTlDCWWccmC +fzMlGqVMwzSSPNRBrRZrFrFRGZ +blnlQnlWFZbmFbHr +CgttsQpstcCtnslqfjhPhVzMgMPz +SrSHtjrJQZjBpvNctmnRvnDm +GWPlhPqFfPsGwCqsnsGszWGwNdMLpRvLmRNcNpmRmvDfpMLM +GPCWWWzbbzqPnnCbPZHbQrQrQgVBVJJVJV +ZVhCwqvFZVpwdhLdqLhtvcGBcSNLRSRBGRBNGNSSmN +lTjnlnjgslsjJTgrMrQQjjTSGSpcGRSmDBNSNJcDSBbRmS +zMrjllgnPrlrnlWrQgTgzgvwqpFwZHChHvPwCtVptCVt +RTjjznsTsnnrzRrmTmrNNCMhwMrCNNCwWhCMGN +DvScpDDVfBPqVcSbDpbfHpqwCWGJCwCJhvFdFFwlMGJWCG +fhHPbhZSpDbDTmsTZTjRzzQz +QbVQvNrrdFcbcMvvdNrcGrrczPnPplPnfnpzwpgmlflRVwwP +jBHLRqZWtLLqWDhBLshBCLsHgpfftfPmmpfpwnwfwJgfpfPn +WCRhsLDsDLBChTLWHChFTTMdGTQGvGQcMQNGMd diff --git a/2022/src/bin/day03.rs b/2022/src/bin/day03.rs new file mode 100644 index 0000000..3b48a5b --- /dev/null +++ b/2022/src/bin/day03.rs @@ -0,0 +1,56 @@ +#![feature(test, iter_array_chunks)] +extern crate test; +use std::collections::HashSet; + +use aoc2022::{boilerplate, common::*}; + +const DAY: usize = 03; +type Parsed = Vec<(HashSet, HashSet)>; + +fn parse_input(raw: &str) -> Parsed { + raw.lines() + .map(|line| { + let bytes = line.as_bytes(); + let (a, b) = bytes.split_at(bytes.len() / 2); + (a.iter().copied().collect(), b.iter().copied().collect()) + }) + .collect() +} + +fn part1(parsed: &Parsed) -> usize { + parsed.iter().map(|(a, b)| a.intersection(b).next().unwrap()).map(priority).sum() +} + +fn priority(n: &u8) -> usize { + (match n { + b'a'..=b'z' => n - b'a' + 1, + b'A'..=b'Z' => n - b'A' + 27, + _ => unreachable!(), + }) as usize +} + +fn part2(parsed: &Parsed) -> usize { + parsed + .iter() + .map(|(a, b)| a.union(b).collect::>()) + .array_chunks() + .map(|[a, b, c]| *a.intersection(&b).copied().collect::>().intersection(&c).next().unwrap()) + .map(priority) + .sum() +} + +boilerplate! { + TEST_INPUT == "vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw", + tests: { + part1: { TEST_INPUT => 157 }, + part2: { TEST_INPUT => 70 }, + }, + bench1 == 8202, + bench2 == 2864, + bench_parse: Vec::len => 300, +}