diff --git a/2022/input/3/input b/2022/input/3/input new file mode 100644 index 0000000..02370bf --- /dev/null +++ b/2022/input/3/input @@ -0,0 +1,300 @@ +GwrhJPDJCZFRcwfZWV +LjnQlqNpjjmpmQlLlqNfZRvQcTWcTSTTZcSQcZ +nNqjdspspngnmjmslqmjjjCDGrHPHMGddGCMCGPPPJWC +GwmVZmPWWFFmBbVbZVwmbPsTCnlgQgnQfhlffffZnlQh +DqVDSqqSMzLLDDNSHHLdqSdSllCQjsTlClhlflnTlhjgfgfM +VHJztNLHGtcbvvPG +bjrPrNCtNrjdcCPpptfpTVspDtfTtB +JGQJMJQMmmmZMnnLpLBTpHCD +WJJqWRgWlCJZhZRCQZwdPScdrPNbvzPzwvqz +QNSQNBWQNLjZBNNhLhSNRsTcsrTTVzcwZZZsfrrbwb +tCFtHpppppMldpvpqnMFmMVGrbPcrwbzswrzcccfvTfw +pdmCpgqCdmHHdJVWgSRNJDRVVj +sNrFnvNSzrjQtQjQTj +lcPmcJDLdPDbJPVLljdGGBBThBQTGwTtBw +PDLqmJmpJQfFqfqsCM +BnhctqdnqnRcBnslCJJCMrJrsG +wNDMZpbQwMpCvCGVjlss +WfzNwZFbwZzZmFZbLzNwzzzzcdqgRMTTPdHPTTPMRdcWgRPt +grsrVSFSSdFSDFVFjZZWwpWpZWZplgZZ +mcBPPPBLBfNdLlvvWljWJC +dMcmcRdbRzdVhFthSsTShM +bzvJZMTzTZSHLCCdDzmDcc +hqBqWPFssvshWvvssNqtsHftmfpHfdcdDGHmcpfctL +WvBQgNNNhghTJbJQlJTZlT +chcdwNwdbCbQctCjnnQGHsQspMHMjG +nSSSJqJZzJgWWRfZDJSnqvTTsVvvHVPpHVfpjHMTjP +BZRDRmmrDWSrZWWzWSRNhdnCFwChclFtwbNdtr +lNgmssCtqLwqCCtfsCLHPFhhhmMhVzBDbVzMDMVz +ZnRlQTlJzFQFQFVV +npZJvRRGZSnWvSvrSLglsClfpfcLgNgpHf +tVtqcVqFVtZhcfFtqlgSpmpDSDNPzSzZmNpw +LRGTHqbrHdnGHrTCSSwNDzMDwPMzNwbp +TqWGJrGHCHnTWnhsWcFthFjtfQch +qNnTbwtctvffFcqfrHjMrFjVHRjSjZDZ +dLLzWWPmCmCzGdsLgBLGGBDRMVMHRlrrrZDDZsNMrNNS +PJQWggCzWNWJzGWfchvfTbJvfnnwtf +ghzdgzzdQsdqzzhMNqQzvhgQnRRBWTjWWGTRGWwGTZhwGnBT +fsrfJHbFfDFLVLVFHrWCWrBRZZTGCCjwWZ +HLLllcDPbLPQdPspMNgvMt +fNDJqdPNbtHpCbwpCCCp +RTMRLrzGrMRMRPWnnvSmgCHFCCFmmT +WQsWQjzGWMsGQzWclQtVBJfBftNdtqVPfP +gbTCVVmDVFdsgmgrrcfwlwfTfPlcRR +qhQZqQvnQhLQhJnvfPcSwSwlfjGcqjqj +tLNZLZZJJZthpzhMZDCdFmFsmWWmtDDgsw +bqCvLvLppzPzPPvPbFztFtttBNGdGsRggSgGSHDdggHSzNgH +rMQpWfMfrcTjWJhwWHHsSBsRBdSTTNBgSR +VwfmWjwMWwccrWcWpQQFnFtlCqmltFnFLbbZmn +cWqsMWJMzqJJMHsJcqsJqTqjSbLBdfdSbtzLbbLfbSfShfhd +gplGvQmRrCrgZSZtSGZZjhbj +CQmmmmNQRPvjgRClCvmmcVHPqMFMFsWJVqFFcnTJ +QHHqvGwjjWNqvGTQGvTFcGwJRJbszcPtDbJVbtPzVbDptp +MLdrgmSgZZdhdfbLVRpszlRDstRL +gdSgMCSfdMnrghCWGRQvHwvNHjnjvv +RDBZwvZBrMlsvnlb +WdFQqdjWWcHHPrwSPnnSWnSS +mLdqgqHmcjHHjqLHjLppmhfBfgtDtBJZJfVtBZwGZB +CCWRJQnZlHtHtNZRFDcBhrcvhDrJVVDv +dPPSqLzfsqGLSTzfLzLGdLMVVgvBcmgMVwmmDFrVgmBBBr +SFjdTGzqpjdRbNRNnjtnQR +hjNcwBDDwDFcjdFfjtFhtcRsGGgTsGRRRTsGGqZGRq +gbmrLnbzLmvQJnQVVpqZTqzWSCRpqRTsSR +MQMvVMbPQQHrQMnMPldtwNNfgHtlwBhdwj +zwzwpzMfzrBMWfCCZrwzrMJDGGGnNmGNZvgNZsDDsGsG +FbFqSbcSbSHqTjmgGFnJglllsDJm +TbhVdVjqdtqTjVHqjPdthPBBWpCnRfwRPRCfBCCnWR +hlpmbfJJpCSChmJMmrSjTjcSdjTtQQTtTtjF +gqrgsqLzgnBgZGzHBnnsQNNQtjjcNNjjtNFQNcNH +LVRzgGGzzzPCVrJMbPJb +VHrmqFnVdvlzzNrr +PMtwBJPBcPwfbwBJndplLvLdLlgMMzLL +bBZnTwbtnScfQJPJwPTjqGZFsVFjDHHGhhHhVj +cftqScHJrfVfrrRZ +DTTsDvvlBbTGrWBwwsWDBbWdVpZjjZjpVPPGhRRVjVZNRPNN +lsWdWDbrTLBsbdrmdwbMJtmHMQJccFHFnJFqFt +SWNPTPVSWChCSmQQhpppJdFJLpDpgLJmLd +NGGtNtGfHtDpdJdqLB +NcsNGNjHZsZGnzZfnGhQnhPClrVlQPhTVVhl +QDdgMBsNhhMgcWbZdzmWLzFzWH +fRqRJJqGCvrJGjCRRrSJlfPtHzzPmfFbtPtLZZLnmt +VjvwwjlwVGGqJSSqJFccshpgNhQNQTsVgBgT +wvDLDwCbFgSTfTSJJgfB +qsRhmhqchmVhPdfTHJSzpCtJpfPf +hmdhrWrddmhlqCRcwQjDLMQnMFDZnlLl +trMWtlwwMplMZMCZWltDpzBLBnflVLBbHzbBSGlVlL +ghhqJTfmjQjfqqznznnHnBRzBLmn +sQhPQsjjQcQcTsPqZWwwZcFfWrWcrZww +MRVpVCZZTHWVMCHvgNvVvbQSqgQSlg +NFmnrNDDfnjFnndfssmcStvjvQQlvzvllqvwQllj +GGPNmBrFNdcfcGrsGcdmDFhJHMMhHLZJMhpLHCMMMMPJ +DSvDGdGFlGGnDZFdVSZvfPqwnfhpnrqpPNpLPrrh +sWcTjtHCsTmsCNfgMPjpfPhqhP +BtHzBzChzBBvFSDJvVzFJJ +sfsNrsFFBTfjwwtNNWHPVCVWtSCDDCDmmS +zMdhMMZnSccMmmWVWmCPlC +cLSScJZQbcvLhZvnzBwfTjrpNwNrBFffpb +TBrCBgrTngVQBVbhrCtgJJrGssGsMGRGcjMcNjfN +LZdSLvHMFdzFRWsLjcGRWWNJ +pHpzlqPqFPvdBthgMbVPDhgh +SZlnZZvBvvMrcBnllBMZSvhGMtQwFMGztthfwQtMwwPf +HLqsDgNsDLDDDjggHDHszthzFbQGTghPGQPbTfFT +dmLqDqCmFNjJsjHdssFNHDVWZccnRllnVZvRSBZrZlCc +SccnnSGGftShfHSHHhnvbMjvVlCjzbVzzbMMTbCB +gRpppNNQLWqZgPZwNWwwBMBbDlZCTzVTjHMMbBjV +dqNQPQRqrqpPcGtchhdfhHSF +mfDzgnNMMszBtJCpHlrjnFppCdHj +LLRThGGZcbClBQpdWFGl +bSqVTbBbMVMsNmNM +BTTbbLVpfchmjbsj +JSQJHDMHqdNZTZlhFFhCFFrNhNcsrr +tMwJQlwMMlQwDDJtWGLGPpWLLGnTPn +LcVQQCPPLqTzqQTcllTzhnHHfFJRcGHcFfwRGHwJjJ +stdWDDBtVgbpWgZbsNgDNdWFGMnnwHfjHFpfwwMGMMGRjJ +ZWSDtgNdWNBdgsdsNDDsdbDlTzCVSTCqQmSqTQSvhqLVQq +dZbgdZbNtmqttFJtHHzcczMcFszHnsvH +wwpQplQQwqVVjqwPjCGCSMCMcHSHvvzHMzvcsrMc +pfjlQRpPRRLQWtmLNdWdmqqJ +CPTPPmbjmVjVGCvzbjjPrGsnnMpttdtGdncdMccDRd +lhlHzQSHwzhJLwgWgpMDMMsDdcDQMDMMns +BHZghLWwSFBJJBFvzmbfjNZvZmCvmb +PBGcvvcRwpwNcZcNPpPNcTHGdMtrCWrCCtCLWMtWgbVdMV +fmsJjnqmmfsjQJnjFzSFSqsqgWrtMttZgMWVMbbVMdbSrLtr +qQjjZFmfjZhZmwcvPhNpTNBTwN +HHlVVmmsbbqMsJmVzGSBMSrQQrRrGvvnDn +PZcphZPPZPhjcpdWgPZhRPfcDSrtDBSGNvtggrQtnvQNGNDn +dcWwFjpcPhRcCpjwdCPLzHblJbLbzmsmbTwzqH +hRfzTTfRrTGzhGWTrRrbfcQZQSttWtwddJtvdJJvWSHq +npjnDjFlpDnFFNMjljCnFMQtHHtqNHNQJwwZZqstNwJJ +DCjpLjjpVLDMDpVLDLQbbhzBhVrcVgVGQQcz +LncLBLjCSNrNrNpCLQBBBGwqQwzlzmggvqRqgllmzwtv +fMZPHhhHfthMdbRgHJzmVqlvwlwg +hfsPbZFPPDsfGLcBtSFNBSjL +MlZmszBMJBHrMBMbShwSFpbZSZfwwb +TCLCcPNGTgTPNGWtCtcWtPcSsRfRjRwjFbfpNFDjwsFspw +nVtqqsWsdHzJHqmM +RCrhSmWrmrvmrvhMvRNrRCzCJcQQbPtsMZVGJJtsZssPcQcZ +jLFBGqLFpqBLgZVbPbsLJQcbsV +HjDljGFwrRHRRTrS +GZZhnrwZBwNjRPRCbCbn +fJtJJpsVfpgNTbVNFTRP +JJcpLJfLdcWLdplwRdQMBvSqwRhvrG +wmZDPlRlCDwglgsHtsBvdBHLFLSddr +VbVMnMftfVjQWFFHdMBdBFMFHr +zfjtnGqqnjGqfjPcDPlZPlRDzccw +BRjhfhvRgnTMlFDDJfZzZFFQDZ +qLdqcNttwwcwwSPSpqLNmrwmrZsGzzDFZGZFzVssrzJGnsQG +wSNdHScScdmwHSpdNcmmtLMvChRHbvBMTBnCBBvhvlCh +JgWTPfFPgCPPlCntQSGghHvQnSdQ +BzvMZvLVQpdQpSZh +RwVVjRDVcRDNDTlJPqTv +SGHSrBBRPhPPHQcTccQTRRQjTN +vvWvspCbzWVWVrWdjj +wZpDzCDgDbCZJZzJGlrlqPqnqPllmH +FCncCrDWMLCbjMCcFpLdzZfmZzwwWzdzNRZdWB +sqsgTqHSqllNldMwlZzJ +MtHPTgQhvhhqcrDrrDpjLCQc +pPPvmPWSClqqPvqCmSwqmgGBWDjhGLHfjhDLJGjBBhNj +zrbdcdMndcRdTrsMcbTRdzRFVHjLjDjNLNHsfDhNGjhJNhDj +RdFFcnTdZcTrRRdFFbZtwQCPQglvPlwJwQPZSqqP +wlmbvwmvQvWQsvmbsSsQbswlRCNPfCTcTRVCffPtTSCPNRVP +FhJJJFgFqJGBtDpJhTTcVcVhdcCdCdTV +GDFtgLFnqqDGqGZsQvsllrjbLjbrvw +lnFSnJvmgvLlfnJpgnsjnjgfDQWqCJqZdDtDCtCtCdDrtDDQ +VTBBMPFcNNtMZDMW +VTGbzGGhTbTGHwVPvvFnfpvjgHnfjppp +JJwHqvlvDjljDwJFlZjZDwHNNsMqhNpphNpmNVzpsnsnRV +mTLgrLLcLSTTTdmPPfrrrnssNhRNWhgngzMWzgzVnM +SmTfdSBbBJbtjJvljl +bPNLwTCLLQQqtJsf +zdnnZVlWWGGRWGWdgdSStQMqJSMRptftbsMf +FWbvgvZZZZgnTmwrrhrFPCrP +HcGzzszFGllHWHbZspHbHGsHTwwrTrLLCNjSZwNjNjjCCNLj +PBJMJQJDDDnDggRhMdRSLmjTmTwwVjVQSvvwvC +RqfdhgDPDJDqJJnBdfzWWHcstslcbtStfHzl +zvRRlCqrdNdZcZpjBpVwjsmjsm +fgbTDqbhGfDnLDnLLqLhFmsHpTPHjHppppBwpwws +nhnnnDDngDtDbfSbDnGhhgRlNvQdQqNvQvtcQQNJRNJN +cZbCcbbScCbcmPGjPfSBQQSq +lnMnnVsMVvmzzGMDzPDf +LhrTsTTglrnsrrWWVvlwTnNtcpZRCmhtbCZFdttZbRCp +NWrFPZVWNVrvvrhtnNdddtpldmjm +DcBQBDsJbCwQnbtdzmjjjljbpjbz +qCDcGsDJGCcBDBcswJnBJQDfWfqgvZSvgZPfrVSWvPvZZZ +vcsdHdGtHtMHMFtVsddsWCcbppZwjScLpWhbjRWR +NTwrnzJrgTPrDwnlphRpjSpWbJJLLZWj +TlDPfPnzzlzTBzzvQFFBHMtVtqBqqw +NHnqqfZvZBNHHvgfrSlJrJCSllJRVrCn +TDTdhLMWjFcddMJPSSPJRmlCPz +bljWFdLLTDLtdFtLlwZvqfbgwwHfwqHNvw +BRRjhRQndRNVqBjRVhFLccjpwMmLmjHmgFHH +fZJfJvzPPWtWWlltZzZPpcgFMsFFwwFdpHdgwtdw +PCrdrzzfWCPdvSlqTqNSDnnQVVQQGT +DjbfBMDSfBljBsLSjSZbzrGtPtMCPtVPvvqrzqzG +mWdJWcppcNTdpppjzjRRVrPRpq +QncmnHwmdTmwQcmjNTfgfhlBShshhsffnfbB +WGDsMJsrjHCWtDMGDDVQqSvZqfSJzSnvnvvv +LgLFLFBFLVVzfBzMqZ +lgmFcwLhNcwdwwMLwhmcRDjNpCWRsWRspGGssHCp +PnPzNccnjFfvCvhbSBVcWqdhSVhV +psGMDQJDDDJgQNDHHJbwqwBsVqqZVWBBhBdd +DlDJDQGptpgpGDfTRnrTrFPnNTlf +MSSSMLLmFHcDScSq +ppZnCsbjPZpnnJcbRDmzHJqRRD +pmNmnGnQNnClZGMVMdBGrMgVWg +lsTTGcQzBcljCcQzGcGjGptttpmvSJtmggtwwswwtS +qZRnrhMbRVdhZRhhdnnVRPbmwSNwNNHtmJBvwpvtwNSvSb +VnMrqrrdqhZrnrBLLlzzlQjQjLfTcGfFDF +dJJTlHvhZqZlQTJnSgQDzgsSbScsSBzc +RRNtGjCCpRPPpRtjfrttRzmbscLsLZLgcsbmLzSGLB +wfNttfNrtWwPNNFfRtpfrdJMTTTZTMZTTVTlVwTlvM +PQTGLmdNTgPmGgNNdCPLQlrMqBrDzMCMFqDqFqjVCBCD +hhRwwvpSFmzDrmFh +vwwZfSfsmvtSspnZLLLdLGWPTGTQtTWG +pMcWzWFvWhFpPMWzvvhpdprHTZTQrHrQdZTJdfTgQTnJ +CGbjBbNjjDmRHJDgrTVVZg +NNttGlGqNLsbtlhMFMFcMLwMvvZz +CGSCBNCQBtBCQttBwCGtGtQrqrLrJqZHLHbqHvLDHLrq +nVVhPMfVdfVPbfqLLqgDDqPvgZsv +cpVncbfnhFcBltTplpmTBC +MrdcdStbMnddtRBdqMnFmbqGCwqCVHVsNHwPfGVPqsCsCs +DBLllzWWQQzlZVVVCsGWHfsH +JQphjTgBjlLgjjpTpLgvTjQnnnSJJRRFmdbRRSdMRtmdMc +QbRZMSWMblwLsgpwZzqZ +BFncBrfcdNrrnVrNjsFzFTJpJLGJsGqLTp +VjhDDBdrfdhQMllzHmPQMh +LdVVjFVFbpVGRQGllG +cNMcJNHzJWJtCWHNJHcHczWpGmmhMQmBBqrlRhBmpGpGBQ +JZzTTtCZtHCJnNnNwPfbFpnfdDdLdnvP +TpMlrWTTddjmlmDmgQgRtw +MNNVMSsVSNSnNVMFLDqwtGgRRtGbgFRwtR +CCLSCPSCZZHVCfZscBJJhPphpdpprdhjJM +gSMSHJHsMMpzRgHzsRMPPSzsPhtZtZdqdDqQDhdCdZmQldht +FCcCnrGcNTfvvtqqfvlflQ +TrTrWNWwrTJLMzJCzWLL +TpTzwMrfbrpFpMbFrrrzbPSdZmtSZRTlTZRlmdCVlCtJ +vqvWgqDJQJsQCVtZgdZdRRGd +vsvLJLchWBcqnvczwjLfzPjfrjzPrz +zqzbqCFZgmzzmNmf +vpRWSbRVbVWddVpwvwdRSwnSNgLHsnfNgMmgMLMmnrns +DwWVpJRlpdbpRDWdGJGcGlhFtPPCqCCBFqZPQttlqFBq +wQRlwtBJBDwttJdGvLfBvHLLfTLz +MMmNZcMrcMFnRHzfjjvvHfvc +FggpbFnhrNNrrMrMbMbnhQVJVhstJwqWCVCRsQJQ +DQbCGblQlpQFQlHjCbjwDQQMggNmJmgnnpRBngfZmNgJMf +zvhWccWVdWBchdssPrrWZZZfmsmmmgsnZZJRsRTf +zBdtqPccWPHFCqCCqljq +ttrbRMmgtHgfmHSfBpLfnBBZBppB +CVTJDCCNPwCPDwcqzmddQZdTQdnLBQThWp +zwFDjwDJJPzjzVNcVJwCcbRHGmbbMrFHgHvrsgbblG +gZjjwHqHCzrMZVVR +hhzcdTzPrVhVCGMb +fPcmLPNffsccJDdNDjBnpwzmHqgWjHwwvg +SJQFSvQBlzbSCgdPPddPPPSN +pcrjcWLwwcHcgPNgTPLMNTCB +pRsjsWRnrpHRmrBrHrjlbJFvvzQFnzQblQDDbJ +VjQVMQPVMfVPPbGPHHbGJD +pcqSttltsbDGddsCJG +TSchqLtTLFhgQbMMQMrr +trqzMRwNTtDzLPJQgWmjmjrf +lbBQdpZbsmhGmZhmmG +llVbpCplvvHBBHpnRDcDRRqnRRQnFRzT +SLSSFFmzLShsVSSHnLnrJdbnRdZZbrRw +qCfWBftpNWNNlqvTpwrRbGGCnwGmgRJGZn +NcTBNpvWvBWpMftNffpqWlTpmzPDQPSzFVMsFQVhHsjHszss +VtJtNBRBGDpdpNbC +QgLncnttvFcwwhLvFjSGsSbmmQCSDdpCmpdG +vLgjLhhrctMvLFFjLtMTLMgfPZqBZPZzJBBfWZZPRZZTRV +mJzDJJpJBvfsGMQnBM +CwPWCLRRWwRqwPqhPsrZrnrlhhQrMTrvZl +dCdLLSPRLSqWqVSLqLjgJDzDmtbngFVtJtzz +mtgWtMWrqjzQTTjghwwfczlNJdlcJnlc +FvRsDPPFGRBFvvslwDnTlcTTdwndlh +SGBZRBTsFGBRvLpvSCmgQWQjgggMrQjmmSmW +GcsRrQhrVVjhRcWlnDFGGmvntDWZ +TPbSgJJgBSCbCTbLHMCMTTZdFHvtZlWZDZFzmzZHZmmF +gBCMCSpbPMMPjcjqQQpqQprv +nZJcnZwvwzvTTTVtpDFnHH +DQPBqGGGdMdTRHRBpNgFNR +dCGPfhPWQdWWWCWShWPqrChWLLwLswjcvSJbvbLjJLbzJbJD +QrBQtdtrQBrdtFHPrdQBDvGhLGnPnCWnmpDmLpmD +NjlRJRlNzJJVbSSRVZwwJcmpWDGCWnbchnLCCmnWCG +llSJzsZzMMlsSZjSjZwJNQqtHHdBFsqdfTHhqFftQB +zdTJFHTdDBzrNdMnhNnNdM +ZlLZZcLtVtcWtGjtzLjLZjCrnVNrnRbrQQbQSRVrRnSNqS +lZtGtCvjZPCGCctPpsDDBzTHFmPmFszD +mQSMvdMQtQdZhQrPWCPqPQrN +RwjwnZGzJFTZgzggzJDDwJnCPPhNNqPrLhrGNcWcWNPqCq +ZTzDfnwFzTngTwJvfSlMtMMlmsHmHt +lZlmFRVZWmgQWhRsRpJsCJpJct +PTbPTGTGwwGrbdfjNNZJvcCsCZtvpTsh +bGdBBqGrdBPjDMzzVFZgqQzFFL +szvsmLvppPPtzGLGWpVdTSHTNgjHQRmHTgSH +FnBMBNZwZNcnDZMcnZlZgwgdQTTHjVJjHHVRQHJj +DnZrFCMZMNffrLPbLsfW +rJvmnBgnrCrGRSGNQR +hthjNfhwctwpjTLtVLjTGSpldSCGSPdlPSRzSqSz +TVcTfHNFcwtjMhTvgbHZsBbWmmZbnH +WsQgstQmvQJnssWsWPzhRzhBjZBSBRZSnj +qwCNqFwDrrlDrFPvRhTSPPzLRz +bppqwppCddlvfbDNVgmMmtMfVVmfmVWW diff --git a/2022/input/3/test-1 b/2022/input/3/test-1 new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/2022/input/3/test-1 @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/2022/src/bin/day3.rs b/2022/src/bin/day3.rs new file mode 100644 index 0000000..ea1f3a5 --- /dev/null +++ b/2022/src/bin/day3.rs @@ -0,0 +1,92 @@ +use anyhow::Result; +use aoc::Solver; + +// -- Runners -- +fn main() -> Result<()> { + Day::solve() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_test1() -> Result<()> { + Day::test(aoc::Part::ONE, "test-1", 157) + } + #[test] + fn part2_test1() -> Result<()> { + Day::test(aoc::Part::TWO, "test-1", 70) + } + #[test] + fn part1_solution() -> Result<()> { + Day::test(aoc::Part::ONE, "input", 8298) + } + #[test] + fn part2_solution() -> Result<()> { + Day::test(aoc::Part::TWO, "input", 2708) + } +} + +// -- Helpers -- +fn convert(c: &u8) -> u32 { + let result = match c { + b'a'..=b'z' => c - b'a' + 1, + b'A'..=b'Z' => c - b'A' + 27, + _ => panic!("Invalid input"), + }; + result as u32 +} + +// -- Solution -- +pub struct Day; +impl aoc::Solver for Day { + fn day() -> u8 { + 3 + } + + fn part1(input: &str) -> u32 { + input.lines() + .map(|line| line.split_at(line.len()/2)) + .map(|(a, b)| { + // @NOTE This is not really ok if the string contains multi byte characters + // @TODO Is there a better way to do this + for c in a.as_bytes() { + // There is always one character in common between the two sides + if b.contains(*c as char) { + return c; + } + } + unreachable!("No characters in common, this should never happen") + }) + .map(convert) + .sum() + } + + fn part2(input: &str) -> u32 { + let mut lines = input.lines(); + + // @TODO Is there a beter way to do this conversion, this seems a bit messy + let mut groups: Vec<(&str, &str, &str)> = Vec::new(); + loop { + match (lines.next(), lines.next(), lines.next()) { + (Some(a), Some(b), Some(c)) => groups.push((a, b, c)), + (None, None, None) => break, + _ => panic!("Invalid input"), + } + } + + groups.iter() + .map(|group| { + for c in group.0.as_bytes() { + // There is always one character in common between the two sides + if group.1.contains(*c as char) && group.2.contains(*c as char) { + return c; + } + } + unreachable!("No characters in common, this should never happen") + }) + .map(convert) + .sum() + } +}