diff --git a/advent/days/day03/__init__.py b/advent/days/day03/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/advent/days/day03/data/input.txt b/advent/days/day03/data/input.txt new file mode 100644 index 0000000..a61bb9e --- /dev/null +++ b/advent/days/day03/data/input.txt @@ -0,0 +1,300 @@ +fBDGBcBrGDvjPtPtPV +QhzJLlLJZgLZzNTgZClQHvRvHFvrjrvnNjHnFjPF +ChldsCZhsQzsCGrrSfMfGpfrdM +MJbgcgJlvMSbfjMSbllmCrntwmFrrFwgtCtFFG +vPhddVZZhmnmdnHmHn +vNBZppZQhjSzfScjDN +jwhqbZRvbzvbqqpqzqHHCCCzsLmmQVtmJVJtLWLPrVLLVrmp +dGMfMGMdBBMSTfdMGTNlcZGGPSmQJVVWsJQPLmPLVPtmWPLW +llMBBcfBnBcZMGgqvCDbjbwgCHjvzH +RSDprRrwgVVRwrGqrJsNFJslgglmmNszzN +LLnWjcHWnCTmpClhHp +MpfMZWjtLMjpjtBPnLPndMBGRqwbwBwvrGwGrGVbVvwD +PQNGshQWtwWNcjssJHHJdlBLBlLrRDFFCrdwSlLB +mbzqZqsgMzfnbmbfgpZvZBLrLlSCrprDlLCrdFBlDL +MfvZzqMmsVnVzzTTbMzfvnctjhcHPQJJjNTGWjQJJHWP +MdLWQdMZrPQWsPdMQPLSqGpHGbGqpqqqVzpm +BhgFhVgnlgBNFtNwzpbTGbTTHpwwbF +tCfvvCfgvBjnfflftCvjWZVddMQZsMMsRdMZMP +lTLdHVlqmqWdvjvJttvFlJtC +ngbMTgGhQpgrGtvCzcCJccCrcj +npgwnDpSDbgbbnGGDQnMDSMgZZWVqNTNPRRdwLLNLqmPZTLP +RRSFZvRdrdbSvSVLRZrSGZZrHcHPfPPwJJVJmPHmJfHVThPm +WnLjBQBCQWqCQwpPmHTcfQpm +gBDttlnqLqlvzzlGRRlr +wGpdGdddMPDWgFJGBzmMlntTbZMtZbnT +qNSqQrrqSjQVrsvTtzNnnZTnfNztZw +rcVrjjsswVvRRHsFJLCDCpCddGCCcG +jLMhCPWLCSWSrRLPWmPPLSCLtcTvHHDhZcfHHltlfZtlfgfH +rBBNrbVdtZlvVcZc +FppGdpFsnsqGJnsFzGdJszbdwSLRSRPrSRjqrMqCwQMWQqRS +jTjZwnpjMDfZnmZfsRhGGztqCzwsdGws +JHrWcNrNNrJHLHlzsCtzGRRRHv +rNLrVBJFLmfCnbTpVQ +LGWJvDFssFmMBhThMvnB +CprbCNZpwfpwfrbZJMQMTQcVVgBZcVQBZc +ptNwfwzHzqzlttbrlpCCqzwtFLGSWFsPDLWFHSDjJWSDLFDs +MZJjSsCsMsZSSdZJhdjZtCbPHljqlLPlPRRDLqHHqLbB +mmwmVpGrnngmggGwnccPbDBPLLLllLBcFRFb +GQzVTQTTVzVrQrmvpTnmrQmMvZRhZZCZSZfCsfttSJddNC +gHZZQRdVgRQWWRPHWPnttDTmqQqDQnStzNqD +bscfjslJJspBLsslNStSmTmLmmDTzNnS +JJCrbbhBsplrrChpBbfjlpbbFWWVggPPhZVRRFPdVMddPnMg +FtLfHNhFJCClJlst +jnDQqnDSDSRqwBwnjdFlZbsrTZdsJsGCbw +zDFSmjSDVqnRMHmphPhfWPgW +rSpRtSPWpStVqrwSSdrrhZvnBBnDBvsqjlBqvvnnzl +LFNLLFfFFhMFbcbmbHbHgTNcvZvBZMsvBnJBzsZvjJvZlvnZ +gmFLhTTbFmmQrrSWWpwWVtwQ +DzmDJGSccGJPcdcJPJqwplhjBHmHVwwtBthV +grMMvRsNRnWCFrgZRrZFhpVVlHVnhpVjVtljhhhf +FFZFZTsvCMSQTdGcTHzT +TLsGTnZncjVmVLgm +DvRwMcHMvMbwBVlCBlzlMjCC +FdRtRHDwQvPnTfPqcFPP +rZNdpBSldLLCJZbbCT +WQcQwqsmQmmqJgTRLRCqLq +znQcwsmPcmnCzQmfGGnzHSDFlNptNthPSdllhFPplS +vWCWvVhhjPNjNNvWVNbnbHnrbGrmlPqnqqbw +JdZSLMgsdgQMcQssQnnDqmDqlDqnDlwrHc +tdgQSSdpQtSMSNWpWRfRCwjpjV +qhdJFpChSJhDFDrqbpJbddSHPPRnGGBfBrHfZRnjRnlBZH +zsMVzmwmtLMtmQTzvwlRcZnZZljvvfGcBjcZ +ttQzMtVgMWVMQsmtJgqJgCJbqhgbBSBN +BWvdCmZBrNRrGSSfTzQJJRTz +gMblllMgLVswbgwMsLjgLLnlVtfHfttSQttTJTSQGfGPTPTB +LMgnMgscgqbFBqvBNFBmNm +VlcczDZjjVbznwLnwpTH +NfJPJNfJdJMSHSHnjBRSnbbL +NddqPttjsdZDqhcqlFcD +NVrNBBFFFrvJJrVTFTNvWBCbCCgWGqDqhqghCLqbqtCC +mfZVPZPcqtLbcqgc +fwZlwzfRfQQPMZBBwwBjFSjTVrBT +GWWNMfWWwGWMtjJnVnJzlzVsvLnsVn +ZpRqHTBddsvtPLqVPP +bpSDgStgTbdFTpDdRmfwfmfGFcMQGWMcjQ +gCgGBgfCbRLbBLGnGBBfRGwprctZFMvtFtvSNNTZZtMvLc +DhJhDzzQlDdshVJlDdhqzqzQZFpppFMNtMZMtFFVvtpSMpFV +qQdsDHWWslnNgHmBbHBf +MRvnJFZVnvzJrWWSqMSPTSNqNj +GlcbDpCHCCczdsDppcccBGccqjwTTwQPPSjNjWSWSwwsPsws +GbdlBbgdVtngtzVg +GqTSRpgJgDNSNJqJlSTJlJCBmmcnjCjLFcMFmnGsmBsM +HPhfPrWdfrQPPPhQWHbLFFWFCmFjMBFFsLBFwj +fdzVbvfshrbzvfbfdVPvQtqqJgqgDpNTgqZZtglZtZDD +wsPhrDMfrwdvHdTFrrtH +lnQbNBbqVBqHGJSddvTlJJJJ +cjnHznzbQmgzqQjBWwZwRjDRfWWhWsWD +SsScnttbbSzRRMMMLpsBLP +dDJGgjGJVMSBBBMj +JGDNCfgfSChDJrgqdgqJqGbNbbcbNtzWFctbzzlWtFFn +dtsBsCMtwSVBlLZZZnMgcMZZ +brppQHGznLZgJzJJ +fprvRpNHpNnvbGDBCBPwBWFWBFBvtB +qjgjSgHNlSGHnjfSVDvDPRDDtcdDcGtD +FMTnnLQZtRZDbcZv +zhBLzrCwnCsTCMCQTFLwwCzpHgNlNmHqhlqSpWllmlllhh +bJqqFdfbGdfPNsJsdSRCFLRHLDDBHDnShL +lQWlWQpwQjlpwrjrwTSCTLMCCNTHRDDDDRRB +wtWgQmQQWtwWwrljNPfGPzJmbbfzmzZf +MjppbDGmNNblCpzsNZzhNPgHtzzs +qvdrqrQVVWLfqWfRRPRwZPPwggpf +cqdcdpqSrrSvrvWvvvrSbcGTTTbGlFFCCcnnGbTb +HLNfNGttHVFBHWSr +RZCLsbCbLbLhwzDgbZCbRZhhnpSnnWpWplFFnDnqlBFVpSVB +MzbhhzwcLGGfGMvMTv +PdBlpdVJlmftGbTzwbtRTGGL +NQNMgWNNQNScDhsSHSWhsNgbRCLwGnnwqLwLHbbCGGTjTR +MvhRMMRvQshgSNDWFrfBfJFZrFPJJJPBBp +qdtnQqWtnjfGGzsnGQmWWfqQNbRTgggRFNbCFNSSFlSJsrTr +PZBBbPMvVcMpSRSlSCpCSgCT +MvHZhwMVLDHDcZMvLQfwGWqwWjqjGbmnQq +NFPmjNhGthGNpddddFpzBbqPczSqPDzzDgbgLZ +VJWvwQrlLHWrvlQZDgZSSDSDBqbb +WfHwMWfvRvMWrWJsrfMRWGFmGGLttMNpjCpTdmFFht +DppfNpLwhTBRDbblgWNgCdgCvs +nLcLqFJrHJmLcFmqMFCdzdHdsgvdzvbvWPWs +nVFqrrQcSVmFjrmJnrFrSjTtRGRLBwfRTfZwhBQhRGGw +sHrZdHGpHhsrLpsssGLzhrdtWdJTMWJvffVdmnbfJVnW +cggRDCCjlPQCgDRnfbTtfMJfWVTm +cCDwQNlwQPjgCFDljwpSLFzGFzZhzsstSpGz +dGTGpGdPZZCpnnLRpgzgzn +lflshFjFcrNdBjMjMnmL +hDfrldDfbVPbQCtHHZ +cSRZmtFZScfjZtLbmCNMqhMVQCjwqqCwVB +pddczHpHHzgWdGdsvPrPzcvrJMNwJCQwJhNwBhCJBVMpCVJB +cgrWcHdnPHHznlmftmtLnRDD +PZFMMVJVZmVJVHMNJNVfNdNNSnSWsSRhgRRQnWSsRnSWmszc +llljlTwlprClTbTpwLlgQqhcnwnczhcgSqsQRR +TpCtGtrTBDZVZHNQZQdB +SggjglBBlzbDgdpFJddZpF +CCNLsfNfrcMLsTLPfPmndmTwmZtZJZJdJplp +sfWCqcvMrlMfMLsLNfhVGvjjjSzSzVQhQvVH +NTBhNhfBvfflsbSmcl +nrMZRnHHwBMZRsSsgSsGrbmdms +nPPFVwVWJqJBVJLT +vvWqWJWJvzfFZZJvWQzqZvdPPHjSfHjssHsbsfbjSHRR +DCwtDVjMCrltCnCrDCDmbTssPHLTLldssdSldSRp +nMcGtDmBmMGrGvvvvFhjFZgWcN +tGWWWfWpMDjMZbTbnqTC +JFscJzFPDJDJZnrJ +sBFPcBsSPBvmSPwFzSSQfpwWfDpgNNfWtfgpftfg +BvTsJJzQJLMlbhmbFlNmTl +PjGnpdpGcgDmhvnvmvlbmq +dRtDGGgcDtjRcwdgQLVLRMJsszJVLRQv +FGbPPfFSchBGSvGGWsjSTLVQLLVTsQlj +dDzPnCrRCrrWHHTTHsdVjs +wrwCgzMrNprCwRJJwnnbFmmpGZtcvcbFfPFmFG +fbrJjmmmZgmZLJZsBBWlCBGnCWdnfF +RVMDDNDHPNvvRvDtHMcctMqFslqWPnClddlClFlnBqCG +MDDvHzHVQMMDtTHJLrnggSZLTJZgTL +dgBBCBBdvbmrRczFMHMSrqjjSPzn +tZTwQlLVwnQLQQFJVPzjDSSzJFPD +fhWhQpTTZQlWfQWpWQWQLhBgchhRCsdbvNnbgRsmRR +LttflLnGrnMsmmHgWTbdMW +vBSWzZRDccWBFBmJsmPJmgbsgB +FppcFWRNRZLLppGrGrqr +JJClRmLlFGvMTlFLLfPFQQcDpQcjFcjqBc +zgHSZhggggtwSZhrDgsZgbjVQcVcjPNqcpQQqBjNQzNp +hZnsShSWGDMMMRnv +RbDbslClhsfNCbsMjbNrjNMfpTTTTJSzHTpLVzLLVWVzJz +ggFGgmqFZBnnSzTWPpHBLzdT +vmWZWGwcZZqthjDrbclNCjlD +dCHwnVBBCBnVHddqnQRdbbbrgTsfWwjcWlsfwDDg +hhlFpMtGJlZmDjfWfscjWDGD +hFNFvZmppmSlNJMmNFztmzFhdVPPHQQqqHPvLBQnBQQPQPnC +WfzsplQpvQgfwzlbllPGtPJTTwtGGZBTTGJB +VrmMjmFDjNjjDFBhHTcZtBRRGcGV +mqrFmmLrjmjZnmqLrmQsfvbsfsSSlpWqgglp +lsQVfDpfflpGGmQRRgdQbdfbWdqnjnHnqZHJTqqrWjqqcWnZ +PPFhFFtwzqjHgjWTWF +SwMwMhNMlMsgfQfl +cSttSDQQCgVvQQSvsstthQcslLLgLgLnpglffjfFlLFblnlH +rTTwTbdBpTHJfZZJ +BddPBzwMBzqRqddRGbVShvVhVQvQscvGtV +sSpsHqHMspqMqWsspwsSWsbBPvjrFbddrGTvZLFjdZTZGLLG +NccDncRVNDVJLvLPPJTJGvJL +mRCDNNhgDnghNRQNggNRcNlMtpMPMMtHtShlSSMtlhHW +QrjSFQWzDdCHtpFlbBbVns +PhJwNLfNqgfdLlZHpZJJpptBBb +qmwhfhhfMNWSmSdQCddv +VfRMdbshRmJBqbmDBH +CWwWCWTCrzFpzWwCWFzgppqHDtZBfqDmQtBftBDFqBtq +WlzrWWGWPrpGCGdfSsRGVnGVdNnR +lhLTfppGRhhbZntsbTqMbq +jrHWBHrMgjHPWMgWBJWBWjstPvwFFbbbvtvFqbPtvqws +rBJJJVWjBjLphcMhSVRV +fjrBPBjWVPWPrwtjPpRQZZVdZQddFdHFTZdT +GqlllsGLgMCqGqgTFbmHdTmRzgTm +qHchGscqGClHGhNwhjJJNWpwPB +JzrrJZqLFrnMzVjNNnNnNDwdGHGlHlHbpTZDlmpTHb +gQfQcRWPWgQSStCtfcsPsPmhsGdDhdGDHTwHpDlHwhTG +fvWQgCtfWgtttcPQcPBtjVdBMJMLJBFJMJVzNrJr +cMzNjGGNQFVzNNQVjNdqRLbFDqRpgLRDpDHD +TwtwWJJBJSvmJCWSvTTmTbBpfpRZSfDqqSqDgHLgqdDDqD +vtvmPrtWQMrbhMrG +NqCPqJNJQQQQGCtGPmMTrTpHlNdmpTrwdN +bzhZRDbnZHrmmcwRfM +vWhsnVWWswhSFvDSDsnhbDsLPqqPFjQjgFgtjqqCLJPgQQ +nqpfqfcnclcNcjjQ +BLQJQmLPPvdtTFNjlFNwPs +DgDgLLCQBBmpVSMrgfqnpp +njCnCwwcVCBWjrrhWrHdzJqmhl +QNGptTTQGLTdhqmdJBHT +GtLvDDvLMvppGGVZMssfCBMfcfMf +npPQGpDnsbJhvldphHFfpl +mgqZcqzczzzcqmRzrbrzBvfBLvlhhftFWlhlFtLBvv +cgjmTgbbMgmzqRRwGDDVQVGVSPwTJV +VhPNvgVhbjPsNvsChTZlHtlwZccZMhwlcm +fpznDWDzDfRqffpnrmcRmwlTMZrHTBHB +fWdQLFSnDzpndqzzqgsVvPsJLMsPCgvjPP +RFRDQVvqVMZGBVzqgqPNJNmNhqqPjnPS +rcLLCWrtwlWrWlTbTtlLWrWtjPPgdwgjmNmShpJnjSpSjgSg +LbLTnbbTHsWlfbtZRZGQHHZZDQMVFz +dwcLLSLVdwLdvdfZNJgQZWfffVJQ +CTMlCRCCCTCtBmCFMQJNNNbNfWvQjvZggT +mRnnnpFlvhnlMmBmFMCMCcdHrwzqszprdcwzLDwrSz +JSHLHRMlzJHcGMpwCffZctZmgfqqZm +vnTWvQrnrQjNnBWvnvDnVgqtVWwVgfFmqWfqZFWZ +rdQDBdBrQQhmBNjDTmrTnzPzPPLHSSHzHHRHRLdGLl +GvMRRwGwRFmZRnmbMhZMGcpgZBpdgBJcTsjsBstdds +SNlPzzlPDDQSDDDqfllqDLBpTgWBgWdTpcWjJQsWjjTp +rScrCqPCSLDNrqlFmRVRRrbhmRmFRw +dbtgMNlNSMQPSLNdvVQgSfcHHfJfHJtfmmHTqZffJH +wssswnzwChsrGCCwGCjzCsHFHbzZffbFBcffbHHTBJTZ +rsDRGDwjhWbrbRhGCGLdLNlNQVVDPSlMVMvv +BgPccPPRlZZmTMTZzZTC +jjNjntVtQnWHrJjFPnnqDqJTJTzqJmDDCqChzS +FnQHQjHVNnWVvQpgLPGRdcLpbfLLBl +JLMhFJfHHLJChRvfjLJJnFRpPrpPSrNnrTrTTPntTptrpw +QgcBCqcGBBGzGrNQNSwSrPPTsr +zzWdmzcWcdHCJCRRCF +GSRcjdjGcBnFWbnVLFQR +pCNqTqhDsMsMmNtNCZmMMtdCbVFzbFwnFFnWWFnzVLTQWQLF +qNJpMdCsDNsNNvGPlSPPJjfBBB +lsHjgmFsnFTwHgSPDRSrDqnqrrnr +NmZWcZmzNMZWJbbWvJMJJMzBBBrRrdRfDfppBNqSrrrPBP +JZQZzQtWJhmltVwVCjwGjs +DslBHDpdDlslgffFWnGqHfzH +JNMMCCCCSMvzzGfMzP +hNtCJTwRwZQbwrplpDjlpz +vwvJwLBzwhhwvzwrgwshLwVWWgFfmlSFVRDfWFSVFVfF +mNqbdPnNdpdjnMqSFFMDfSFVMDFRSV +ddpTPTqmbNjjNqndZzvLzJZzHCrrCCzsJH +SLjjlGMVpLpNSTDspsrHpFFwRrZgRfwpfgFZ +nQtWPzbPNQtbdzPtbBCQJNPcwFvZJZFFJrwRwrHcfcfrgF +NQCnqPBWddbPnbCdWdWQnmdVhsMMDsslmSSmMLlVTTDVMm +FZmcqBChfFmfsDjjnNMNjSDgNs +RZwzdvdZRvTRRlvWSgDjStnpntDwNMtD +vHTGRvvvZHlQPRQTbPTVfLJPqcLJBhfmFVJPCF +dStFcccjFjqGFrFHmSHFBjBvzhpprWZpppbppDvzhsvDhT +VMVLNfCCCRTTDtDDDTRz +QLJwMMLnLNVLdtGGgmdScBnB +nTCWnTnrllglrNgNTZFgSZbddHtdHLLwtMLQtfbM +BJGqppPCJVmqqhBJCdwwpLSLHddfHSLHtw +qmzBhczVGsqVBqnFcCjRWNrNlrgD +phrHLNtnMpslNFfwVGwFZSBfFTTz +cmJJDmmbCnCCfBSJGVBwfBfz +DdqdDbcqCPcCQRWmQPqNHhnRMntNNMNhlsLsML +gHHWJWMWsHWgWSnPwVnVNGGDbnwwTl +QjThjhFqqhmQTCVPfDVqPbDVVl +mpFLLrZjjBcmLFmmFtLBJMddMgSdHTscvcJzRHRs +gRdwcCddwghzddzzzsGfZsGnqlqVVhjGDj +DMBNpMDHrNrNLFMmpQJHZGnPjFPFlZjlfGVljGVf +SpbQNmHMzgcRwSSD +drqcMpNbpFpmjzfz +HLGZGsnGLwllzHGGgGnGsBFfmJtmtjfJDSBSJJJB +ZZwQwHTgZnwLGTTnQTHVlgbWCQNhzNcMqbrzcNNQdNcr +TDScznfzNlpbbrtsvjdcbh +BBHqFGWGFmVWqVBBWMtvCLvsLdvrvjLjdLbsvm +tPZHGFJPJqVwMWHJVRRSZNfQnzfpnTpNfl +FWNZgWCngsNwJwlQlrRTRhSjSS +GGLcVVcVmppMmpTjTRHlbRbSrVBh +rvmdzPcdzmzMrCNNPJFntFsCtD +MtfLBzSLmMtfBMQzMmzmSlfdTDvGCZGCndZnZgWDwGCZ +HhqrrpppcqhdbjPvbgGvTCnWDbTWZT +cNjsdqPqchJBlmzlVQLtBJ +DwwVFZlDBsZFDvLPdpjLjSVHjpLc +nMnztWhhfPSffcddGpgp +tQnrQzhzNtzbNrBwPJwTslTvNFFP +LWMvHJJrJwtzvgwMwVdGfcpNfdDVDWfdBB +jZPFmjnbmhPfTVfVHdhTTV +qqQCmCmbqCQqjQsQvrQSHSJrzz +wNzmDRwmgcGphZcPvLLZHjjFLF +JlbsClVVqDqFZjJD +WSlnCbttftsCsWftbCCrTffbpdzMwgMgSpRmdwdRzggmDGGg +gCCRBClgfCgFFTltTGgBqTsQhzLzQQNPnvrNzHrrfPzHLr +DMjqWSVwDwDwZDHZNvLQnrnrPrNv +bcmWJqdVcbtgBglbGTCl +SFDcrFHtlqhqqLdzTTwdJLPNDL +vBWsWvsmgvvvdPwNnn +smfRbpsWMBmsmMsBBBNbtSFttjCHSScbhHtHhHjb +SQpgGgMNvggQGMvQcgnHWmldnHWTWndnSHHF +DwbDPzthtttljTzTFBlmzl +DstCswftDbZbCChPPRrfwsfPQlLccJQLvVGNGNVpMNvZcvgG +HdqfjjLfHqFSHddVWNBjsWhWRRJtBNBs +gPMQHpmrcmnbRQNRRJsWttWW +pmbcZwbrPPrnTPMFFdDwqHwvHDvzDq +FFsVtFGVGvWVhlfVhzlsFvHbPwPmwHLTSbLjcLtbSbLm +rZrpJwCqnnJHmqcbcTLTbS +RCZZQMQpzvRhswVg diff --git a/advent/days/day03/data/test01.txt b/advent/days/day03/data/test01.txt new file mode 100644 index 0000000..9919ffa --- /dev/null +++ b/advent/days/day03/data/test01.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw \ No newline at end of file diff --git a/advent/days/day03/solution.py b/advent/days/day03/solution.py new file mode 100644 index 0000000..72eecdb --- /dev/null +++ b/advent/days/day03/solution.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from typing import Iterator + +day_num = 3 + + +def part1(lines: Iterator[str]) -> int: + return sum(Rucksack.find_double(line) for line in lines) + + +def part2(lines: Iterator[str]) -> int: + groups = [lines] * 3 + zipped = zip(*groups, strict=True) + return sum(Rucksack.find_common(group) for group in zipped) + + +class Rucksack: + @staticmethod + def priority(char: str) -> int: + """ + Returns the priority given to each item. + It is assumed, that we are given a valid item + """ + num = ord(char) + if ord('a') <= num and num <= ord('z'): + return num - ord('a') + 1 + if ord('A') <= num and num <= ord('Z'): + return num - ord('A') + 27 + raise Exception(f"Unknown char: {char}") + + @staticmethod + def find_double(rucksack: str) -> int: + """ + Finds the priority of the one item in both compartments. + It is assumed that there is only one such item + """ + half = len(rucksack) // 2 + first = rucksack[:half] + second = rucksack[half:] + for item in first: + if item in second: + return Rucksack.priority(item) + raise Exception("No double item") + + @staticmethod + def find_common(group: tuple[str, ...]) -> int: + """ + Finds the one item in all three rucksacks given. + It is assumed that there is only one such item and group has exactly three rucksacks + """ + for item in group[0]: + if item in group[1] and item in group[2]: + return Rucksack.priority(item) + raise Exception("No common item found") diff --git a/advent/days/day03/test_solution.py b/advent/days/day03/test_solution.py new file mode 100644 index 0000000..1b0e5c3 --- /dev/null +++ b/advent/days/day03/test_solution.py @@ -0,0 +1,17 @@ +from advent.common import utils + +from .solution import day_num, part1, part2 + + +def test_part1(): + data = utils.read_data(day_num, 'test01.txt') + expected = 157 + result = part1(data) + assert result == expected + + +def test_part2(): + data = utils.read_data(day_num, 'test01.txt') + expected = 70 + result = part2(data) + assert result == expected