From e1b3b9d1795723541bf1f8393c3840537567db7a Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 3 Dec 2022 20:18:53 +0100 Subject: [PATCH] Implement 2022 day 3 --- 2022/Cargo.toml | 1 + 2022/benches/days.rs | 2 +- 2022/inputs/03.txt | 300 ++++++++++++++++++++++++++++++++++++++++ 2022/src/day03.rs | 78 ++++++++++- 2022/src/samples/03.txt | 6 + 5 files changed, 382 insertions(+), 5 deletions(-) create mode 100644 2022/inputs/03.txt create mode 100644 2022/src/samples/03.txt diff --git a/2022/Cargo.toml b/2022/Cargo.toml index e71419a..9c1cf0d 100644 --- a/2022/Cargo.toml +++ b/2022/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] anyhow = "1.0.66" clap = { version = "4.0.19", features = ["derive"] } +itertools = "0.10.5" nom = "7.1.1" [dev-dependencies] diff --git a/2022/benches/days.rs b/2022/benches/days.rs index 9918a20..1c53895 100644 --- a/2022/benches/days.rs +++ b/2022/benches/days.rs @@ -8,7 +8,7 @@ use criterion::BenchmarkId; use criterion::Criterion; /// Number of days we have an implementation to benchmark -const DAYS_IMPLEMENTED: u8 = 2; +const DAYS_IMPLEMENTED: u8 = 3; fn read_input(day: u8) -> Vec { let input_path = format!("inputs/{:02}.txt", day); diff --git a/2022/inputs/03.txt b/2022/inputs/03.txt new file mode 100644 index 0000000..e12b761 --- /dev/null +++ b/2022/inputs/03.txt @@ -0,0 +1,300 @@ +NJvhJcQWTJWTNTFFMTqqGqfTmB +VwVzPldRZVLVRmfsvfjvqfmm +ZDPDHZHVcvDhbvnv +FHHwHBzzVCWWmmCzCPrVmgBwbLTtRFFbbbttRGRLjTcLpbbT +vhZZvdsNSdSMdNvjncppCLcLnGnj +CDZZsNZMZqdNSdlNZCqrzPHDzgrgzwVVWwmwwm +ndlndntsFJntFvccLjjLrjBShcBBfc +GpCGHzVwmmzqQWSSSfWHBhQL +mpCMGGCZVzVwGGVwmJsZnFtZnTSTJtdsvl +nCnPDGmDNmVCsVQDmGSWqvzchWSjjcWGqS +gTnBRLpfTRnrTdZgdLfRdrThvqcvWWhFFWvcFSSgjqqzjv +pfZfTMwrbLTTfsbmQtlVtHHnbs +wNdSdsbTvTZMTvTv +rrdRWdWQhFVdHWBGWQmmmnnMvCfmnhvmCmtZ +rJrVDRWpGddpbSlNSlspPP +chTNrthMMwWMTjfsmRzZszJpwm +BLnFFCngbcBnbbldDlpRjGpmsCzGsGsRGmmG +dqvnvlgbqtcPPMhH +QcLNqZbCzJDQBJJRpwzRpdnRldgnpf +GmmmvVGsHrWffrlwdCWd +CMsFVVFjCmFStGQbbLZNBbJBcTjc +LQVggbQvcLbQLHgvVLhWGGsChssrMWfzGccc +qDnRTTRqJttPfWMChJhGslWlzh +qRTRwPBTBtRZdnjnqqqnQVbjbNLFbbfLgVmgHLQm +cZbzwCwZPlJcMLrNSNfHWNBBNZ +vsQsDCqtsDhmtjVrBNWNjBHrhr +TtDTGnvTlgbbRCGg +BgBlplHlsgNNsJlVpBtPwJhMPRRQSSttRtSP +bvhTnmdFTzddStwStQRddt +ZnZDLvnvqZzbbhFzzmTbnFsVjVlNgsCCNVsVLpNWVgsB +TdptqrrcVGhhzFtw +DRnSfwJlDmmDDVGv +RCSQNSCQZndwbcMqQrBB +wvRlrlwVwwqzgbZRdCJBWfmdzCWfBdhf +cFcsQpNtLLsGTtNGpMdPmDdPBmmBvJPWvDtC +TpjssTFFvLLLcFFQpwbwwHngjHRrZRqZVH +mqqddrPPcPmqPDlrQnjTrbvMvbHzzsjjpTvz +gtBWgGgVhLGWHzMDztzstDHj +hfWRhBBNBGgLNQDPwdNPcPdw +LhQzdhhbTzpMhddhhhTzhnZcBFllHZFtrrHZHMHFjlHr +mwwssqDvjptrvplr +NCSgVDPDwmDgVJVpLfTznQJdhfLhnhQQ +GzjzDhjhhZzcrRgQCBjBPBBjQCgT +vHHHmntsbSgLwbsSmNHbwNbvpqPCBVppCpFTpTPTBtqWBCqV +NJbwNSwdndvmvwhGhgzcfMcDJfgJ +GncgDvvcMGnttjDvrgRRFSZZLZFWdJFJwGQwZBWZ +bPqpChPfsshfZZBdZdLTFZ +lNqqsClmbsNlPbHqPsmblmsrHdvdMngcVrjggvrvggRDcn +bDvtgVVVpMQvjQWmQL +rwTflmlfZJBBdQWQWjQqdM +HsJJmZZwscHrwTrcRbzpcbPgtCSbgz +CsCsRvshMjpbqCqf +ncblgDBgtDmmmTlBgwlgbHHqMFHLqPDMHPHHpqWfFM +TcBctSmTZTtSTzsZvsvJZRsGVb +znznvngttwltzlLwhtThHbqHPvNbNHSSHmmNWHjP +FBcLrRMFQpPqpPSpqHHW +fRQMJZJfrcMcMVrQJJftnwCzVCltgTnstTVnVL +MfLlRfCMrLzRlQgwNqQFcsGd +jtTjjBTvbdqcGjqFcj +vvShDSBDppzhCmzq +plWMptTvfrnncvcRfwqzqLGhzhzThNzNNJqD +jSdSHFPQQbdPCQCssjSbBmhJGNZZNGNqqJNBlJqqLh +VCCCVCQgjdddjCgljCjbbwgRRttgrpftfWrgvpwpnf +MWlbBcPjjvvjPWWMPqgRQZfJZDGGbRZJffQQwh +HrHrnncHpzrJQJfVDQVR +zzsSTtSTLzsspSdtTmHHmpmtFgqcgPlgFqWBqqqBMdWWvFlg +nSqBbJbqlnBBClVZcMgZVgcP +FQwrwHrRwWWFBRPNgNgcCGZZZC +rWFWFTwpwwWzHrnDbfJDLDbBBbbz +BMmNtLMMtFCNFNMvvLmcndpgcdgppPrgrGPPrgJD +WVWWhbTtVnGpjrrPhr +HWssSTHWfRHRsQQFLvfvFFCLCNMNlt +sTmDsQffVrrLCjTFltTFWL +BnwwQBJbJndMMRzMwCLlWlLWWCWLLtRlWF +cqqBMcMqwnznMGzcvDmQhrvssHmPDVssrP +pQGQGJDDrDVJbbfVzvvgPcCZwhZhncscZWWc +SqMMlBBljMmRlchhPTqThCZnPs +FMjMBmjRNFHQJJpHVhVDhG +tHNNdBdNtBBBMgsMpsZm +wVPzVvbwqzhrVqvjqzzsZpDsZDsZmsCPCgZgCM +bVbvLThvvbrWqHmmnJLdHdJQLn +PzTspPZpdLLDZTplPLpPDpvbfhnqNvqzfvNMzQQfNwnQ +GWRHmjmFWMMSnhbhHw +JWWcmtBrBtWBFWGJpsgTgldhLVLpJl +DwLMDzLMhvMcwvgdVqWWlCVgvlqF +TTSBBRpbStHZVgjWFldjRVlV +SnbTBdJBmnpQzMPDMcMznr +nNlMNBPPNtJQnbZhZsgSbh +czzCjcwTdvSbgQNcgNQq +VTdNdGDTzDTdlFFPtBrtLtDr +FMbbfMlzvFsmgVZmmg +SrNTHGmdSQDqLhtQhhgggs +dRDTSDPPcHRdHGDHlwJBbmwljmMcfjbW +sQgWLtqLtWhdqlpNZRpG +blTHTjlvTCJnJvRZdGGhHHGZhFGV +CCDlJclnCmbrmBMgcwcLWtcBsB +vqPWWvqwwCFvFZfZPRFRrcGQrQwsDrNcrwnbDNcQ +LVgJLSBBVtzTLzBMmTMJmLnnDNQcrsGbsQbNbrbDjs +zggVSmmhVdfqFhvHWG +WwdndGGmmmLwwwmRwWSncLRnZqZqhqZthBtqtBqZBgtdtvMH +FfHHzlQQDsFzzrNsVTfttZvTvttTqqtbqb +lQjFDNQFPjCsVCCDjGCwwSGGnccwcHppGp +mrjggcFsFMjdjZRpSZpn +NCqfLCFNbQPzPPlPzNfSRTRZdSdWWwndpqRSSd +vDvzzbPQFNCFtllLLNMBhMcDHGBGMggMmcBc +jhjlBvvnjbtDNPjtSjBDBbDNgHggrQrhghRQrqRrZcRwwqVg +pLdTMsWdLLmpMdqZZdPdVqZgHPwH +WLTCGmMLfPSlbGjlnnJD +gtbwhgHbHgqqbgQthgQLtZZCRjMcjjnRnrRNJmMRJrNhRc +bGWVTTvDvfpVFFBpvvVTdRDMJcrccCrJnMRnNnNCcc +FVWTBsdvdTzTBFWssVQtLgSQtHqqPzPbqHbw +dlzrPTSSjSrllzWhsvVmVtTRTWtf +bJMpLGcqGhNbJQttVQmmvRWWsp +qLbMwqqbGHFGzrlZrjhPHCrj +rNrrffVlqqrfLlPpltcBBTTGRzzZRPRsBTcJ +msbsmWSsMmQwjdMbWMhMhQmcRZRzGjTBGTBcBJBjCHJGcC +FwWbvdhbmrsFrfrgsN +rHjrQHdhdQrvSddcHWLssBSVVpBSWWWWWf +JNfTGtqDwVWBMBMpwM +qlltZgfJFvcRgcRjvc +CqfcwfDqwwmRnnqmRdNRBTRTRrdGdNpTvF +WVbzsZszBbrsvpdMpdQM +tJhbVZHWLLHDgnSwnSSgHB +TZCqqlTsqpZVVsZQJSBSLpLmppnJzmFz +brSgNtGjjRjRRjDddDtrRJcJJbJmmwcmBmnPcJFwFB +jgdRtMjNNjfqlMvShvSZSZ +dJTdqCwMNCgqTQllGBdlGBmmmZ +fcVfVcnbVfrwDLWVfncZBQPlBHRGljLZQjHGQl +brwnnfSFDvfzCTqFzgMJTh +njnsPBjjsrrnGLnbTTjGvcldQPCMllNzMvRQPCdd +ggZgfZtmZVpqZqZWDgFmgqfCcQRcRcWhQcccQddMcvRQdQ +tfqgggVgHpDwDtfwbGLJRjbLjsrLTj +JmrfrmTlDWTfgQCdHCdpqBvQdD +jsZtVzNsSNVQQHnBlVQR +PljljFjPljSsLPtFLTTgTcFrrfMJmrrmrr +hmGcmmndhmGnfmtGnDzFLwrFJQsQFzNFrNJG +ZSqPlSWcWlbgqWVTVWRVZPrjQqjzjFNJzLsNJsLJNqNL +RHcWTZbSMMMPgZcWgSWPPbVMDnBffmtdpDBddfnnvmCdfC +vSJvsbFfJfvqCsTHJswssJnLTZjjhzrrzLrzLMrzhdjM +pBNQDPcpmWDcBNgMMnZPVjdddnndhH +QWlDgmpmgDBlGRgDDgffSqwSwGCwHfvqwSFJ +jvlgvMJclPdGdtdcjMVmMHbFHFVHWHbZHZ +CwhLzLhzQpnqfpfqDVHCHbsbDFZDmHmj +LnBzfQjSzQrPvJvdSSrr +wpcvcsqclDCnVCVvWfnZ +BLRMRtbnbbBLNCjNCjVVZhbC +rFgMPSRnrRpmqpJwqFDs +LZQNQbMrZppLNLQplvlGLNvVmmmfjbwVCfjbwJwCmBCwfj +ShTPRFtTHZPCsnwswsFwCF +WtHRPdThSqZTRtDqtdRWTdpGDLLzrNczvzMGLlQLGDDM +hdcffBvldjhCMljqPwWwWNwWdwqHZr +LtQmbQRVsZQZMZPQSN +tmMRsJMpDhjJzJhv +wNQCMFCDQDBmrHmmRWrrHN +SShLnfqpcqpSZSfrzJvRVrvfrrJH +cRpqdGclpScltTQQtsFQMQsTCT +NCjggZmgfBgnBmgWbcwcTFctcWWfvb +HsDGthRGrtppSQpbFFJTVcJdFbTRvd +rPDGhDDrSzZLtzBLZMCB +RsBBMBsCBlFFCgRsBJzlMjMPNSdPhSrSrzLbmSDrDNmDSd +pZHZZJpGHHHpTTHvTncZqVLdqLbhLrDLdhrSLLbLDDdD +tGtwnJccvCtCffMBgt +wbddvVjfwPhbjjbDbbvbjvTNCNmfHZfpCZRJNzCmJmnJNC +BslcLtclZWsZJWNrRRNRpRmR +BSLBlScGtFMcssMBBFGLlQZTDZQjPddVwwbTdvvdhTZb +NSZHzmLZBnzHmLLzLSntDttDDtddhDtttDWW +QgfjsrrvNNJwtMddcvcvtq +jrfgfQpQrTTVLSNBClFV +GQWcWWPPQRcrJQNDdRcDmmLCFSnqNSmqhCNvFnql +zHfwjzpMjwZmCLqvvnlljC +ZgtVZBtHHZtgQGgPrbPRJdPv +TWdWpJTJTdgLWfWLlLFLrfrgBGsNqhGslBGHqSNqqBNshnws +ZpQmjzbZZCjZCCCPZtttRCCwsBnHNssBHbShsshHqsGBqN +RDRRPpPCzmZCtRpVVJFrfTfWFLLJggJrDv +pDDFlglsvFMgntlTMMqNffmTdfddRM +jhGJLVCHQpHGQCCzLjWdTTdZZdNdcRWNccWfNN +jQjSGjrjCQLhzVSLSCSHGDpngbrnDFtFBwBglBnBvg +wsLzstsgszcpcGLHGpcgcghlDBvQvjQvbFbQCbJBtCCJJv +mnSqRSSqSRThWRnmWWRSJDFTFCFCblbBCFQFCjFj +rZRRWqSSdZZfMVnZLspPsMgHpzMhHGPg +mwHrCLSWWwrsHCHDDsVrsmhfFZFnSSBlFlgZbbgBglbggj +GJdpcRtGJvNRdcPtdpJJdbQZfjfQBlnQBjnBtbfFnB +qcPpqqzFzJqvPVCCmWrVwhrWrz +jjMbvbhDvnRjNRGMmjbMZftSSwwwthJSffStctcwqd +lTQrVlpCVvCcfdcSJqLVcw +srHFWCHrFlrHlrsBsprljjRmDZZnmbDngNBgbNZv +MgTlQJlTQJZWpgLrRssrVqqqpRts +bBNbbzSSjMBPjzhMjsPtRVVRVPRqLttGGs +SjHBbfjNCDfjZgTlZdMJnDJW +lpThgTwtplhghgwhThqnnrdZctSZSjSZcRSRfbdrrc +RBVBGvmBmfdrcvrbbr +PmVGNGmmGRLLQwwLqTnglQ +nHwnBwBTnFHQwRsMhwghmzcm +GtprdCpdtqWdbqbrfdnPPszsWmRzRnShPszS +dGptbCfCrlnVDBJNLDLLVDLQ +CZtCjhTndCzqbCNq +dwpGvpsmwGslDszrNNrzqDMzWMgJ +vmcGccvpBVPTVTjTdTTTdZ +jWZhvZLjZfCZDwrDrSSzJGhVdJccscGsgV +blMBlRqqqgSJLBLcsJ +blmHLmFMMMnRqLmMMFqHmfPDfjQDnCDDQrZvfCjvDr +rnvnHrDLFZmMFLvrHQBMGQggBztzglplRl +sbWWhdNzsshsfhcsjJJPPbWdtQGVGllRTRjRRgBgQlpRlppB +PPCCwNWhPhNfWCzbqmFnDFFnCDLSrvZS +GChNjwWlWJWTJZBggvdgnQgdhdnd +HPsHfHHrpHDpFFrcSfsfpCMmQdntLBMgtmtBgDdLLC +SqpPscpPzpSWzjlCjjCGjl +nvgLvcLgvgvngbLprpJNTDCCRNVJrNPlDDTV +WZsMtsffGQtMzWFqFmWmWsVNJNlDwwCDVRTwJlCCDVLz +BQfGZGmmsMWFstWFmfMsfBccdncbpbSbvbbvHnLbpc +tsmDsvswNZmcZTccfh +zCTpGCbWBRWFWHGRFZJbMbJfnrhnhfMnnZ +TzFGFBRLdpHHNNQddDQDvwQN +fhBBpJgdHddjZQfmVmNzNNLmFN +qvMRrvlbwqlbTTMBMvLssFNmVzzwFDmLLzVD +TRSRWqRRMcBHhGHcdGgPGp +lSjHmtmnpHStblnpSlHSrtmMzLWzqzqCZDDTzTTWqMFqCqVV +sLRLLfPPRQfCTqqVVqFT +dNJgRPNQNsJJhBRvdJvQvNNsjSrrSmrcctpbpHtBrBjLjmSH +nwFwpppjfwSlpLTsqsTgNshhjM +ccBRGvtsmgGNPqNNGP +BCcJHvssdcWBCVmVHSSrZrwVzblpwbzZnf +rcfQRrBPPczjcRBctZDNlnVNHbgZGjVDjN +TvMsFJGSFMhJnNZlwVVnDNTZ +qhSqqmqLCLhFdJLqSvLhmQRQRWcRPczPtzrCrWGRBp +JVhdPhsFPFqLDBHVdHLPvhHDCMwcgJJwbwRgnnCMbwGwcmGC +fzjzpTZTQQQLwCbgGgbMmQcR +jzNpTzfSZtfNSWZlVVtdFFFDHHqLHVqv +TwSNnSnSGVTpNppGlPTlTcVqQrRhVBqdqBRqZqQZqQ +DcDCMfDbCMHJdrRBqbdjRBRZ +gvftMCJHcHfCDmDLgfMmMmmWlwWnWsTTwlGTlWTwppNlGL +pbGMbllDQPhhWWQDpPgVGlMCvRRrQLcCCcfBBQzLBcvQBv +wqnJjSmjrstdqwwFBLcRsBRRszzLFC +qwdddTJTdHtjndqJqHZHmwVWGpDbGTlbWWpWWrPGhhhM +WGllqLjjLCpSffmBmvfpHs +dnrQwZzRTdZwnCThdzzFTVmcBHBJBmsHfBPHcfvcSVHs +QgQrzCdrTRCZzrZLbjGLqNMWGgNNLt +sgPnhPPTTPTTwlJfwNHlqcfs +LMCpFbLLbRpMGbMcCFLVlNlNqrHqVfbHHwNDwr +GjBcCCtWMtMRZTSvgWQTngvg +BCMtJJMpRDlMMvBJBBnfjtcjPhPmZgnhgdcf +NrsrsqFNvrVLVGVrsHsqFgfmcPGdcmhfjdPgfjcnZd +zFTzsNqHqFssLVLQqNTFbsBDwCCwvWlDwRMRCTRBDMDS +zQtLgvggSRtgvVRtLvvnzdnjnGwGdmmrlpnlGz +JssBFpqsDqPNnlWWjrrjqrnj +DHDFBNDfPbJBsFHNMPvpvStQvMRVTtgVTVtv +FvzttFvBTJJzLbvwhCnnVnWwjCnBNC +mQdZgZPDPdPPSsMSQPdZgCwVGmnwnWpGnGhqNWjWCG +ggdDgfQSdcjtFHjlLJfF +ghcgScNNSsCvGSzmpVFlZbrzcFcV +MWWRLRqqqdQwTtLjjmqMlFpFlzVnbFVDwplFzlDr +LHMHqdHWjdQMdMtLHHLtWjJRsGCGSNghmSvPBJBNhsGfvfGP +CbVqqqDbcbMHnnDqcCbrRFCfBvvwGjzrBwQGzrwwBjGwBQ +sTPmpNWdWPTJssSSLPfNljjBvflGtjwwBzMG +mmWgmgSZLTLMZWpnhqZbhFFCnhqnnn +QQmjmZqnmQrfTZlbbcVbBcfbHfzf +vpdSNShNppFdSRtdGBqvJBDlDzqbPPHVBH +tRNSNRFhNpSRhFRMFtGhRGswLZZsZqWnmrmZwqwsTZmmmQ +gGWCllFCGWtGGWdlGlWNZdwpnnSbwpMvpphZpndn +RsshDDLcQVMSJQwJwnvw +HVPzrPcDNhPFGhPC +jtHQGHjGGtdTLjnqTQlmvRPRPBBwRBnFPPWP +hZbzNzVrczZzcbNssVspZZVvBwbmPmJPWmvbBRvPlmvRJF +fzNVDsZMhzpVhpVhlZcMNfcDDdQTLTjGDTCqGCjtSQHdHL +GrbFggGrTrzSrgfwJjdTmwmNJZJd +VMPQplPDptchwdsjmlml +MqMWtBDPPWDWHQtvqQtWPjbzCGLgSBgGbzgrzFgnnz +fcJccCcwcDfcpbRnCfWJnQJqtqtqPQdsGdgPsgTQqg +LSjVMhzSFFrljdNbltNGtgdqQq +MMhSHFFMLzBWDcHHcfcHwb +rwmWtJWMwSNRJMtwNmMrrSsmtTjjlgqnTqZZZPlHnTngTTgn +BGqGqqFBFggjjdGHlj +QDhhLbDQCDFMNcmhRhqJNW +BnRnRvMnLGLSCHvvSnlRfWbbTNQJsJsbNbJTBfQT +tzMmmMwjhcpFjDmMcptrcjzFQggfQPTsWsfgNbbgfhJbPhQT +FdzcrtDwDMtcwtFGRZdRLvdnHRSZZv +HVpsSpvjpNjsBmbGFBnMNnDM +WRRWhZtfrVtLJrBZMnDmDbnZBTGF +thhPLzWzhzwPtLRLWrQlpPvvClcVcCppSvpl +lZPbhnZLRPnnPZZPdlGMBWcBMgMQHBBcvvvzBL +jpFjmwwwCDDbsjvjjgcvQgcNBQ +rbFmppbwhqhGRGZr +ggrLwFgWCBwbMWBbFwLMgNBZdmZHclJPllnJlNRPmSNZRR +ppszzDfhDfhsqpnvDVTfGpSPlPmclHcdRcZmmmdPPGSP +pvtDDVDVpqDfzDfngBLCwQrgCtCwFwrg +pbGjFFGGDjpbsGsmNhNFNRBBBtRhhhHv +JnczJVCvwWJvhPgghgNtNtNJ +nwVSSzdzzqSpvQSZQG +mssLLttQrsMrMzLCRmMmrrSQpvWpDNlBTBDlvNTccDQl +HdHJwJqVPwHnqJwbjJbGjnSgSTWPpNgWWpgBBgcvDWWN +ZHVwVZGwwdndqJVJqfHbGwnwrRLtLMftMvMMRrhmLMthhLmz +RgHGLbTqlZlPRZPHfvvfZttJnvfvjnzr +sVcChDVDccwNhhvjTvVzWJjnzFff +mpNcCMTCGmLqBLGH +wVJwHJHVMtMpBmDDWPQVPWDGDD +zCrlZzCblBvnCDWNGLmvGDLPNG +dqZglgbzrzbbgZqzTFSBHHFJSSSfjjSMfwhj +NMWJSjLMCnHHNMNNHWCHMbVVGBPZTrPVPBVDrBSDGTTr +zvttlFpgdtldwwvftPDPTWQdBZrsrWrGBZ +hFlFmhRFvfCbmWJWHcnj diff --git a/2022/src/day03.rs b/2022/src/day03.rs index 745aff3..061ce06 100644 --- a/2022/src/day03.rs +++ b/2022/src/day03.rs @@ -1,9 +1,79 @@ use anyhow::Result; +use itertools::Itertools; -pub fn part1(_input: &[u8]) -> Result { - todo!() +fn priority(item: u8) -> u32 { + match item { + b'a'..=b'z' => item - b'a' + 1, + b'A'..=b'Z' => item - b'A' + 27, + _ => 0, + } + .into() } -pub fn part2(_input: &[u8]) -> Result { - todo!() +fn seen(backpack: &[u8]) -> u64 { + let mut seen = 0; + + for &b in backpack { + seen |= 1 << priority(b); + } + + seen +} + +pub fn part1(input: &[u8]) -> Result { + let mut total = 0; + + for line in input.split(|&b| b == b'\n') { + let (first, last) = line.split_at(line.len() / 2); + + let seen = seen(first); + + for &b in last { + let prio = priority(b); + + if (seen & (1 << prio)) != 0 { + total += prio; + break; + } + } + } + + Ok(total.to_string()) +} + +pub fn part2(input: &[u8]) -> Result { + let mut total = 0; + + for chunk in &input.split(|&b| b == b'\n').chunks(3) { + let mut mask = u64::MAX; + + for backpack in chunk { + let seen = seen(backpack); + mask &= seen; + } + + if mask != 0 { + debug_assert_eq!(1, mask.count_ones()); + total += mask.trailing_zeros(); + } + } + + Ok(total.to_string()) +} + +#[cfg(test)] +mod tests { + use super::*; + + const SAMPLE: &[u8] = include_bytes!("samples/03.txt"); + + #[test] + fn sample_part1() { + assert_eq!(part1(SAMPLE).unwrap(), "157") + } + + #[test] + fn sample_part2() { + assert_eq!(part2(SAMPLE).unwrap(), "70") + } } diff --git a/2022/src/samples/03.txt b/2022/src/samples/03.txt new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/2022/src/samples/03.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw