diff --git a/2022/README.md b/2022/README.md index a64e9dd..9c0842a 100644 --- a/2022/README.md +++ b/2022/README.md @@ -6,7 +6,7 @@ | :-: | :----: | :----: | :------- | | 01 | ✓ | ✓ | [Rust] | | 02 | ✓ | ✓ | [Rust] | -| 03 | | | | +| 03 | ✓ | ✓ | [Rust] | | 04 | | | | | 05 | | | | | 06 | | | | diff --git a/2022/day-03/Cargo.toml b/2022/day-03/Cargo.toml new file mode 100644 index 0000000..f19cc53 --- /dev/null +++ b/2022/day-03/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "aoc-2022-03" +version = "0.1.0" +edition = "2021" + +[dependencies] +itertools = "0.10" diff --git a/2022/day-03/Justfile b/2022/day-03/Justfile new file mode 100644 index 0000000..7d08527 --- /dev/null +++ b/2022/day-03/Justfile @@ -0,0 +1,5 @@ +@part PART INPUT_FILE="inputs/puzzle.txt": + cargo --quiet run --bin part_{{PART}} -- {{INPUT_FILE}} + +clean: + cargo clean diff --git a/2022/day-03/inputs/puzzle.txt b/2022/day-03/inputs/puzzle.txt new file mode 100644 index 0000000..1fd48d4 --- /dev/null +++ b/2022/day-03/inputs/puzzle.txt @@ -0,0 +1,300 @@ +QtGHnGlcwQGvHwMHGnnGfRFCJnRBfVVJRVBfCFBh +qsDjzNWhmspNNqVrfjVfjJCbBVfB +DLhPTmNDTzTqzpmzLpswGMHtMgwglcPQMQvSGM +ctwDjvgtltgglHrSHCsQWBBDfS +ZJZdVnmhmfCprnBTfS +dNddhhdPRRdbdNcvwCPCgCctjPlF +MNNDGMWrQsfhtrTnrm +jcvRPRPJdvccRNFNCjLdcwJCSHtHPmzhsSzPHmfhnftnTffH +RddRcjRvZgZNWNgQQb +fPrvhqhRPSfCCfhrqtbtLcmZmtHCtpCFcc +WFQJlTdzgGJVQGWQTzdJcHbQZtLtHmbbZMZHsZQm +JFNlzTBNJGlNPSRhfqRRrN +tdVVgttdDtJJsNPmzdQmjcPP +CBTMmmmbTBHqHMwQcZPWWsWnzbbnzW +CGlLFCTMGvqBGvGvGSRSRfmtRRtgVgrSLS +LHSGJLWZLqHQHpRHRz +bpBPVtpCwPgBCtqqvzfzMQvjbbjz +lhVsTgPlBNThpBNwBtVThPnrGGWJZnLZFnFrGWsFrWZr +nQbbbjpnsdsGCSlmHtJmvljHMjWt +cDcgThLVcPTHVlVlHllvWp +cwpgghTcRRczDhnQGGCSdfszdSbS +vTMFDNTlDhjTDNMNJDwmWWWfGPfLnnzLGfMmmL +bVQgbpqqtctzLflltnCz +VSqlVSHRFvNwJSDj +RfZfjljffssWLWPTGPjhzT +FDCvMDMJJpBJpBFJCMBDMtPbWbLVPGztWPVTtPmLWGhQ +DpgHggpwBJwzJMrFFvrCrHsffnRScNsdclSnnRnSNs +wTvfHSvSwssPGCLCPhgSCn +QNpMRqRJQMZlBBbRRRMfbZlBhPChghhlChGCtnthctjPhchh +rrrNBbMZqRbqDsFHTwfWTFFwrF +fVgfQhhgfTLHSLNZZHfZ +CDtsqrqlDtqDddsqjsstHrSlNLWLcSZScFWWcNBFcBcc +jrCJrHjDCMMDsJjJMstThppgwvGzVGQzhJvvng +DGlTlSzbSnzmwbmblTBBPgffpNjFHppZBH +WqQdWqqJdCrtvQtJLQjtdcBNfPsNZfHZZsHNNZHsBBHL +cCJcjdRvqrQhqvWMzlbDGVGbSMSnbR +BfQmpfpmsRCRPDSZVSjjSg +MhNJGMTMHGGTbnGMJrbJHTzzdPgSwSqqPjPdZddSqNSwPZDw +TWbWbhnHWBFBFBDD +FrlJbTcBTcrlTlqwZTwWdhWLChLtVhdfLhmwWC +pppSpzBGMMMjSSMSzMNzHRSDVWGWDWVCDtGdtdhLhftthd +RNNgpMPRNgzggFJcBPqFZJZrbc +SdvnnvvntnbDDqtz +wRpFRRspZhgZgFggFMgtczcGGDzQcGlGDMqcDG +CLLCFNZhsppRvvttBPCjStdT +JJDMhSwmMwBnnJPJmQcFtfQtfgQhQQfcgH +ZvCvTGqGVWTZZWptQggGtHfDgcpz +dsVCvDTZWWbZqqCZqVsqsqmNlPNnSJmbNNmlmMSnJLBl +MGnMBMBJFpBcNpdwRWRvRNdblmwW +LSgtPCChgjCPgSSzCSqWLLbrdWlmwmwmFvml +QhHPVSHghCtQFgCzgQhVnDGMGffnpcZMcMfJDf +QwrJqMLRLtBQRtWLJLvQLMrMgNNzPDngNHlHnbbbggHlgZNt +GdfThGcmShTGSfppmFfTHDNNblSZDbbzlBzZZHHg +TffmGBBFcCFFmTGFhBwjJQJMQWqWQCrrvQMR +mRbrjZzRLchHqqdLDllh +mCGCsJSggCmgSGShlhhDVVVwhqSltV +PsfsGNGJvGPfspvcmrTRBrjTZzvT +NRNqFFtqqFrDDQRcJJJNrWDswHwWwbDVTgTwLbVlVD +ZpdHHGPmgwTwldbw +HnnnMPMzChPmnpnmfFJCRqcJqJRRrrtSBc +LnNNLBmTNBNTwNZZjZmRMHJwMHvbWrvPMMWdcP +GtSFDFpzsGVvMJdJsrMbvr +SqQQGGtqqSVtDpGtplVDpVJClmnhnTZNjNfmnmBChCZL +CHltTDsjHNHHdpDRmqdPQpzd +fMMbbZwLJgMVVFmcRqRpzdqbRm +MJJWfnVhMzTNGlNTsh +WtWbtWvrrQGrbcSWHHfSHfgdWJ +zpnPhLPhPnTMMnzMzpMnDzLPjTVjccSgdmjdvSJdHSgdjScj +qqvMMCnDCCCzqqCzhPlLsRsGtrsNlRbZtBRtbrrQ +mPTmlGQnjNTPQQNljnlQnmmCtgRPhghqgqgzqLRPtMqqMzhq +pDsVSZcdVspbdBpcBHBcHhqLWzMbfhMMrMgMgzLRft +pFZpJJFSBFRllvlFNC +pbMVjJbwbbLqlZlstRhjstsN +FSTnfCBcnBSBvSmmCFCCRQhZBZNsRGlsQQNsqZlG +dvcdfFcqmfcmdMdJgwJJHMbH +QSRlWDhQQqDqlTCjTRCSljSmVsPmmGmzsgvppzPVVzdPSP +HHwtMNMZvfPGbdwdggwG +ZFcNMFFvHLMjlCWrqhqchh +jccDSGVVlRLVSVVScWZZwLvbphgwdpLwZv +BQHBtfQQHBfmMtmFznrHzmDwghWphvZZFpDhZvgvpZhh +DmQrPQnBtTnzrrfHrtfMrmTCGqPNjSPCRRGjRCRRqCNjVN +bRDbbtVgPFFbDfgVCtPcGsNNsHccqcGGWCNNzW +ZwlmJwwRSmlJdQRhqGNTqzGTwzqGhc +ZQdZjpljldrSMjmjdRLdmdbVvvtDVFFffvBFPVBgMnBg +rzwGrwPGppqzPMzrdqsssSsvgtQgTTTJsH +LCNNHLmHWvCJstsJss +cfVLLNBmZBVMVDHGwrhM +FCGFrJltMGdFdGtlFtCgFzQfQnZfVVVMDcQDVzVjfD +PSPSPZPRbPRsbBRbHBTPvfVzQcDQqWWnDjnnHDjzcz +RmSTPwSTRpvSlZglgZprZtNp +njtLGLbcNTbbLnLmNTtqnFzVPwJFFzPVFPwMVmfMmV +srpZlSpsSVqgSPJJ +HZsHsrZhrBQpqQvpdprnTnnHTbGLbHnjHGbjbT +vFFnJjvnVSjgCqSCDZ +lswrrcsQrHTHwdrDdhmqqsRhzmggghgsGC +QPrWQWcDNDHdddNrQPfDMLMLtvvMbnBpPFvpFFvL +LgltlRMtcccgMdlzqTVwwrdsqm +FpvfSDNzSpnvGSnNpmsmVqVVrHwvTqVmmw +pGjDFFDpffnWQbnzjLJhhLchPPJMPBLt +lJqBqPvtvVPnttnJjJBjVMzMrFhdQrQFbGbQnrbzGG +msRgTgmTLLmsTDRfQRllMdGzdRbMHQFF +msfDWglWTpSLCgTpSCDsfPjvjtwVjJZqqSSvPVZSqB +VZZWGZGlZZZMZrGMlQBQGWltFzqvzzcVcgzvmgzddccgvqFc +rLjNrDRLDRLTqdCqFCNzFgqg +TJSSbHfDDfSnbpHpJnGhWPtrZWnPhBwWPWBt +ssvsDDjNwhjNhGGgDDRZllltLCLvCWbMffLCfWzb +qVRmJFSQqqVcqSMWMWLMlllbtbVM +PqQBPcFJFcmdrJPJrFrQpsNjnTGgwTwGssRNRnRBsG +sHsJJfSsrpBLHCLJmdqgdZgRNZQlgRNC +VtnFbhFhwjwVPPjhbccQDQqgRlWDQmdWZZDd +hFhFvbhGwzvFbtbPnttGbtjsLBfspSrMvJLrpJTrMsLZrH +nzJDJvvZznnqnZrpTgTpzzTNjlmtsglBjjttQQCgCCtlBj +SRLRfdVfSVcfHdVVdSLdMHQjPtClsmcwNQltjwjCQQwm +RShVLWWfWWGvsTZz +vcdptvndNzrndjctrvcnvtTdbwwRTgwbHDFDTWgqWlWqwqbl +ffVBmQPhshhfPmSfBPfChmmCWFWbDWFbWwwqRDbsgwWMbWFb +SJJCBLZBhfvnJnpGtvRc +HLMMHHpNqWHqFqppPWnshtsLhBnVDtthLLms +JgmSRgCRGbgwGSbgJJjRRDntztrVhnsDrllllwhhzt +bRRCCjgRvJQQdcdjjvRcQdgbZPZpqfqpHHMfNFqNTPWqQWmq +PPwQTlFrLqrLQrPfPJrHtcjtSvdCNNctLCjNdc +DGZMhmVRMGqVmVDnGMbBZhsjHNvjdstddjdjccSBSjds +mqzVnWDmmGzRhqRbbWQQFwPQQTlzPFpTlPJJ +RMmnMrZMlQQpGrQt +gPPgcDBcjdgjBCBcQtNDNzzthltGphhz +FSvPSSjFWFScSWdjWvbTwWJQZQVRsMTQVwTmVR +PwlbMTDQDvMwttThPthhvhvvZzNLzNZjQCNNLWLCRZWQRzNW +VpJHFpgfqdFqqHFGHVSdGmZZRnSsnLjNZCWmmszLSz +drrJRGJVrcMBDwhDbcMh +hghHTgbwHbDqHrgbbbSLzzFNnsVqNVBnLnfs +jMlcMRRmGcRlZQMMJRJSPPmCFzBBzpfBfLfpFLszLNNFVCfz +JlmGlZmvRMgvrgbrrSTw +ZtTTHpprHtQtHtpqPmjVSScjVSjjSNqw +nRvGWhRbnRGzvWCBGPjNdwcSwcnlJdmmSj +vCbsmbWfRsRWWzsMWBQFFrDZpgpFHLgQLMgQ +QlJBfZssjgZsQsDNbScdDZdNcvvF +zrGrVVpVMWMwMVLMwqVWpRdNFSDcFNDFbSddqHldDdqd +VLVtrWpMRCRLWGWMRwVGCVPfCPJnBTQsJlmjsfsPBQjC +GQqpnnFWFcnWpBMhhSZRhQCCCfRQRD +HsbcczlrjzflffLVfDlt +jssvwsHPsjzWdMcgBnvqMB +JMJdMptTbbtpJZhtTMZwJdNWQBPNBlwNBNQWHBCHHPlg +rVqsvVmjrcCqCPsPNQgnsnQglW +rVvzfqvLjFVDVcLjCqLmJFGbpJpRJTGMtbRpdGRG +LrmwdZHlSlcVlSrrDWCzbtpjpgzjtD +gBGgPTTBqPQTqnnPJhMTTCzzppnCvptpnCtzNpDntz +qQPTTPshRRQqcgsflHZcsSLV +smvdTvlPzslmVjMhJlbjrblJ +cqFffFffcwFfpcDSjcnZwZWrQVDrQBhNbrrNBbWVbNhr +nSpRZRjpcHqpCpqnqFRGmvPLtLGmCdCsGLLdtC +PJPLPPHDdPvdnbctfcpt +NRrGNjNzLjltppvpRSRS +LzVWLjTWGLQqBgZWJWBBFg +znzccGnswWrWNCpvvdTCzddC +RfZlRDDDZflSBMhhhPSMMZpmpHHGNCGTmCJTmvmCvJGR +GbBMhhbSMhMffDMZPggSGfhVWLwjsLttWtrjWscVLWnQWswn +jwRzdZZhwhwHSQqpStJHhp +GVGPBvNPvffpvtvp +nsGGDVtFNGgGWjWlTwrwTmjwTR +MQtmmMMmnHGGTmhw +llqvqvvpqdvvrSfrpSfdfnhFSTMNDHFMNFFSGFwMHT +JqvvRgpCfrzCpqqzdfRpRllWZZBQJbVVtMttsVWJbjPbcc +zgqBczqBbBGjdHVgdDFd +lNVhNNnLtZZZGWjdWrSW +PCQhNflCtCwtJwhClMmVcRmpbPqTcmBqpm +wWbqbTwVrQLqlMtrZtZffNfMfP +vhjqqRpRvZsfssZN +ccBjJBqGpRhDGbJldHlgLwddLd +hVScjtgcchVhSgZJSchVwLbNLWnLNwwnwrbWNLgr +BzMdBqzBQzZQPpfrsrbrNdNLsrRR +zPMzmmGpmzGlFQPPmlZPzSVTSVJJcSlcDhTlvSCtjJ +hzdwlqngZQvDfmzF +vcRrcsVNpVQsFfBfPPQB +HCHVWVcCpNMHWRjLwhvhggdjvggM +LBHCTPzHHBcClwppwjjNNl +JddZMRmmssVmvDvJddSJWVWBwpQvwfpwvwwfrrFNQfwjpl +BsVMVZDVZssZhMhJqLzhzzHzPTPnLGqb +bcnNQnBTvvvWTQTJhdHJzhSjpJJjStjd +mMwqwVMMRwhBtjdSVBVl +GfsrwCRmZBcZTvBf +bBjQmmmqWdLqvLbWLtNJccNZZgCBCZgCTg +phfpfzpHPDwfMwvVzlhlJJlggcZgZcRFFlCgZg +zfhpMMDpVVzzhHhzzMMwfnMfSmQmbQvvWqWjmLSqdQmrqjjn +ZzdcbGTwLZwPPwpMPWpjWPpWChBC +nmznNRFHQrqQvqqmmMfWWWpMFjspWFMWjB +zqRDSmDrmvnvntGccGdcTVtLTlVG +nfnVscTcDzsZqmRtjtsqjJ +wnnhWPWLBNwPLHdQdWdHPHLdJjqRRqrvjrmqFtvRqtQRqFjm +bWhHdBBLdLnShWHcTVzCfCpVDTblpT +WSjVFSVTSWvgvFwpgTTFsfdVclhNCfsHnHlHsCfV +zRqLqZqZZQcdNltfHzsd +ZqBqGLLRcjWWBvTT +wwBqgZfbgbZsvWmfJrtFrdDttqdFdLct +SNSSVTnnThnCSPPnzVztQJJQdLPtFcGLdFGDsD +lSlszRVsRjmmfjfRRf +NGzGWSLzMdQtcctbgWjt +vqTnfVVHBffnCmHgMtrrrHrgtcrt +vqCDVlFnnCnnBSzlspSzLSNMLL +rwVlfVMRSTqTgRhT +pppjLtpZjHFHNhsctSqDDVtnns +HNjJLFBFHZZzWbVBZGfwdGrMfCCfGvmzlM +zFzztqWnJttqqzJtdqbtqbPVMGcGZwgPGVwGQjwCCggMZQ +hssLlrsSrBmBrZGSfgwgSwQCcj +BmBBDBHLrlNhLNHrpsDvLJNtddczdRzzcTqJzzdWnc +pLWcpGSscLQPDzLBgdbmdZHBHmZB +lntfCfVMvtttqVqnZHHbbBZmwwwCdHhc +qqRJFfRFRNlTzSSWWzSJpc +DrphDfFrdGGjTTgTgCSV +vbsMZPnPvqHMQvtZZPWBBVVBJjWSVTPjJC +nMbnsRSQvvLRMsssQhdFrcwczLlDrrDzhz +LLlDQlcLDqLSlCDRlRDCqTTzzgNzShSBdZGBFBBgNG +nHnMwPPbrWwpmztdMtzFZZFtTN +PJfbZmHrpJfZDRLlDlLcVsVJ +wZwQsrrzQFQSrRSFbzDglcdCcdljjdlljcvslLhv +VPqGJtqqfnJcCLFllFMGcd +fNHPJWpmHfffqJHmwzgbrBDZrDbFRQ +HggtSJtzrgltshlTsrzbzsgbFddfffDZwZRZZZGfGDRTNNZZ +LnjWccmQBPWqmWPqMfFNdGBRCDFFSfDfRd +WpMjWpMcWSjqqPjQLmvmjMgllsbgbtvsrrtvJgJHhrHl +PMcMcBpztMztzPPhbSgGSvgfHD +nsmsVQVZVQmTRmddrLgfFhfLgLDzgvffDhbF +dwsjrQQrVwTmZRTzsTdBcjqlqWpcCCppcllltC +DbVjbjwNMDTCVbhbTNDrVTTmzFGLFLHcLHzmcWFczLHwmH +PPWsfBZngtZqZZnPgZnPqvmFmczgRHGmGSRRSSLGFF +sntBlWPdnspnnPQZtnNNNMjhMNrVMjMThjpr +rCrCWVvvWDnBWvDnWDMCMZTpThhGGhGRGqGqZmhZqV +NNjQMzNzQjjwNmJNmZddpdTG +QwtwLPcjPtQlHSSslzwHSlPQDfDWsggsvvBvDvnvgngCnvFM +ZDCbvbDvvHbCGTWpZTtWWQnn +hLqzLVhVwNwVfMnJrfqMzWrQddgmQQGdgpgQGmgjTj +wlVNwJJfVRLPRnHRbFHRsP +lLmvLGRCrmDwVPVsjmtBBQmt +NSHWNbzSHWpSpfChqqJPnzBJsBPPJnQJ +pWcHbNfWpgZcWbhbZSgchWpRdCZMMdGDFFrLwlwMRRZFdd +PnNrFVZQHNDrmNQPflbhbfqbvhwbVfvq +TCdTtpCtCWTBMtjTJMWtBMCLSfvbqqzqbljflwDLvLjLLf +MCCGcpCJRWTTMGmPnDFNQQnDns +FhSmttZmgLjJVMlVGllGjcrj +NRNvNWNCdnNrBvWvwRdWvvvRCGcbVVQbMQGcGcVcMclzVVlG +qwBsBWwnvdtHJJSrtHsr +wnwPrnBBPgqRPjhgCRGCLvvbRZcJvCbb +dWVdVdlMHtsTslMtzztFGGczvvGJzL +fMflHpddJfNNVfNWWmDqQpwBgwnjPBQDjqBh +WttGctsNCNrfwTMlBtlr +HJLzLJJVnFjHbnbVjDHDdFqwwffTTfTGwrqwBBTT +jgVgJSbnHjNWsWCSWWGG +ssLfHLvrrfMMlBMRMfpd +qbbhmGCCVDQhQQVzDDbqmhMBtDZdBZHlddpltpBpdlJd +QhQbzqCGzVzSbqzLHjLgrcjvPSnnSL +NGGZGsGFCGvCcnCcgnZWrPHjsJjHjTDjJHfrjHDP +RzzQmwwmdRRwMqRQmZwtfrDPfTfrbjHqrDPTHr +MBLphmLpSzdRlnWZCNcGLgLG +LwPPHZLLWRMWMsHqTCjmTTjSTn +lFpNNpzplbfphzNcQzVcpvzsnqTsggmnjfgqCDsnCDqsgS +vFJJhQVhbcVddLtmWZJdmm +GwMNMGBMRMGjdSGsDntglDrDGQ +WTmPPzfmlQrsnQmg +ZPTJVvllhBwvLvwRwj +nlSvqqFqzfnbnvFwwsGHTBHgPfWsTrRPgG +dMdjphVhhgdLVJhNRBGPRWWBBGPTTGHV +thJgLpghLNLhNQMCtdMhSmFlQnzzwnbzlbqqSQFb +ZJJLBWhJBNwJwLvgRgGRgbZqbHTbGT +cCrfFFnzjmdrdrmmzsgSPSHSbHWPRgrgGR +dmCFntnFctjfdVtttjtDVncfBDlNJJppwQMwNBNvvplppWNh +GGNNNbNbqmsmTVbCDQQhDJQT +rgPvdgMdPdBddvMcrMnvgcSwhClTTJCwClDTvLJJthTlth +zBdWpnDBDmfFGRffzH +WNNNWcDcdVHNQTNT +lLvLctvrvvvPCpHLQQTZVQLTTHBV +zltgpbPCrrmtlmrlhhbqcWMqDDMDFMfbGScc +dzSHRCGZGdRQWQWtllWB +mNmbLbbmwjsmsNjDmcPvpVHBVPQvWDWBBpvB +jnmNNrLcnnjjHhSCdGMSfrfd +mgGvfvJSmSSrbvScmGccTPCqNnRjlpNNfNjqwqlpNpfw +zZLLQFFFtsFwWjjRqbbCsW +hBBLBdFHddVrGbVc +bJGchsCcHwbHfgvg +qdlSSNqLPqlPQZDffgfZRZMghvZr +PLtqtFTPNLlWlqtQqqQzBBmcnschGtjtnChmzC +llNLDLzjDtCTVtClCDMHSlmwdmmdSmddwZSS +gPJszvsBPbwSHZRQSJQJ +bgFssFPcWhDjCzLcnNDD +ZTGMwdhMwMJphZMJlNdVBCnncNPLBCCRPnCncn +fWsqmfSsqvfFFFvmWjfSSsPLCwVPRnPRCmRnRRCVzRCV +FQfQfvStwjtqsjvvQWFfWqWtlMDdGTJJGdMdhJtDMbllDZ +DzZLpBDptpVPrrrFPqRmBj +WsfCTTgMllCWJMlhslNsCFJrGqvmRPqmqZjGFjvmvm +HfghcNghHhgNNfbDDZdcdpndDzpt +RRBRdJfccVRdDJqdDrvwShwvztWJlWwSJn +mPtCHPPmHbmHNZjjjQHbMSgrSWhWzWnnQwvzzrlrll +tpFmjpmjFMCmppmVTVLFVfBqTqVDLd +jtljZcTcVVtdggVmdczzzDPzvCsvRbDsDmvm +MHHnnJMFMNpwSNprpMJrfsbPRRbWDGLbHLDRvzzssR +rJFNvQfBSwQBwNwldZTqTtctQchthc +WsWTWsfjgTJGSnTz +RHNmvRLCpJclcNcvHpNcPBzgQgMnnGFnLFgPgnPF +mHlcdbbccZcCCCNZZNcCWtthWbWqwwJsbDfthfwW +vFFzppnHFrjmpljQhg +JPGfPWVdwfPgQzVQlTrQrZ +PwRJfGDBfCHMzRHNHMNR \ No newline at end of file diff --git a/2022/day-03/inputs/test.txt b/2022/day-03/inputs/test.txt new file mode 100644 index 0000000..9919ffa --- /dev/null +++ b/2022/day-03/inputs/test.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw \ No newline at end of file diff --git a/2022/day-03/src/bin/part_one.rs b/2022/day-03/src/bin/part_one.rs new file mode 100644 index 0000000..bd2f720 --- /dev/null +++ b/2022/day-03/src/bin/part_one.rs @@ -0,0 +1,21 @@ +use std::{collections::HashSet, env, io}; + +use aoc_2022_03::{item_priority, parse_file}; + +fn main() -> io::Result<()> { + let infile_path = env::args().nth(1).expect("input file"); + + let sum_of_items: u32 = parse_file(infile_path)? + .map(|line| { + let (left, right) = line.split_at(line.len() / 2); + let left: HashSet<_> = left.chars().collect(); + let right: HashSet<_> = right.chars().collect(); + left.intersection(&right) + .fold(0u32, |acc, &item| acc + item_priority(item)) + }) + .sum(); + + println!("{sum_of_items}"); + + Ok(()) +} diff --git a/2022/day-03/src/bin/part_two.rs b/2022/day-03/src/bin/part_two.rs new file mode 100644 index 0000000..9c605cc --- /dev/null +++ b/2022/day-03/src/bin/part_two.rs @@ -0,0 +1,27 @@ +use std::{collections::HashSet, env, io}; + +use itertools::Itertools; // for easier chunking + +use aoc_2022_03::{item_priority, parse_file}; + +fn main() -> io::Result<()> { + let infile_path = env::args().nth(1).expect("input file"); + + let items = parse_file(infile_path)?.chunks(3); + let item_sum: u32 = items + .into_iter() + .map(|chunk| { + let badge_set = chunk + .map(|line| line.chars().collect::>()) + .reduce(|acc, item| acc.intersection(&item).copied().collect()) + .unwrap(); + + let badge_item = badge_set.iter().nth(0).unwrap(); + item_priority(*badge_item) + }) + .sum(); + + println!("{item_sum}"); + + Ok(()) +} diff --git a/2022/day-03/src/lib.rs b/2022/day-03/src/lib.rs new file mode 100644 index 0000000..c64e5df --- /dev/null +++ b/2022/day-03/src/lib.rs @@ -0,0 +1,28 @@ +use std::{ + fs::File, + io::{self, BufRead, BufReader}, + path::Path, +}; + +pub fn item_priority(item_id: char) -> u32 { + if item_id.is_ascii_lowercase() { + (item_id as u32) - 96 + } else if item_id.is_ascii_uppercase() { + (item_id as u32) - 38 + } else { + panic!("unsupported ascii"); + } +} + +pub fn parse_file

(path: P) -> io::Result> +where + P: AsRef, +{ + let file = File::open(path)?; + let items = BufReader::new(file).lines().map(|line| { + let line = line.expect("got no line"); + line + }); + + Ok(items) +} diff --git a/README.md b/README.md index 514c6bf..9359cd5 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ - [2019](2019/README.md) (0% completed) - [2020](2020/README.md) (20% completed) - [2021](2021/README.md) (68% completed) -- [2022](2022/README.md) (8% completed) +- [2022](2022/README.md) (12% completed)