From 2376bcb016300778e6d8dd442f83840f48292ecb Mon Sep 17 00:00:00 2001 From: Jasper Bok Date: Sat, 3 Dec 2022 12:28:59 +0100 Subject: [PATCH] Add solution for day 3 --- day3/input.txt | 300 +++++++++++++++++++++++++++++++++++++++++++++ day3/part1.py | 87 +++++++++++++ day3/part2.py | 75 ++++++++++++ day3/testinput.txt | 6 + 4 files changed, 468 insertions(+) create mode 100644 day3/input.txt create mode 100644 day3/part1.py create mode 100644 day3/part2.py create mode 100644 day3/testinput.txt diff --git a/day3/input.txt b/day3/input.txt new file mode 100644 index 0000000..5f389f4 --- /dev/null +++ b/day3/input.txt @@ -0,0 +1,300 @@ +gfWpjRRQffQGCHHJsGqjsj +SclzJZZvmmnPbJtVSqqNBqVCBdSCsd +tlbvZJDZtmtPcJmlPnhMFQWWpMRFTfLDRRTWRp +HjMPgSWjVrjgbHRRSSMRgjRdpdbGdlcdCvQfcCdlwQJfdf +LNDnhtNtLNFFZDtFnhzvdldDflvvDCdlJfldpJ +ZFLFZZmFtFtTNTSPRrVPWWMpRP +qLBSBLRwmgzqCbzCffDlrfCV +TFFFHNWFMFFMpHpGHMTHGNhrldWZCsdZsslZlZfrflDVss +PTMcPGntTThHhTGctnMvSwjjvmmqLBmnjqqgCR +nClJtMwwntqVVPJcgZqq +mjpsDcrcSSFFPZqFBWWgVP +vQcjsvhrvvrmhbmNHMNnlHbNMtCtNM +bgvvhnTQtjrrrhsDDf +pLSMltLzLLSjFrSSjrSJHD +zNWRLBdZPllPQtCvttgCqb +DRlDrrFTNDNlgzsGTBfcnqhhcnJfcrCSqc +MMmmdWtdLmvtldHjMmQfPBqSJWnfCCCqcWSSPJ +vjHMjLmjpLtHptQLmHvwTRgNVVpTzZFZgZRlsVTN +rzpMpDCGFCFFjRFsRPFRNFPv +fWclbHCHtSmfvjnmfsvZ +wTcTlSwwtQtWclBQBLGMLMCLVzVLwJGqLd +MQSjLNjPPLLSBPjfQhSPHjDVCjDtVVpDHwbwVpbD +RcmWzsRrzZrmTszWRqWlmRJscbtHwCbndCtcDVddDpdnVnbt +JTsrGGTqmwTlWmTzJzWmhhPLLGgPFgBffSSPhFFM +qMMRNZMDDNWLPqfzCgDcGncVDCgG +wwBFhwhhBgmcVzhghG +tbJbjjtJvwtdtwjpFtlbvtdTLNSMqNqMMgqNHPlZRTNggL +qmjMHsZmZSbjbZMjSLFFFFwgsgvFswpwww +hRJBhmnhhvFFwhcv +llfWDWzrzBNTRfNBrWzzTmZbGTMjPqMmZPjVbSZGSP +CRRPLwwcclcGVppQ +SHFjDjjHDTfSDNTTHfSHjQVGrpmllQQWltVVVZGp +HFlqzDTfqlzwbgPJLwCP +WRCNLphpLppSCWVHNfLRzVnQMnBnMddPMQDFQgrhPQFM +jTjJqvqjvPVJFJFBJF +qTsZbvGqqZlstsmZVljtwqwSHHNWczHSSRcWNSRHzzNfbW +glgzDzHjSrVHcVgbrjmNsscNGmNWssGNNtst +hHPQLHJpwdLpdHfQQtnZmNMwnZGZWwsFZM +QpdhPJRTJfPphJfhCBlVqVvgvVDBbvVqDbHD +VtHzjZpjVtHrprgGmjHsGHNdSJFQRcLJqCdQcSqJNpcq +bBWfTPwhbfDlMnhffRwQJQNdqJcLFQLSdR +bhBhvfMWTnlDnTBfPSmvmjsjmmGtzHtsHm +pcRPRPWrSDcJGZSStmwZZS +VnLfCfTlfVzfnMMBCqVNZJdtjNtJjhJdGNNbwT +BLvqCCMVsnRQsPQgDcZH +cQbqqQhDGhlQfQlhQrqGsTNgLgCpRgLTPPPLNbpg +wtHVddVFwSHznZwwznCpRBdjppNBNTTdCjRR +ZtWFwWtSmvVnwZDrCMGfQlDDJQmD +PzPZGCZzrZrlhdjdCqfCsqQdRD +cbvZLVVFvbbNSNFHSDnsDQdnfqNQDRngsR +FJHSLSFSScJJbWHFmFVFSZmrrzBmhtBwmzBMPMPzPh +nlpFcLBgcVcLbssGVBGGrlpGPhJJJJJqPBZPDNMQMJJhJQZZ +SSTjHzfHwtZSPVQVQMRQ +TzVHwWfTtzwdVzsbFnGgsbdcGrLc +FppVBRVZDdLmrDGmmfrQ +NtNMPNshJCzznLGJSrqRrRrr +tRssthhPlCWhPzsWtzhzCbVVjwTpVwdZZTpwjbdBbwBc +TTWblHWScvPCCHTWFzSrqqsNNSmdmqrrpz +RLRwjjnjZNprzmmZcq +QQgtQnccQDGjgLDRRcLthQhFBvCbMtMHTWlBFllBbFCMTW +WnBVNvDnVsNvZWdrWDLVDMbsHpTjpHCSSClsbSCCMH +GPFtmztzgPhRFtJTdbTwjppSCjpgSl +hJcfPtQhdtWNVZqNnqNQ +GLcqZPPsnqQcFsmBBrqRvrddNqrC +MtHthJwLllwvjRvvtrvBRS +VHMfDLbpfznszZQG +WBSdPlQPRfBtGQPfBGPBJgzgjwsJzsszJwCrdwCT +ZpppVpMVpnVHMVVbZRJrCgwRzTJrwNJw +MvhmnpLqLmhVmBlftRQBFSlR +hhQlSJqhtCSnqZJnqShSlNDwRzpvdwRlMBMMdcjRjMpMRc +frrGmLmWbfFrsmFHmBzBvBcwdJbvpjzbMM +mmgFrVGLWJLFGsgfhSVtVPqntqnnSStN +SFJTJTSqswwFQbwf +cDtcWPclrtPwVsfssQmN +HDtwWCgWdggdzSGJMSzGMq +JpqJtWRJMhCMJpMQCWtFrjgHdgdlgllwNjlQjldH +fBzPZcZvnBmDnZvZBZDmPvglVVVdgHHSwrNRgVgwNPRH +GbZnZccfvcsZmccsmnnZTRbCCMWFTWJqFCCMJFRT +vrrFqrFTBTmLmNrLMqMTHddJbHpWnhdWdWbHhJGM +wBzfwzcQSzWSSshpdWGp +gwjPPPDQtzQlzQDPqTgLBRmRqZBvqFNR +bWVptFFsbPcZsGLhsZGmLB +qnWrnrHdMCDCNqfWmvRRZSSRLdRGZGRG +nNqqNDfMrMWHDQNHzWfHNDnwzblpzFlbwtFbVVlwVcPJpP +BHJhlHdJQggvddglJBBhglhQzZHPZpFFPDMzFDDRDFZZDFZD +rSTfqnCffMfCVfCLNqbzbjWNDbbWDPFpPFbP +nfnnrSfCTVSwrqSLCGfTGlgQhlvsGMJQJBhhssJhGc +tBjjDjjqfDjLfJlrLgglvmrlmrcc +TwNNTVhwwpgvGSNNSssS +TbwhnvvChhbVRTPPRJBJQQfJttMQQJCQfW +mWSvSQVgmWQsQvspQJlrlLnJLLpCClhhlp +bFHRjZdNjjBZzFzhtnCllCcJLrCBll +HFFNHbdZZLZjfPFjHVQmWDDVsvsmTqVqDf +JJPllQQClqgBCgdHwHbpjVTwHd +tmGZtjGjHZpVbfMT +ShGjNGWmDSNcNRtGmshDRzzCvzQJJRBLrvlrBPJv +cTpqsTWqVVpsNLfvCDFlMFDVFL +JnndJPddQgzHlvMJFDhLCG +BjtntgdRnQgzjdBRQBlpNWrTTlNTSwNpWS +qHmqLVLjmVqsDBLtmjmbtPwCTwwPzGWRgGwGwMwW +ZhcCNCSprRTWTwSnWW +hflhZvvQhppZfcNpvrhpQHjVjLmbVmmVHVCFDvqVFb +nnNrwDnZrspwDNnZsNSDsNbCmpjvMTPQjLMmPmmQPGBTQP +FdVtRdRfctBQPmTtTLQB +qhzWVWJqVHwbhlLSsS +htWmhDhFztnztDhtBmBtghPRSrpfjVwPdfPwpwnRSVrr +cbCHvgJGcTqbqcbqqqcqsMsRVrSCwffdRPPpVpwCRSwfjj +GlgGQqTqbgQzttmBNNFz +NWQNQgdTgjQNddTZfrCQWRDnnnbqnLqnRcjJlqqvDj +FtSSmSmJhpllcclDvpln +JBVVSsSFBVBttShFGSPQfCGNdrMfZZTQTZNNdC +HgHthMhphcbfbMMfHhsGGDCRRVlcVSScsCRz +nWvPFqLqPNdjnNLnjdJnPdWjGlssDPSsllVCRzlTCTGlSDzS +RvddJRJQHwQwpZZb +gdZwgpjZZQtHTdrWrwdpWRnlhNBRlLbFthNhflhBnL +CVzDCPGMVqVmGsGGbJCmCDvMcRcqnBFFFnRBBNRBBNqhnFfF +DsmSGsGPzvMGJvdbgTSTbjbSSdgH +jBGmbNBQGdBNNDJNQRLLVDsHtDRzHHZZcH +wCWPFWPCrPhPrplvprhwpCHHtszttqZslRVHLtzVlJZL +vprMMvMnJCwnnPShNGSTfGSfNmmgdNff +bPtLbvVWWztbLSVVnbszpzQsrcDDBdpRcDrs +llZmgCZqgCFgmdRdJcscBdJsmQ +FZlgfqCFfgZHlqCMCglwCFGWntLLSMRSPGPVttWRtVGL +vtnDsDtrnrSvrMVmbrrJgPCmBm +FpQHzFclLVzWHhwHLQLlHLzPmMBQCJTdTmCTmBTJTTmgQg +pllcVWqlffZqZtZD +TSSZWpsQmZWcTZSvsTTTppNPzrBPrNBrzQNVFrBBNPqP +CgjmCbtGgftMmLtLmffzBzJJJNVVMNzNBqJrFN +gjgjLgtLwgbGjHdhhGdvmlnllnpWnplZvcvwTl +htLrRFRtbbhlGSLRtbJBJsjBmgMMgJgtmBzz +pZQWddQQfpZZffcDQZwddQwDMqDDsPgGJJzzjqzgJMBJgmms +QdcQTdwpGNwfrCRlRVlNLSbb +wrdvpVBVpMGPPjWjGZJJZT +tChCSlNfCCHtvHHWPHPZ +RbRRNvmcqcblfMwwdVBQQqqdpL +qcctqRcqmcHWzHBdDMZhfwthBnwt +JFsSNMSgNSNJJMGJBBdjhFDfhwhBrwnZ +TbgbsSgJMTJllblLCSPlsTCVQmRVVWpQzzqpqzVzHLQzcc +CVcWbjjSSCSSnpjWpCpprhHZlHtHGzHrZrHGclrl +gqZqdddLgmgNqvTGGHvvmrrGHT +FFDgZfZNLMgNfdDqDRnsnjBpbSbnMBBWpQpB +qwpQFwRnqFFfSBSfFt +LJJLGLWWtZlbgWHgGshhSdSVzmhHmfVzzC +lrbrbrNNJgDMLLbblGctvvvDqPcqctTTTcqP +vnblvbfHvlcHMlHlZbSPLTPLwCMBRRPRRFFR +tszzBqtzDsWVPRSmzLVmVL +tsNsDDNgGsqBrgBpgdHQbfhflcHdpZvdbh +cCpLtpGGLsgsppcpmGGHMtjfHRVhvvVVFRfhjV +NWnnnNNndQnQZdCdzzRVMHzvhhHWWWjj +CPJJrnSZpGDJLGTL +cnJzpcnmnQVFbzTlvTHBlb +tWCDPjfsDGfZhddhjjdTvFTgFgvbnFHvdHqT +hjfCjwDDGjPthsfhsnGNrJcQcRmJMLVJrJNMLw +CPPRrSlRccPcwTHwfdwTHdfl +mLQLLjhQhhQLZvpzssHDhdTswzzTJD +gmjbBvQLWmgbQZBCSRnnnSMVCBHnBS +sWrBJbsVqschzhQzHh +gtFmztnSlSfdlmnZSdSwcwGRTjcTcwwTcHccRg +FzFDzMZCdDZtCSrJVBMqWVrqNBqN +TvWlhhfhZJVgtSSl +ddBdGGdFmmBbdzqqPDDGGmdDZSgttHtZppSgzZHSgMhtMgtz +PGqdrbbbdPnrcjjhTRWLLc +trrmJWcrVwVbcPScdcBdGPHH +JTQnfjlJTpQFfMLlNJHHGDPdGsSdDjHGDPPH +ffFfnCTTCfTlplTMvNVzqWvwVzrrhwmWhJbW +hVtDtgcghzJpmmhlwp +srsnrqqsPqsBPvnqRBRMPbnwlplpmCStJwmzJPtJzJfwSw +bbrqjBbvGsjGGBWqMVFFVDNVNjZjgtgFgZ +mnmhBDHhwWCHsTgRsH +dcSlFvccMFMMFFggNsTzzvvzWnVW +llQdllZScFplJPpdcZSqBqjhmtnrwrDGnQGhrq +ZffVNgfTdmPVltsnnGwgQDnB +rMCFLMHpzCMFzHpzbrcHFLzBwsDsDDnlDBJrDDBBSJSnBn +MLMjMzqpCzvwqTmwZdvq +DDNlWPRqgPRPsRFjJQZbchJZbgQJ +zzrLLznpLbHnjcBHvVvHvJcZ +ndmrTzbMMTfzrTfnTLrzdpmsPPPqlqGDNNsPCRDRqRsD +zzdqTNfTfdfhgQhgqMFSjRDtDRWHqtWlwtqDRS +ssBCrcmpVGZvVRDdSDRwtmWdDb +rvGPCZLCVCPVBZFdnfThgNgLJNhf +bslcrssQwDPbQrrcsbsnQrjMLthPMMRhLRhLRgzmgPhRgM +DffvDfHGfNFdpfTdMtghLBThzVmBhBtM +SNvJNJdflDDbcDWJ +HFlHNpWsTlGWbFsGFTGHFLLNzPPhLVPMzVzMNPhhzP +jSvZtmrqqpcrCpPVzw +dddQvqDgDmjdSQQdqZjStpffWGgBRWTGfGsRlWBlHF +THnTbNrdBnLTHHnTnBrWRTndsccZsLZcDqmLDPcDlQDsmmsZ +ptwzzhpvGSVdqQlmszqmqPqc +wGVjSddCBggCHFWN +LFFbdbhhhvwvfTNdRhhRRvMbHDGjcfcGfDjtDHHcHqGjDqqj +WlQnVpWSSWWsPsgDqDzHDLHjJcttGP +rrWsZrgVnWrWSlmSlmSBFFbvTThhBFvvZLBhRw +BgBdcjThvjFcTggrqvVfzlnnPlrqLt +JpwJGPsQwpwSssHpPLlzlnNlzLLNNLVtsN +JPMmWGmWPmHbHpJbWGJmDmwbBTRZMBBdZCRTRjFjhCZCCBTT +BjbcLFRfBRhnbGjCVVvPllpcPtcDmdlPpvPP +WrMQqCNgsqWWsTNCMZMWWsWPvJDJDddvlpDtZDpDDDDwvP +qNMzzSzSQsGLbFCSCnVR +tTRpHJQpQBZcddhhMhvhJN +zswljflgMFbwPqmNmSdvShLNfLhm +qFbsMCVgsqMwRWHCWDDBDWpt +VSTCCWsJvGpHHCNC +GrqzZrrZjDljcDDlfjMqgRPfPvQPpBHNvHvBpvNQ +rljncDcznjMqhlhZDnltrzhTsGWtbVLFTTWGsbdWJdFTmL +mJPDSJJPZPJNrprSNrDmpZGrhFFhBqjGbGGVbFjhhfqBjBRV +cgnTQHdMQdTHdhqfggBhVqVfVS +nQdLLddssSJrmsNvZrPz +jfjffQzZQQMzZZfZZQFgjDWBCRlCBdTTBGGGRpBCgdhdBG +LrstWtNsbHLsprRBdlGpCwlh +HLnntbnscqLvvPNNfMWSSmDMDPjzjDzS +vhcGwWVvglltcfBn +BBSLrzSJLzJNJrLfPfPRsmDRmflD +jMjFZJNMqzrzZzFNFjNQqJzbCpBBvWdpvTCWhpVwdvHVCGbG +HlrnFmRmtRBQPVBTQHHQ +psSLJsLpTTdPdLTv +fCGgTgfSSCtRtFFzql +pfTpStppcDlWfbpDdzQRsQGJhfffQgJHzN +ZFZFZmBFwVwBVmLmLsRLRhHNzRLRNNzJ +FnnjwVPmnqqqjBjrTdblldCTpcPJtbTD +bdZHdWlrjslMMwGG +rDDTRBTqSqmJLBJRBTSJpmMsMMjhwvfMhjjfVGsLshhC +BqQFRPFRQBJgzrcZNHFdZt +wrDdLlDdPWZPTTrwlZpSsPsHVHsSCHnbzMHM +JtNFttNCjFvpppnMpJgSVS +NFFqFcCQCvfrZmGdZdmqrW +GMNNfJnNddJFJWsv +HSDwCmmghLmwmmHDpsvdFpMWpppptSbp +zCzBCgzhwmhzLrPnVrMqZBNfGf +DrHGtbltbCjjjffPrgsmzmcqsgDczdsmgJ +VZLwQLZLLVwLBQZnLVphhLQQqsTNmzJdcNTzzmJNqlNBsszz +wZLhVMplpQVRRlpVGPfjCjMGCrbHGWWb +BHpFrHHbBNTWWTWNhCPwPLNPjCdjLV +zJRRzJvZlcZsSMJdzSDjDtfDCtDtjDjjjj +dcJcszQJJGRJzRllMpGHpFTWmrTmBTbWWB +qnWWqhDhnjmjCMBlNRrfVfRNCB +vvBLBtGHJTHBddrNVJrVSVdr +BZLTHbgvHvTFBgTFFvhmWmmZDPmmZDsnqncs +WBvmjDbSzTMmHHdpNHNF +ttlflZRfGtfWVRltGtflCdHnJrNJHNHnJddNMNCnpF +VVwssWQQfRGZcszBQzDbjSBvSBDP +lSlQqQVqWWVWfqQWVJSTscdmPPwwTTmjjfpjPp +FCbzHbvHvtgrtFCvbvbbwdTwmsrwnTTpmdswmwcc +DtZbHdghztlLMQlWWhVQ +pqzzFSmdFqbQvlpdDGGrGBWPPBVNQnVttZ +cgcjwfBMhHCjjLMCrtcnPcsnsPGVnrVs +JgCChjjjBHhRRLLjjhplzvzpSFJvzzlDbSqm +mZzVQZMhmrffwfQhWhzmrmpBtRcdbnbcdcMpBbDbncdD +jsLTSlTWRBSDpnDn +GLTsGWGFsfmJGZVJZm +BGWshBGnsFWSLWBLlSSLWRJHnrVPrPcNHCNHctnPPJ +QmvQCqqMTZqvgmvTjpZCMgMtrVctPptHtrNVrptbJJbrRP +CzjCZfCwDzShDWdF +HmQlQHmJnpmptmzt +MTqMjMPvTvVvhpdztZnSwzwZqS +CcbLLPTMtCCsjHNHQFLRRFlRNN +GDFwLLLLSrbdPlFBMFsslFHmZH +TnJCgthHpVTfZMQZQmzWnZ +hjvtjtghtqJvVjhTgNhJTvdvdDDRbbccrwPdcGwrHS +MQQMBPzMGQBPBbDQPMhpnRwsGnRhNrFFpRnF +vmgHcmCTTlvvvZvTmqcTfmCRdddFnwdRdnVwFpVfpRnwNw +gvmqJTcHclCQJNzjMLWbLj +DbqqDDbQFqfNtZSLSq +RrdjPdmrpWBdmWRdccfLtNttSDMZBfftLMLf +dCcgmgRrWcgcppjCVVVVFHFnDnbJnb +fZMFfrtVdZSDVwTgjRMLhwTCLj +cNzPBNpclllzHbmTNRhqCRTgjC +nhhWJzhGPlQcGvsvfJtSfZfrtt +PSzrBWQBBGzBlnSnWtDrqHfNfwVwHcLNjHjwcDNmFH +hbRhtRCRpRvsRgVVVcNHNNNCwLwc +ZtRTRvttWWzBPlGZ +tcLnctNsJrWWNDTN +pwPPSjHSHHfzvmSvvvFVVGqGVqGmFqrDWgDr +pPSvfPQMzCQCSbhllLnQDhbtQZ +DmLffDhpVhjjVwvbwNVFbbNSNH +JRPBgMPRHBrMHMHqrBMqWJBSQQNbCvndNrdvCNCFwFrQnv +WcqJcPGMGtWRRBtgZjjspGHTLHGHTppm +ptJtWJpqRwDZZDVWpbDWqlvvflfMjlfCMjdCCdtslv +rLwTBGBzBBQTzmwCCjvdvlLllddsMl +NBwTmrGNgrTrcgPpWgWPDSVVPW +CdglMnrlSSqDPpcsZb +ccwmVJtvVvVtNhBpBFPDVpqbbD +TRGQjJjGTmtrTCgHWLfrcn +JNNhLwWwWQHNPDmmjHpc +zMqZCvVCSMVqMSTVvZVGsBnlslpmsmzlPmsHPsPB +qTVqrgdCCbhfHJQFtg +wNwCBBCZsfQWfmLCGSmmFRGSSF +zjnPHPVqMhhZLTcbpbSncp +lVlhlgzlPZlwtgBddJdfvf +JWRWRRLWJLnjtjnLzGzznflBvfPvPMqMDqdbzblCzC +TTScTVbHmTsVFrmcsgcHFlPMMvlvrDPdlrDDqdldvl +bVpcpchgsFZHbhSmSTsHFFjwtZjnjLttntNjLjNLWtjw +rffjPJzWzrgPpGWHVNqTtmqFTVRH +cswhvlLBvSLsCtbFccmqVFNTbb +wwZSCZSnCLsSDGgDmpGnfmmr +rTfJTNtjfNljlrWSlzRtNlTqsddwGnsnHHwwhssTsnqw +VpbpZZbvPLbZbbBhwqMHhsGMnJdVwV +mgQZJDLBJbbbcbgZClCSfWlrCjRjlDCR +fSpwcVfzsztcSSWNNMbnMRqTvtTv +mJFmGDDDhGhBJHCQddllqTvCllqTRRWNnMbT +FdFDGdDDDhhHdZDjhDmpwSPVZszpwZsVgsPRZs diff --git a/day3/part1.py b/day3/part1.py new file mode 100644 index 0000000..f26b029 --- /dev/null +++ b/day3/part1.py @@ -0,0 +1,87 @@ +""" +--- Day 3: Rucksack Reorganization --- + +One Elf has the important job of loading all of the rucksacks with +supplies for the jungle journey. Unfortunately, that Elf didn't quite +follow the packing instructions, and so a few items now need to be +rearranged. + +Each rucksack has two large compartments. All items of a given type are +meant to go into exactly one of the two compartments. The Elf that did +the packing failed to follow this rule for exactly one item type per +rucksack. + +The Elves have made a list of all of the items currently in each +rucksack (your puzzle input), but they need your help finding the +errors. Every item type is identified by a single lowercase or +uppercase letter (that is, a and A refer to different types of items). + +The list of items for each rucksack is given as characters all on a +single line. A given rucksack always has the same number of items in +each of its two compartments, so the first half of the characters +represent items in the first compartment, while the second half of the +characters represent items in the second compartment. + +For example, suppose you have the following list of contents from six +rucksacks: + +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw + +- The first rucksack contains the items vJrwpWtwJgWrhcsFMMfFFhFp, which + means its first compartment contains the items vJrwpWtwJgWr, while + the second compartment contains the items hcsFMMfFFhFp. The only item + type that appears in both compartments is lowercase p. +- The second rucksack's compartments contain jqHRNqRjqzjGDLGL and + rsFMfFZSrLrFZsSL. The only item type that appears in both compartments + is uppercase L. +- The third rucksack's compartments contain PmmdzqPrV and vPwwTWBwg; + the only common item type is uppercase P. +- The fourth rucksack's compartments only share item type v. +- The fifth rucksack's compartments only share item type t. +- The sixth rucksack's compartments only share item type s. + +To help prioritize item rearrangement, every item type can be converted +to a priority: + +- Lowercase item types a through z have priorities 1 through 26. +- Uppercase item types A through Z have priorities 27 through 52. + +In the above example, the priority of the item type that appears in +both compartments of each rucksack is 16 (p), 38 (L), 42 (P), 22 (v), +20 (t), and 19 (s); the sum of these is 157. + +Find the item type that appears in both compartments of each rucksack. +What is the sum of the priorities of those item types? +""" +import string + + +def main(): + total_priority = 0 + priority_index = f"{string.ascii_lowercase}{string.ascii_uppercase}" + + with open("input.txt", "r", encoding="utf-8") as f: + for line in f: + line_contents = line.strip() + if not line_contents: + continue + + total_item_count = len(line_contents) + half_item_count = int(total_item_count/2) + small_compartment_contents = list(line_contents[:half_item_count]) + large_compartment_contents = list(line_contents[half_item_count:]) + + common_item = set(small_compartment_contents).intersection(set(large_compartment_contents)).pop() + common_item_priority = priority_index.index(common_item) + 1 + total_priority += common_item_priority + + print(f"Total priority is {total_priority}") + + +if __name__ == "__main__": + main() diff --git a/day3/part2.py b/day3/part2.py new file mode 100644 index 0000000..edaa2cc --- /dev/null +++ b/day3/part2.py @@ -0,0 +1,75 @@ +""" +--- Part Two --- + +As you finish identifying the misplaced items, the Elves come to you +with another issue. + +For safety, the Elves are divided into groups of three. Every Elf +carries a badge that identifies their group. For efficiency, within +each group of three Elves, the badge is the only item type carried by +all three Elves. That is, if a group's badge is item type B, then all +three Elves will have item type B somewhere in their rucksack, and at +most two of the Elves will be carrying any other item type. + +The problem is that someone forgot to put this year's updated +authenticity sticker on the badges. All of the badges need to be pulled +out of the rucksacks so the new authenticity stickers can be attached. + +Additionally, nobody wrote down which item type corresponds to each +group's badges. The only way to tell which item type is the right one +is by finding the one item type that is common between all three Elves +in each group. + +Every set of three lines in your list corresponds to a single group, +but each group can have a different badge item type. So, in the above +example, the first group's rucksacks are the first three lines: + +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg + +And the second group's rucksacks are the next three lines: + +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw + +In the first group, the only item type that appears in all three +rucksacks is lowercase r; this must be their badges. In the second +group, their badge item type must be Z. + +Priorities for these items must still be found to organize the sticker +attachment efforts: here, they are 18 (r) for the first group and 52 +(Z) for the second group. The sum of these is 70. + +Find the item type that corresponds to the badges of each three-Elf +group. What is the sum of the priorities of those item types? +""" +import string + + +def main(): + total_priority = 0 + priority_index = f"{string.ascii_lowercase}{string.ascii_uppercase}" + + with open("input.txt", "r", encoding="utf-8") as f: + group = [] + + for line in f: + line_contents = line.strip() + if not line_contents: + continue + + group.append(line_contents) + + if len(group) == 3: + common_item = set(group[0]).intersection(set(group[1])).intersection(set(group[2])).pop() + common_item_priority = priority_index.index(common_item) + 1 + total_priority += common_item_priority + group = [] + + print(f"Total group priority is {total_priority}") + + +if __name__ == "__main__": + main() diff --git a/day3/testinput.txt b/day3/testinput.txt new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/day3/testinput.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw