summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-03 00:25:03 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-03 00:25:03 -0500
commit5b39ac0af9c7565a26ec438e8733e093d0890302 (patch)
tree1a50f58773d2c43e37c1fa6457d250cba40fe156
parent76e71bc89d995078c914b63f909d7ee346caf5d9 (diff)
downloadadvent-of-code-5b39ac0af9c7565a26ec438e8733e093d0890302.tar.gz
advent-of-code-5b39ac0af9c7565a26ec438e8733e093d0890302.zip
day 3
-rw-r--r--data/2022/3.txt300
-rw-r--r--src/2022/3/mod.rs63
-rw-r--r--src/2022/mod.rs4
3 files changed, 367 insertions, 0 deletions
diff --git a/data/2022/3.txt b/data/2022/3.txt
new file mode 100644
index 0000000..cd857ef
--- /dev/null
+++ b/data/2022/3.txt
@@ -0,0 +1,300 @@
+jNNBMTNzvTqhQLhQLMQL
+VCwnVRCGHHJTdsLtrdhrGdsq
+wFJZTbRcnJCbpwpFccZCBfBvPzfpgfgzzWvjSzNP
+wDWgDfWNTvwvgFfWfddGldJVprrrVdNlrN
+nLnmLSnmMVJvSrHqdV
+MsmsbLvtzMjFsCPDsfBwwT
+WTqSCqWSWqSgVZqJHpHmHrhMMVrRhBnn
+PtLGLGddGGMCpprM
+jFvLPPlLjvfjjffsclvPqzzJWTbqNSWZsbSTDzCW
+lLSSrfmddlNpnmLdfSPddDdbZQTZgZjbZgjcQZHQPjQgZP
+MJMnhzBJVJwvGsMRhRhTsHTjZjHFctbtHZcgZj
+vzvBWGJMVGwWGGhGqVBnGzVGDfCDmrqNfrrLSdpSfLSpNmNC
+qGWLgfbWhqpLgZbJvTRWJTvMWRslMv
+FQwPwNPCVFQQdNcFHNcwwsvslRDRTMDMsVTGJGtRTs
+wQHnwnQFPNPdjnnPjhphGqBrfpBBBfZf
+mpVpmtPhVtPBLLbQTJpBLZ
+vzFMlMzvvRZMTbJQJQbf
+srqzvRRqdvzFFrDnvqldFVtwCVCHWNqJHNNcHchCPt
+CQJJLZCJLqNMMDDgGLVV
+RfRFFszTtzbWTFnRtFrRrWvNHghvBVGgMffvmBVDNgGV
+znsjWzstnWjbDnDbTZCpwZcjpjZqQCwSPp
+jRrzzrPjLnnpQQDsjj
+CTVnTlZWHTcqZBcTTTHqWscQsQDQQDsmmQfvfhwDmv
+qlWFWWHTZTlqTFWZHtBVFdlTGdNzRnNngbbSrrSNNzPgPGSz
+cWjbcjnssMmRPWbGsWcMbfLBFrZBBLLgZwBrlfLQZtCw
+vqpvFHNvhvJzdZQZtlgNNwlrrw
+JzqVVVVpzhVJqzhSzJhhDVnFjRRMsPnSRcGMRMjWjWmR
+NznNGQgSRQffbbsR
+jjjCLwdvLcrhqdblFJsFSPfbDP
+qrrvwHqjtLmSSggpBtgn
+LGPtFtTfTfTfLrrWTSWGPrrsszbsjZHzgdzSwzbHdsglwl
+NhHpVpqNNqbdszRRRb
+ccBMJVDNCvvhDNpvNDpnNCVCHFPTmfLTGPMQrfLGmMLWWQQL
+dRgRhVLRlncZSSrtLp
+WJmwvvvjQvWwFBBvFJPHpwvGWTScGsrZtttGTSsrzTsSZt
+FFHJjmjjjPMvfHfwpdRqMppghdRCddDg
+NDTRFSnNsVVBDVlM
+JjLZWqwjHvfrvmHHvjLWWLlhPlnPlChlQhJQnnzPPBCV
+mwHvHmpvwpLmjnvpvLvvNGcTTggRbdTGcbNbTTpS
+GGhZQMsmGRfMwfpclgdBlbblBBZgJc
+tFvFSTSDnDTTLtcFMbWcBgclJrgd
+vzDtzMVtnLTTMTSjSDHtppqhsqqfGjmpPhmsRGPG
+MfJtWTTMJfzBbVWPZWQbNnDV
+FvlgSHSLvmCvZjgcCQQsPQQsjnbVDNVsdn
+HLhclRlHRmHvmLmclLZFSFwRRRpJMtwJwfGGrrtrwfpf
+scsswLQcGmQmNHCqvrsHqfff
+bdnPSMMMClbBBPCdDDnDVMDWWWvfvWFfFJfNqqNVFqFNfr
+bDPTlSTPPbSPjnPSbGmQLCcjLjwzRLcmCG
+tFFJjMnFhdcMMJlWtdnlFczBSZGNSjGGbBGZLbZZbLGB
+QRgqwwvsLssZnGCz
+gqfvvnpfHwRmHTFdFcPdJJmJJc
+fccTzVVcfSmdThTTFJPFgg
+wLsWfppsjBrnnwjCBZnZqJJQGhBdFJddQhFqdQBG
+pZrNCWLwLZLjwwWMftmNzttDcVzVvt
+rZnVVjVSMcrwsNbc
+dLvQLBLFddvBLzpGmddQCqNswzsMjbhgbblbcwshlb
+LLCCWjGBFPmCWdmmPWLdWBpLRZDSPRnHSStRfnZnZTnSSTfJ
+ddfnQRbpldRlRLgFglqGCLqsGq
+BWBVDZWTBTDPvVTZVDBDNMbhcLLHsFqgvHJsLCJCGcHGsJLH
+NPZPDMWZMbZrBVMDDWNmBhMVpSSRpzjjfjpwRnSpwzRzdzjr
+bvPSBttgGmZwScwShS
+NJspjJLdprzHgjrLzLNrnHQCmmcZQWlcQcNQwlwcQCZC
+HdRJsJrdHTbqGMDtgDqT
+sNVvSdTstDCtdzdzSCwTzCRhRQjfclMflppjGhffjZcN
+rgWlrnLLbqbQMfMphpWjjf
+BmrnrFPnnBLlqVwDCtCtVPDTzT
+mJMqlVlttQlFVmzFQMQMbQMSSDNwwdSddNddwdDswRDVdR
+GGZgcfjrvCCZvgCZqvPHSwRBBsBwswcwBNTDTcSR
+GZppfGHGrgGprZhLthFJhFqLWWFhtq
+WDHHLtRBHgDnVrWFVFBTdzzZLLjZzjjvddLsvv
+JlqmMpCMCGMwbwZddTtCtv
+cJJqSplpfSGccJGthFVcVHgFBWBgHgDB
+tlFwbWtQFLJhlBFlWPbwmsQndTrrqdnggjqdgnTgTT
+GCMBDDCvRpDVpRpHrsgdqTjqgdHcsjHd
+MDDvCVGzBGfpzBSNMSRRmwbLWlPmzbPmlJlWbFbJ
+fzFzFHBfnvpHFbnzbHfBHZggCGgtZCltDGggdCCVtZVD
+sLMNSccQLMSrmLcshLvtCGllPtDdGgtJgmlV
+cwLMwwNhQhsWSjqTqHnHbjWTvH
+NWlqqhNNnGtNvvWQdrVGBBQdVrwRQr
+mppCjppMrDTSgDppCDTMQVRwdBbBQVVbQdQsVB
+pgzzTFFFrjHqHnqJFWnh
+ncQrhQjqjVQhGsGBbhtsstTp
+RllWFLRfZrGlBTbg
+vFLLmfNRFSNDfSNjcwqJVrVVzQjc
+mmGrgwmGDGcVWVjNNW
+nDsqfPCHnpntDssfJPDPjWWhjNTTcjjhTTNcqWcc
+DfPCJLpbldRrlrdwmw
+dJDNbRhNbJdhqCnrWjhsTWvplg
+LMHrttLFcMmcMFLmtGplCggpjjnvTpgnTTFT
+czZMzrzVZzHZdNdbDDqDVQNR
+sbsJgbsmzdgRgWdg
+LLLFBzGMLjzzFtVFwwwCPPRCCqQQTnnCMMCMCC
+GllfptwjLjlGFVFjGzpFFNbJDmprrNDsDmDvJhmcvp
+SccPbfbncpcfsjbRjMBCTTFGMTCQtJtzFFFJ
+vvvdgVhlmlwlgZLgmJhWQCWGGbWtWJhzTJ
+NbLNDdbLVmqqmfcsrHcrpPqrcH
+HcgDBJSHTCzjjnMNJjrW
+VppGMwFwllwwbZZrjvnqmzmnzpqjNv
+wZlhtPGPLFVFlGZbVtVTQLLBQRRTSHTSMDCgLs
+HPMMnhBHlMnMBPBHJHPWfdnBmjvLZvjTvZTZDgTgTmQmZhZZ
+SrzrSScrctrwVzCSCmzQjmLTLvGDvTjGbm
+CswstFRNpcwVNRrVVSVwpwpHJnnWWBBHfWHlffWfQMnM
+mlFMtqjvMdqjmMCCJZsRQBnszlZz
+HcNgcPLcHLwtcfZBTsnsHJBJTzCQ
+LGGNhbNtNLDfcgcwfbgthfwFrqqVdFMqMMhMmvShFqmvVv
+NbvbBGNvhNhnhpbgpGfBvNgmRjCdPCPCCRCQmmpRdTmTPR
+qqFSSqWrtSSccjMdQMHFMBjPMj
+SBDSBZZZwGGZNJJg
+qTdHSLSFRZRHHZVgpzhbJszchsnsLg
+tDvflvrGttDCjlQfmCGvtCftczhbzwJczcJgznNmzJNhwgsp
+tQlDCDtrfrtlGrjlQBHFHPVHbBbZqTZdVZBF
+MTwvsQJMvvHwVMMJMQNNJRPWWjCllrlWGFlSFCpjgFVSWr
+zhcmnRZmqmWjCSFrFqCW
+ZbmhZcdZznZfndtwDtMMsRQTTQNRQw
+ZhhVqQTvZvVhSmQZcClRCLPCgTGGLbgl
+dJWHwndMHswswlGbCmclmLHbbP
+dnwwNJnjBjwwdddnjndfWvmvSNZQNrVVmZvZFvvQQv
+trlrlrZzsjRjdFhlpwdpnpdp
+QqLvvLQmLfQTLbLTfHmqHHLqQgFBdCJBBgggCJdhgJwCggBF
+DPDvqLqffqfhSVjVPSPtsj
+gsnVdcBcjMMntGMh
+RQZLRZlZDRJDCzCjblJSDjQZWWTWPCThMTFGNPTNttGwCFMh
+pDlQbSlzpQsjVpjHVfgs
+zgqtCtJltdGttJgVGPPJCtJvQFsFFbTFssNDNDsHLbTQbssP
+rRcwBnnpcmBqpbLHDspTbFsb
+mwRqrqrmWrZnfWmBmnRZlgClgJCJlGJzClGMtG
+jlzHllmPnpHlHZBWZJJDWMBNVH
+bQrhDbcLgsQrtdVCJWfCCBMMVWrJ
+QhGdGcLGwwwtcDzznppPpPwlpnSS
+qbpqvWFHbFHHsWwPqPpsVWZTlDcLDddddDrmrcVZDrmT
+MCgSSJMCztdmcLzlrlDl
+QCRMRSnNtRSqqRjsjLPPvp
+ZnZrTfsWWvhVSRmzqqnn
+pLGBLBgLCpgGpbdLbgMClJTmmhShSRShqSBDQSRRmQVV
+dpJPldgMMbglFdrNWWjHZNccTjZP
+CCZCQzwwdmMGDWMmhCMJgpnrnwsTrFNLgnpNgg
+jfStHtcjqDPbPtvqvgLNpppnHsrsFgnFNp
+fcqqPPPtPSfRVBBRPRPbvQzzhQWGZQVQQZDQMMzGQM
+VVlDNDgppgtNltlrJPbjSzPPzjsMsjBBMWMM
+LmGRmfmwCqQqbsQBMqJj
+cHRcCFfmfmGLJLGFcJLFwfdlhDgptthhHpVrNVdhlvhl
+vSSdnBVpscwZcBZB
+mLHzqtGtNfGHHFNHMhJMthsbcJtctZTw
+GHqHHGzNDNFCfqllCFqVDdPSDQnddvcpPQjdjg
+CMWcwGTrvzDWzrDccDCGzTTTplZgSjggjSpSljSjBpSmgmWB
+nssRttdsnhsdbFhtVFhNpgwNpBBgHHBBBBZSjNSl
+PnVPVPLFtvPvTwwrQq
+tlQlqlJCCJWgFrprPjpGVpQzvp
+SDbwShHbBZZbhcBdDBDSTrsVpPrzzzHVzNllzGlVNv
+BTbbScwRhwZLnLtfJFLFJgWl
+VDfPVHfDVMMfHSPSMTVfqgFthFcFrtcdhrhDQdDmdcdt
+bWGGHCplWnJNpJCCnlnNwdcwQhmmdmtwddBNcc
+HpGCnZGllzlzJWjnCbbnCnRvfvsSTVVSgVLqSsLsLzPPLV
+fQqcfqfSDzDWffDZ
+NcCLCtPCPMtNBwdthpLhPwzsHrszsZssTsWrDrDVTNNH
+twMPBtCpLBCtwMPpJcMBSjjnngqSjQQJbQjjmgmn
+vQwVQQVqcJvVJvCpQBCLpdgSFCdjjWWnMSgnSjgjbj
+hszPRDTVDWWWRnjWWj
+TtDDZsszlPllhPzmPVGssTPpQLcpvpBpZpcfpvrvQvBQLv
+sRmGqqzzzgCtRrttCP
+cffSwNDddTdfGWtgNCrtGMPP
+GGcTwHwHvjqLLjLvlJ
+JSdjLJMBdMSrfwwLpWgzWmvDhggzWvfmgD
+VsRtVllstHHNllsQsHQRzchcnDmvmvnRvvvcnZ
+tGVGCTTTtTFVbsTTNTHsTTqBqBLrBCjqBwqJwqBzLqzw
+MhjTJjlSDrplQvFQ
+RHttqbNGGmbbLmLmdqbgnFQwrZswQrwDpFpppdwfvQ
+gCNmDHHRCLHnWWSCjhWPShPz
+BvzpbBwBmsDrmGVgZFDm
+TnNRdtlRlCdFFGTLffrrGf
+jltNtRCPSlPNtcpwpGzjMBpvbhps
+hflJphNDmmbpfnfplbcvLsHVLsrsZsVvCb
+FgTFWqTBfFPfFqQqTwHsHccVVLQCZZZCVH
+BSSRTGWBgFggBWgBGStTGpzNztmjjzhhzDfNnMjnph
+mDDFjjFmVlTZJttffD
+hhRvNNCvdNMRLzhSzpptwslNTfNQntsJQZZTlN
+WCdMzdMzhMdvRvLhCRLPvjgHmggmbmbblgWcGmcbcG
+cScMdhsDhDDdvGzZptzGcnGtpB
+NPWjJqrjJWwrSFWRJlrlNWJLtZznLBBzZznLqnpqnpnznV
+NWNQwNPjCSQTQhTd
+fVVCVccppZMZMMCBzJTNJHWZTWZzNF
+QrmmPhDqPhsPRhrlbgRDbbPDJNJTnJzmzzfNNTNHNJNWmnvF
+DgbPLbPsQsrbsqLbgllsQQptfwSjwtVLfwdcpCjVwwSp
+ZlsmlrZZJcQmhBhlNrsrJRRbRCRggRbzGCRHgRCDGB
+fMFvdfVTTdjWTTTfvSjVjpjzcCbFHGPHPDbPHRCFGGRHHG
+cdvfSWjfjpdVqSwSvMdLrlrmhqZhhrrLLJQhNr
+sWVVmDJsNWNjcSNJZcNcZWWsHTGHTChhHGtHsFFbbsfHhH
+nqPRwQRgpQRPQQgMQgQLQqBhvTRtfdfvfCbFtTFFFTtvff
+qgrPMLLPpVlbDrVrWD
+VcGjcCHcVHPrGnjQDQgDgQDFtdglRtlQ
+bWWhfzJhvZWJzNpmRTtsDLDgRTsNddFT
+MhJMhJbMmSZbJZwSCtjqcGrrnGjC
+FCvpgDsZNsCbvvvpVwcDrjcrmVMwVwHJ
+fhfWdPhhhhRQQqzdLSRHRHJjBTTmcrTMrMrwmczcwwTz
+qndhdQWndftfhWStfLQQfWgFNsgFpHCtgCNbGZZlZCll
+mqTCNhTNmGTLwLNfLrSrgZHDvfPDPv
+cjsMQppsFnFslnRQQGMDHGZHSgzHPDZDSf
+stWFjcFFsJlQcQtwtbVwCmCthmBTGb
+fmsffcqhmqPsnTCnCcQpzjSSNpBWBTQpVSSD
+vHbgLRvvvzdgjVVjWg
+WltLWvWlqcChrhlf
+CtwjffWrdznRtzCwLsmGLlLMsMmMGb
+cZFFbgPgJZDchMMPVsmlPGmG
+SpNFJBJccNgDcTJJTdbStbnntrCdSrjWnb
+qWzgNFqzqHNTBzFNCZCGPpPlHmdPblls
+rfSJRJnhhnJDjrfvRStCmpdGsdlDpZZZPbPCmW
+cffRvfnnVRjFTWVTLQMFWN
+VcHhVrVCQQWhffzcRZznnZFf
+dDSCGSsSblwDdmLqvnFZzNZplfpfRZfBnl
+tCCwGmSqbqtwsVPjVJWtJHHhQV
+fvvTcWzGcCJrJGJvvHMbZTmRQTbpMdQQsR
+SgFhVgllLgjLgwlwljFqVFSFdjmBHmZdRMdZpbjpmpjBsHdM
+LNqFnlDgVqllwLFLnVSgLFZtCzzzzvCGGccCCDCfvJrv
+FczpzmSjVVpSQrzzcRpRcrwqMtJqwtvtLHvQwtLtnJMw
+TvbGGbNfGCBBLHtJBHDZDMqD
+shgdNTGgvNsflspcPjzVdmppczrV
+JHLPLTsSllgSSPPSPLTRTdjCZGZDGGgCdqZtZCZdZt
+mhFpnpFwqdGbdFDt
+prpWcvnmhmpccBBJMJJlPWLHMDSDWW
+GcMcjDbDMMjqHBHVlHvv
+rLCrwNJCnwrZNLWQQwzQpRqQPlBRVVBRvvtHqf
+zhnrnzdrCwLJCwzwCMGcbdFTscTmgcFlgc
+cnwlFrdMsggblgsrMbncwrsWzjGBTjznBzWNzPzTzfjTzf
+vvVVHSpQvvRQDJGGLWGfTLTBLQMN
+hCmJqVvMSpqqChCJHDZrFsdhrtgFhttZZhts
+sfDNqLNpqpzCzLsDqzbCVWRhjTNhShTjHmmjjhStBmvT
+wZrlwJwFJGlFMTjhBBZTSTRSbv
+wrQrgnPwMsnLbfffVc
+hDcwwGWhMMssTcdM
+NQmLbNSZHQSHSNpbvfdqfRsZMqssjqdd
+LNVtLSSHLSgLNrgwJgJGnBwFMBzD
+CRDfCbfjcnRCBVfjVMfMjZpPptplPWtppStpSlBqlq
+HdTFLGsdLrzNWtvqPTcpgPZl
+JLGmmHrwJGwhjmfMcbDjQC
+VShGpPbWjcPCcTLcPN
+HqfqDfDFFJDvZRJvqZRRqHZdNcwjllwvQQLQlllccwclCMCT
+FddsFmJjjrgGmbSSpS
+NRFFLtFtqFLGsdnGbQSs
+ljMfMBDlJHgBVHgVflfnwdsSQQbddsSsqnqGfs
+PlzDzjljzqRzWzZW
+dtzZZbctPzwdlzRwlcdfRgtQJmFmhPSmmSsQQFhsmqSFvm
+nDjHnNjjjMnfjNTMWhHQWJSqSSQmhqhm
+CDpVCfrjLnnfwtBcpdcbcBZt
+sssZSZtDfHbbdtBTCRBzRDFJCBLp
+jwWgmWlNQNLlcjWhgQlrQQWrCCJJzFCMVMTzpBMMCVCMTwpT
+ggLgrqljLlGvHqttftbP
+cSGBFsFcSRZSQGsgBNgVMwMhDQDVfqPjMhwwVq
+vnCTLlrpPlHzzjbMfqpbww
+rJCnlmClvWvLrTmtTlZcZWSSWPGGdNcFGgcR
+lfDDvZZSvLtDtCQZltCqVBWVBCbHJjRdNqWq
+pGGhhzMRcqMBqMdVBN
+mzgwGrrwhThFGPmGPcFGpwStTfltfDftStDsQRsflDQl
+LjnSjLZLBcbBdDqzND
+rrfhfMRmpsghfrhGhgQrcPNtZcqNCqdCqPzcNZMM
+ZTTgvRpmfffpfgRRhWnVSJJLLWnvJHFlFH
+lstcGcttdczzsWVCvQVLCHHnQHWL
+rjmJrmfmJMqvQTLvqfGG
+JbNrjGjGrMDRJghZggcchhDhzc
+tftJQwCgSjpdWHjbRJ
+DcwvlZBmGvHjdbczcRpb
+sqwDlsBvGNSMQTCNfCTC
+DwDrtvMHtBCvcpDcjCMFtBCblJfJGJbZlfzrRlJdbRdZld
+sPLPmqhSnLQQSWqlbzRRhfJCJfNJhZ
+mVCnWCsQqqLTPWmnDVMFVtHFtMBFpjwM
+scChGddJztdNswNsdDsthvmpVmRVcZjmvVvRSMZVSZ
+lQLCWgWHCWbFPbbbHqLnLPHHVMpVRgSMmZVSBZBjZVSjRBZp
+QrTlTHbPnTsJGtsDdGCr
+fMjgFqtFWMhtjcNQSDMmNlCCDMQN
+sVHdHdJHwPGPGwwbpJGTbGTvClldmvRSnvlDlLLSlvRnQl
+pJbHPHJGVbBswpTcfrBtrhmtrFczzq
+SDGSDGVPqqqQPGrTQVTQDrSrJfHJgqhgJqzhJJmWfHpWpzmg
+twCdCWMLwbtLLjBddgfcJgRHfRRpfcpRHM
+FZdbvFFbVvsWsQsW
+rzrRgqGrwgjRVqJCHLzCCWhtDbCC
+dTZnNpvBvnJdBpBnsJPvsSCbthLtLbbQShQQLHtSST
+BlplPmdlFsslfJmmRfwfwMjw
+PPHSrmfHTnmHnHBzRhbFgfbFwzQg
+LcsVsGtVLtLqpzwBvgzQRgTTTp
+TjLJGTTJWJZZWWZS
+tHcshJcJRhLsQscVtccJLRHfvlPjZFSvmvSbvfLFfFFbGZ
+drwdTNlwwBTpCdCdwGPrrmjjmjmbSjFPrF
+wglnzCDpJtQcztMR
+bbMjTbBvgjZNSqldTlVt
+wwrcFwsrsnnCQzrCsLnRsQZcNlpJVZHdttZVttSZqJZd
+GwLnrsmFCCzqzhvPbPmWmvvfjj
+dcnwQdcdrJdSwSFBBqfBfwMqfBfzsh
+RgmZpWlCClRlTgBZbhHJJsZjfBHZ
+DlNVWgWpgDCCNRDJFcrtQGrrVnrcFPtc
+sWSHsdSrHWHsbdsddBsbjmfwffmJDJwcfDQgfvwJDj
+ZNGPhRqCCRNGNwSDvmmwwgDhgf
+lGlTLTGTSVVFqVTqsFHWntbWBsBsnBHb
+QRRgRvDwWDVjmSbDnbTDlDnbqS
+rHCPPHrcLFJcllqbTlpq
+CldFrNFsgVhhhWgN
+qSfMgNqfpmSmlQrRFG
+cbBczbtbZTcPWzcrTrmRrLGFTQQFmJ
+PBZChtzzcWPcZtBvPjtzBBCfHMMNdDgDpMfVfVpHMqNR
+LJPPCHtgtLDfFfvTLwfv
+pVGWGGjjjplhpGGVjWnldsvrrMFvfDMTWBdFrfFF
+cjlhShjchhjGGmNVjplcQgmTPtHPPJmQgQHgtqgZ
diff --git a/src/2022/3/mod.rs b/src/2022/3/mod.rs
new file mode 100644
index 0000000..b6c339e
--- /dev/null
+++ b/src/2022/3/mod.rs
@@ -0,0 +1,63 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+
+use crate::prelude::*;
+
+pub fn parse(
+ fh: File,
+) -> Result<impl Iterator<Item = (HashSet<char>, HashSet<char>)>> {
+ Ok(parse::lines(fh).map(|line| {
+ let (first, second) = line.split_at(line.len() / 2);
+ let first: HashSet<char> = first.chars().collect();
+ let second: HashSet<char> = second.chars().collect();
+ (first, second)
+ }))
+}
+
+pub fn part1(
+ sacks: impl Iterator<Item = (HashSet<char>, HashSet<char>)>,
+) -> Result<i64> {
+ Ok(sacks
+ .map(|(first, second)| {
+ i64::from(priority(*first.intersection(&second).next().unwrap()))
+ })
+ .sum())
+}
+
+pub fn part2(
+ mut sacks: impl Iterator<Item = (HashSet<char>, HashSet<char>)>,
+) -> Result<i64> {
+ let mut total = 0;
+ while let (Some(first), Some(second), Some(third)) =
+ (sacks.next(), sacks.next(), sacks.next())
+ {
+ let first: HashSet<char> = first.0.union(&first.1).copied().collect();
+ let second: HashSet<char> =
+ second.0.union(&second.1).copied().collect();
+ let third: HashSet<char> = third.0.union(&third.1).copied().collect();
+ total += i64::from(priority(
+ *(&(&first & &second) & &third).iter().next().unwrap(),
+ ));
+ }
+ Ok(total)
+}
+
+fn priority(c: char) -> u32 {
+ match c {
+ 'a'..='z' => u32::from(c) - u32::from('a') + 1,
+ 'A'..='Z' => u32::from(c) - u32::from('A') + 27,
+ _ => unreachable!(),
+ }
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1(parse(parse::data(2022, 3).unwrap()).unwrap()).unwrap(),
+ 8493
+ );
+ assert_eq!(
+ part2(parse(parse::data(2022, 3).unwrap()).unwrap()).unwrap(),
+ 2552
+ );
+}
diff --git a/src/2022/mod.rs b/src/2022/mod.rs
index 6647253..b59d411 100644
--- a/src/2022/mod.rs
+++ b/src/2022/mod.rs
@@ -4,6 +4,8 @@ use crate::prelude::*;
mod day1;
#[path = "2/mod.rs"]
mod day2;
+#[path = "3/mod.rs"]
+mod day3;
// NEXT MOD
pub fn run(day: u8, puzzle: u8) -> Result<i64> {
@@ -13,6 +15,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> {
(1, 2) => day1::part2(day1::parse(parse::data(2022, 1)?)?),
(2, 1) => day2::part1(day2::parse(parse::data(2022, 2)?)?),
(2, 2) => day2::part2(day2::parse(parse::data(2022, 2)?)?),
+ (3, 1) => day3::part1(day3::parse(parse::data(2022, 3)?)?),
+ (3, 2) => day3::part2(day3::parse(parse::data(2022, 3)?)?),
// NEXT PART
_ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)),
}