diff options
Diffstat (limited to 'AoC2022/03')
-rw-r--r-- | AoC2022/03/input | 300 | ||||
-rw-r--r-- | AoC2022/03/makefile | 14 | ||||
-rw-r--r-- | AoC2022/03/solver.el | 66 |
3 files changed, 380 insertions, 0 deletions
diff --git a/AoC2022/03/input b/AoC2022/03/input new file mode 100644 index 0000000..039c2c5 --- /dev/null +++ b/AoC2022/03/input @@ -0,0 +1,300 @@ +LdHVLDLDdHdtLMhcqCqGWcWg +ZZQZSZnnJrQrJQJbfzfnWGWPWMcChMMPcqMnhFcF +ZrzpWzfbpQpWbzvZWZpdtVtDNmRHNVptNDHt +gzCjffWZCtCfZZVdqVSqJdvJndSt +hMHLcmGLMLhHmsRMsSvsQSqrsrlJTTdV +NPNGRGHGHNLczNzzZFWSFFCC +VSBpcvNNbNWWSfGRwtJnRtrzzGzGGn +jZlhTlQLHFLLZbwrzQQsttDtbs +hmmPFlhLmhLMgFMFLbMBBgcNVcfNCcfSVSSNBq +jRDSzjCjjMRMrHzMRCDHMDjBnlQbbnQwLwrNLPwnTPQrlc +sZBqdZqsWgFBpgppGJqllPllwnbQwTwsswQPwN +gJgtJJBtqJqWBGzjRCHDDzRmDtVV +GRBWbbWnGNhbwSsfPfmrlslWsS +HLVCgCLpMgcLVDcDCgmlvstSlsstPtSSSlscvl +LzQDQzMMzJzFQVDJgCzJHJZRZBNbqGFhNFwBGhbhBhBm +JNsHhdPZSdZJjSHzzNwvwGgBFmBmvptJbFvm +WrDrwqqqQWVMCvMvGbGbbFFbFp +rqqLncqnlCncwQWCwWlLfSZPsZddfzzNNdhdPlZz +rwfrwHqSdRcgwdZrDcrqDDdgNzjNjPzPJNJPtbNPbGsHNGHv +hllLMTLLQMCzJssPsTvtFG +QtQnpWVVMVWnVQpRZSSwZDggrcSq +FDlqPMBdmbqMrdDqqFdFDwjHZChHHZfZWZNBsZjhfhHf +VQJVgncpTQRJfsssGhsNWC +NtpLLSpcLVRzzRRtpgVcLgglMwwlPlzdmDlFmFPDmqqwlF +PqwwSqNWPqwSWqjNBwpTPpffhJfZfstRtZJRRdJsdR +VFLFzQVgVnDVjhdJHsvhZjfg +VVFVDDnmnzLFCzVmznFzrFlrjSCPNMBCSGSGwwwGBjPNWPwC +zzbCGrfgbzfzCtvqdjSrvSjnvS +cNVTLnJZRNNmQmhJNptvBlBtVjlljqqldtlB +ZhpcJHLQhRcLZLmNQJzfFwDzzgHPFngDPPnP +ttntdMMBZzbZZtjPfwjwTwBvvVmh +llSllRRNsGCrCDTPfgVgTfgvsjPH +CFclcCWGrJNDSnnWMbQTnWtLQd +bccfdSfwFsswcbbdJFGQVGnCJLnBLnDnQLDj +ThvHZNhZmqNWMNqvDVjcjjBQVhQBBVLB +vWMZZNRmNMWqtWqmqHclfFgdlwRwrzzSfwbFRd +WNzRWWZNmtNZnssNRPtCJFQJCffVJVffCvlF +cBqBLgHHBcgqBbCJjrvrVQJfsHlr +DhDShwchBSbdwBsqgGcbgTTRmzdNWmMRMmTdNpTMmW +FHWZDbbPZDFHgGGPdPbJNLpJSlNjcjSphcJjFN +ZCCrBBRwwCjcNwcljppN +CmTTsrMfBCRsTMnnCRTmVZbgdbdGfWHPDVvdbbPV +cgSNBScMgjBBPtBCNLVvVVvhhJJhvsMhVfWq +TFlDrHPZHTTFmwTQHZDZTrqvvzqlJppVJvpffhqqVfJp +DbPwrTZDQDRQQwQZrDrbbQwRRnNSBtCjtcNGjSgSLjLccC +pdcVCpdZnZgcZgdcDWBDNcNwvBWJwc +RRmHspRmmQfLwwJJbFBFFJNR +rGlpfrQrqGhGqdGP +THhNsHhdFjcDthDcjDhLBqWcLLQQJvvBbvBJbl +GfrCSZGCzfVMrVCCzGVfSMQBBFlJlJBFFZqvWBqbbQWl +rSrFwCwzMMzRfGrGMwPfGCVdgHDttthNPssHjmNNdDjgdD +shmhggDsZCZWBDmsQTcTqrLPTbNbwQQrrN +lzpFVfdjfFFGnVVHpjJGJVlprNMPNtPctTNwLtcTbwctwTnN +jVFfzVlFSpzpFCshWmgSRgmBRb +zZGFNPmdPdszdWddGWZlpLMLpbQbLDpblzQbtv +wTwgwSSCHhhCSghJbpcpDglbbQbMVMpV +BHnBRrJCHmRNfGDmfm +CffgvfCRGngRrvGvgdnRVpPQQPSqbVZZDPDVPzFSSQ +cMlWJTMlcTLTLtHHJlpqDLwqSzSSDDqDZDDS +tmHTtlMmWpmsMJsCRdCNsrRGfrnffN +lNrzNHNwzZlHmwNBpMqqnqGDZSpMTGnb +ddjgFjjsRvGvQhQvvFjqbVTFpbVpFDJSbJVpTS +cjsQhsjvRvGcgNtzczmtmwCCcr +NJMJvBmBJPtMtRDnDDwDMFFWDWHG +hZsrzshpSdjZZqSSfgpDwnwFnGCCLHDbjnGCWG +zfgSpScsrdpmllttGvJGcm +GLsnLVLZGZmcGVpgZLmTjTsDDTlDTHPPHWlHwD +dNJhCCdtNJSvdDzwPlvTlQ +BCbBrPPfRMfMJSffrMCMChrSqVcmLLFpqLFFcggLVnqgmbgc +hMdjMndZLRnRnjclszLclQlzGwcr +FPCCSCSpCwStJVGzsPQGslGzPbsQ +TSSJTtfTFTwtmTFFVFDTWRvdgndjjRhnjnvHjdfR +ZwgsnsWsWvWQHqJhGhJVCJHhCJ +cdjlMWRRMhJLCpLL +jjSRmRmNRNWBmdmcWjlDWFPswsPtnZQsnBsnZvvTTnvT +vvbjLTPbQzrQQjpLzLbflfjfRDDsDlRfgDnnVD +ZGCtHHFGzFHhMlCnDqwlgggsqf +FJHMhHZGmNHtJhMhBJZZtZdrbSbSzbmWLLQrQTbPdbrS +ZClGVCvLZzCLBVbdGGzVVBvVrqQMDWMHrgmgQLWrWmTgqqHH +tNpNspcQPfHmqfgHmHHg +nNttnwPRjFtPcccsFptPlllQGlQZbvGzVVVFzhCd +lflmVWpDVsMmmVPlHVbbGSSbGnSHJcncnLZn +NvTFzNwzTQvhFGSZnvgrbgJCgr +jtRwTQFzjBNGGQQBdDsDqqlsVqRflMlPsP +rCSJPCrBwwMdBJRCrwMTGWTWNbcjGZNGGZTb +qzgqfgFghsHzfgHgmmfWGNGGWcNNFClbWlcCNW +DqsnzsHLhddBDwCRJR +sZpHjZrVQmcrbhbthzhFHzhH +QDPMDMndqqQGqQfCDDbhFtzzLtbWzlBLLPBW +TDMDqfGnJSnfnfvgjsjNgJvsjVQv +bDZQbZHdQQggZfttJjGnplSnldsG +FTrFCvWBWzTNSPNvRBGJsGjpsJjstmCLtjCt +rhBvzRVRBBSVHDHcHMHq +FSbSNZbZbzGzGGbNzGgcZPwlDPvlNmLLLwLLlLvvvl +pqnqpVCrpshqmChsQnnRpRCldDHvDHLjDlvPwddlwPtwDV +rRTCnnpCWCChTrWsrBTfbcFFmFSSmfBBGg +QdhdWDsHhHWzPrLPSCPGvs +gpZZmNmtjZwpBZBZgSnvFcGPrrvmncnvmC +RVVRjZJfJVfVBZVtBNBVppZVDqMHhqTbMGlWHQhhWldRMHWd +BPWQrRRNNMhrHhLqqGgjDJjH +TzVmmpmtCNwscTzszcNzDCfCHJqDfGjDJJgfGCDq +wdwmspTsVdlTcpbmVMPWBbBWRPNnFnBWMr +VZTnVnsgrjjsqPzPwWgWPghz +mcFdQGPMBdMSBdWbhRzzWqwLwcWt +GQPBvpfvNvFPBvTnfjnZDHDDjsrr +CZssCNFJBmBNFmFBNwBFCJFTtthGrrSThtSgSRtSfRTGtRrg +LDpDbnjjDGpggGrvGg +PLMWnWQgbQWnWbnbjqDbszHwwzwmNsFZMBmwJFZF +hQSjFLhFLLMSSFgdWTMdGgNbNbWv +JmPlltJBJqmzpbrrwTwrvvGqww +HBzztRBRplzlmHmRmmsplRJZcfFcLFfHSLjSZTcfVVcLVH +nBSQMnVQqJBGnfVfDgCrjbVbtC +FNcPPHdTdhmBdHBvwlZjbClClfcZgjclgj +vFdHWhTLHvnBRRqBsWSR +TRsNNTTHRRZRRsRzJQddSpJLcQdpjs +DMVPVVGmMGWMGtMgGtDlmMWwLLLpJfSfpjzpdQddLSmSSJdc +tVMgGMDwMgMWDBWMttjRBZNnvNCNZrZZRbZNvZ +wlJPVMJPPBShSlhgfTvgNNzzgNMCTg +FLtRnDDSrvdNdrng +FcSmpFZFFmmjWqPWJbmhGqqm +hlBqqTlSfvNhpbfb +fRVsVDDRtnRVfbDNCCNCNQGwNZ +nrrRPPnHzntRrPsRVrtJVBMjlzWfFWdMjjWMqdBBlT +zDNcnRsNNfRFFNNzRzLbRWgMZMMZcdhcBdMrBpZmmZ +PVHHVlPDGPPtjDmmdrrGBBMpWGWd +VVqTTlQtDCqFNzsnbLbCSJ +ndSGSZZGwSZTBdwnwdwmWCzPQCQLffZzRgMZRggMzf +mvqVmqrmcDqllNNtbcNcMCQMRCMCCMQfHLgvRgMg +FhNNcrrVljFcqmTJhwnsmGdJsT +wlmLmZLwzvVmVWVmQWzZSFJFDSqFHSSFJHhDqZ +RsgpMNcMdRgjDcRFqCSrHSHBCFJr +jdncssDNPsbmmwvvlPLw +wQGHMrHGgwgVTQrrMGgGQrTtWzzPJhsfhZztWssQWbZCWh +FjvBFSqqDbljFvSbnvFltszfWPPfWzJZBCsPtJft +qLlDbpjFRbpdGTgLGLGTTV +hrVJsBrpwbsMZtTLlwnqtqdc +QDDmHWmffHCQWHjRQjCWczTTjtlzdldqVtTnTqLt +HmfGfRNWfNWmQCRsgbsMFMhMGvpBVs +CRzzVCZhvGQqNmcWrgpgwQFSmF +BJsttjDtjbdLMHHsBTqBbBHMrprDSrFnFnSgrnnrpDSmWWnw +TbMBMPPdLTbHTjHMtPzZGvzlvqCPGNlNVRVP +QcmcrCVcdTCGRRLT +zzgWFWVBTSWLPdMP +JbhnBVzzfVhgztVDvqcqHwncZHNqnsnccQ +JJVBFfJjNNNsJTwVfZJNffFRpRzRzRptRWtCtSSHWsWzCD +rmrnhgclhQGcGnhrPjqgGMHbWRHRbRCWbzRbMSSpHWCD +mhhjQGGjQgggqnmQnmghdQdJFZBNvZBBLNTvvTNNTLfZ +DrBgwMCMRvMrvDgPCzdpdNtzqqlHNNtp +jWSSZGgfGjcLfdNjFzqqFFzzFF +nGZhTmZLLZhGPVVTgQgMRrrb +ppqZvppdJmSLHdSfZRrrtbscgRVVgwVrHt +hFFFzQPhNWzNhnhGVggrcbwVgBnvbwgR +CNQWFMzWWhCflpjvZJMJdj +pfpfmQMWmcBVfMBBmpfVQMbDGGNPDTcSNTTsSNPCCNhC +ZZrZwvvzZrvZlZlwhwswhNSsgbDssC +ttvdtzRzFDqRJWLVLWJJpQ +CZZPTQPTPTJhTQTrHCBbvtLbbbRWtjbDvb +cGfsVSVcLdSgSwBWRNNGwRNRbD +spSffnccsgcdnnJJQlZZqJLhpMJh +TwGGdWwdddtTsbzPzbbnTLnPLP +gqNSMvtvcSDLLfnMnnPzFM +NvDNDqtvRcjQVGZZGZZhwpQB +jtgFmnqjqttQpsphzNllblzlNH +GRMRDMGCVCHzSCbSbNNl +LMTJRTGRLBJBwLRRHmBFQPvqmPBvtgtc +jDjjwRDpPqqsMsDLJbJzVB +lMNMNddvMltNfFVWbVVWJrrVLfgL +NQQtmtFGFlGZPZcMmmcjjn +CgCNjvSCgSQQzVZNWVnTBPTcsTVBnpPs +bFbbLfbfdRBFhLwqFmblBJfRHtWcttcttlDpspcPWDcDptPn +mdbFhfJrmJwfbmmFFFvBZCNCzMGrNjMQjCCZ +TPDNHHSTNNmRfTrRMZSqwwttdbBvBMth +VVnnFGgnQcBvMqvnhNBN +GLzjjzGscssJGJCHljmfmTWPTCDN +BZZNcMQjBNjNtDJgstjgtwqGRQfhGhSvPfThfqvPhfhf +CCndrnmnnWbrnHrFbWbpbbVmGGPqLfTGhvGSPhqRLRdfSGsf +bFssVbbblFHzrmFlMNMtcNgDtJDzZgtw +smjMtSqQQSjtSfmDVVFHFhnHBHmbNPPH +TgvCCJcZdwdgNvbHvPbbvBNq +JLqRWTgLqJLCJcclgCJdWjfsSSpsfRrsQjDtspptQQ +hNwztzgzJnnNTVFwNTNhwVhZlrpLMLZZlpZlQndLPLpQLZ +vRDvqSSqjbqSWDvjbvBdLWspPLddZPQQLMllLp +SfGfRmSGCSfBfjTcNFgzwMFJzwgm +lhVBhZjjPHbThwFGrNrdvNNwFV +DRrDLfMLSgpCdCJcfmcJCm +LQtnprtqSRtZjHzTthlb +GrGsqfbtsWGWWntnrrwWWWGSSDSMDcSSSwTDzPzJSJzPcT +lmQhhVCgmffCNgmNNmCmBNRRPvDzDMhJvSSDJzzcTzvvPvMT +VBllNBpfQgQmpLBpRBtnqWLFFnZZWWGrZrjq +NRJdngMVwfgnwJtvlblcWLlLDHfccDbW +PFJzBmhmjPFpJrFqLcQHLlHGDlHDQbGz +ShJZJmPFpwdMvCCZRd +WQDqSVWqpBCsPqPWWNscfrHfhrhrHhGFGs +MmLRmLTjmTzTzlhGHfprhvfFhHfT +mLZLRdgMRjtdddmdgwmtMwQSCPbnDSSCqBDwpWPQqn +rNHwMMGDrggWwsvWMPMWWwjbCqjCBlZqvfjBqCJhfffj +FbtFmRTpzBBZqCClpJ +ztbzFtnzVNnNNPPDGD +PLPFcwdLdFcbgdfSwFtWhGWGRMWMJMGCblJR +qTpszVVjRlCHtWCT +qzvrDqQrqznzggFZwFwQScdW +LWLjLNjNjTwlwLZVcBVcVVZcBVQcZZ +JhGhFdmBRdGGDnQtbPvVVdnccS +zDrrFGFFRgRHmDNWTpjTBNTHWNjW +fwfBVLhmwfhHsgBstWCWQnDQnlldWW +hZvFTNJrZjZbFvNvttqWWDtcWqCtFDWn +rbjjrjpRzRzgBLzwLgmzLh +ZqqqWVzdSPnwBJBfwJfZTs +FHGgjRLMJFsJTsBw +DHRcDgHvLhDWPSCzwqnq +LZGZLLRLZpRQBtPTjTffrHljjmsB +wNVVwcCgNCCScwggmjHjTPmQPsTHmlSs +gbbwbqhNCQcbqqVchWhtRZDJWJDtZLWL +CmTmvvmvzCCCgzzVQmTQvTjjGRGShwSHwRrRSSSSDNHSFN +PqZqWdqlplsqBJMMsMMnGRJRbbNwNhrrhShGShFD +fBWBWdZppqpqDMBdlfcTCTLtLtLCQfQvcmgv +pntdtdHHWHqnptGpqHqNgMQwPPPnZMZZZZcfgc +LFmLSVBRTSBBRrffTQgMfQMtJZQT +bmRCSSSjRCtSrRChjqqGqpppGhqDGp +dGGhhfNfgRTGLcpL +BmCCwQMQqmQrBCBJLpbVTFbHcgcbLTMc +JrpqJJmqqqqmzqqwmwNlzfvltDPltfshlhNN +VCCbMJfJlgRCnNGVNnvFvVBF +STsgcZdghZsqSttBnsGnBtBtHt +qDcjgDphjhSghZTQgCJWQWWfwfRzWlwJzJ +JHMVMvmvRcdbmrRHQBBGjcjfFQfChSfj +NltNtZllgZtgtnpnqNWpgCrCBQzBGzFhQrGSSBCzWh +pDrwnqLlvDVmPbss +dbrpbSrwBjswsSjCwqllLqFtqLcrGqqFtF +RvfJDQnRpHvvQfRvvQRJFDqzcWltFFlzcLttWltW +ZpnRVZHmvHnTnPZZPHfHmVwdjVghwgVSBgdBBCwgdC +WRCBGWvNgHnMcFwnpC +ltlstrjlJNlfrZZqDJtNLsHnmwwpcHphhFPMFjwhmnFp +TStJssLstJLtqTsNgvvSBNzzvWvGRz +VBjdWdGcqWdBVCFRmHwfCRRV +DLzNpqbDzDNbrJvltMLJLRRmtRFTSRmTmFwfRHRTFf +zvvJNLgNqGcnjgnP +JjdnFfbdbdQMbQzjtRcwcCvbvBqRBCwt +LlNHlWGprPCVVBsVzqNR +hLmgTlrpPPHrLprHrTTGggHWzhZFSJDfhMdnjjZfFfdFMjFz +bDbwRpCSRgqqMfMf +HzzPcPnhzlhsQzHhHnTggBBqTQTgVQqBqjZW +tnsrFccnzsDvGpNGqNtq +GmPsPrsSlswNmcLzMvnpnmMpLBCf +glDTZRDqRTjRCvjvfBpfCzvp +DHlJVhJRDTbqZDqSNVrNwtVrQwSSGs +nNnDwqDwFVgDwDnCgLnLpCVWdBMRpsPdMPPjRHRHHRdBWj +tQtfTtJtJmlTQrTtTlhfzrmdHzMMRMsBPPddjddBPPdWsB +bbhtQTfTTsmmbStnqGFGNDbFDgFVnw +dsVpDPBMHVdHpplpvdHjRjmmjRTMTFFrrTTFQq +LzzWZLGCzCWNjfmRfBhmQjZq +zSSSwJwSBzNtzLBbwbSGLzWVvcvpHdssDllVJgVHVcdDPv +RWfQBDTBLQWpDLNRZjZwHHddjHNhZdtv +ScCCzSszFzJccPHHvmjHvjhpmHsj +FPclgFVCbcngVgnpWQqqRfLBDBrR +cRLLVwcsctwmbVcszztwtRMvNrCpTggqFrTvvhCVpghBqh +PdSDGdnZQfGDfDjWjWWgvCqFhpqvpNZgCTTvrp +dGnDHWnSQdJPDSFLLcJmRzzLLLRRcl +lCSqlcCcBqBCCwGwnNWnnFwBHF +WMZLMPbPhQddRbMpbbLbRLLHDFgjFGDmFNZgNnDGNHGGjD +dTVPPQbPbMdQMzvVrWvczrCJqv +vzscdHcHZzHzCCHlQTTTCcslMGPStmSlpDDSSSgSPDNBmNtl +FWVMFhFMMqWhFVFbDBDDhpmpGtPSDpGG +fRLbFfwWWLnVjMdzzQHQJnnvQs +SmPdRbWZdSqqzSPmbdWFFQgcQnvncgQGQMMT +BfBLmVNjprVVNlVBrpBlHpNrgQFHGCGgvTQTMGFFgMCvgQcQ +BjjJfVLBfNffJbZDqtDsdzzm +NLgtLsSggjqgqpLLDjsjmcJfvpmFmmJmvPpwhBJB +lMnlZMtdCMrRRnRbTddWbVwcmPfFmhJwPfwJmvfwFvPl +MnRrnGWRbgQqtNGDjt +dSdrTbTtLJCcttcFVw +PhsgQQGPZshvpQZGgsrBllVFlHVpFllJJrFH +gqsGPgMZhgvQbzrzTfSzMTLf +pqbDdQWqCgBfbbfFfB +vtjnmzLcmhBdzTFgTsRP +LZGmjvJGGctnLtvcchSjmhcLqNHCwVdQZwDwWDNpCwqHdDwQ +wlMWSSHWShSMbDSwVhCrNjJmcrDmGRRCGCjN +FHZdHftFFQnqsQqsQttjvGrJccmdGGcrNdRNmG +pHpzPpQHpsPzPlzlbSgSSMLwzh +fCQDLlDQTSjbHDqH +ZhrsrZZZhcclwNswGGwbwF +rcWhlhlpMJpMZmgtBCzCttCCRfdp +zLnCMLNTvtGNpNvNjhRHgZhHvZdZHdjD +fSsWWqScTfJJqfJFFJwswhdHhhhdhDdjbjZbhhDj +WsWmfcqBWfTfsrntrLmplCLttm +ljssbqMMPbHPlsbcWZNLLsWJWRFvvZfW +SzgggDDwTzrQmDQgdSSWvdJLFGffRvZG +zCzCDCrznnTTmCbbpvlPHtCPtb +TZSwNPpcgpNPbwbhhbwrwJqh +BlCDtvvgLWGCLffGfLzLrMqnnbDDHbmnnnJrhnVJ +lzBjdCjCGCjfGjjLGBGGjlCSsRppcdpRNdRSPQcRPQZTgT +TsFTrvGmZGfvZfZFzNNZrhClmRcBgCMwQwQPCPMPRP +bpnnVVJtSDgRBwbQRwlR +jpSnqLpqDJDJLDjWDWLWvvzfZZvqvNsGTHGGFfZl +bzbzznqfCpzvhCSMfbCbpCFhtHGHHJdtHJGhFsmshJJG +DLWRLjRrmNPQjZZlQPsFGFggVcWcFddggdsg +rjrZPwwDRlLLBjQlRRlPDpmbqzpqnnCSCfTMwMqSvC +FmcGcjLRPjQwQjMQrwHQ +btJzJbVNdBJJtzTdGBbdBztGrQhhQWhMwHrhrHSHgHQfhMVS +JJDpdDTtCtzNptnTJBznnvLCCvcFqsRqFcvZclLGRR diff --git a/AoC2022/03/makefile b/AoC2022/03/makefile new file mode 100644 index 0000000..abcd94b --- /dev/null +++ b/AoC2022/03/makefile @@ -0,0 +1,14 @@ +## +# run solutions +# +# @file +# @version 0.1 + + + +# end + +run: + emacs -batch -l ert -l solver.el -f ert-run-tests-batch-and-exit + # sbcl --load ~/.sbclrc --script solver.lisp + # rustc solver.rs && ./solver diff --git a/AoC2022/03/solver.el b/AoC2022/03/solver.el new file mode 100644 index 0000000..d2c7c05 --- /dev/null +++ b/AoC2022/03/solver.el @@ -0,0 +1,66 @@ +;;; solver.el --- Day 03 -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2022 Óscar Nájera +;; +;; Author: Óscar Nájera <hi@oscarnajera.com> +;; Maintainer: Óscar Nájera <hi@oscarnajera.com> +;; Created: December 04, 2022 +;; Modified: December 04, 2022 +;; +;; This file is not part of GNU Emacs. +;; +;;; Commentary: +;; +;; Day 03 +;; +;;; Code: + +(defsubst solver-recover-value (cross) + (let ((result 0)) + (while (= 0 (logand cross 1)) + (setq cross (ash cross -1)) + (cl-incf result)) + result)) + +(ert-deftest test-recover () + (should (eq ?t (+ 64 (solver-recover-value (ash 1 (- ?t 64)))))) + (should (eq ?s (+ 64 (solver-recover-value (ash 1 (- ?s 64)))))) + (should (eq ?C (+ 64 (solver-recover-value (ash 1 (- ?C 64))))))) ;; small cap starts at a=97, but already took 64 + +(defsubst solver-to-priority (value) + (if (< value 31) ;; It is a capital letter in range [1;26] + (+ value 26) + (- value 32))) + +(defun solver-line-priority (str) + (cl-assert (length> str 0)) + (let ((mid (/ (length str) 2)) + (left-pack 0) (right-pack 0)) + (cl-loop for l across (substring str 0 mid) + for r across (substring str mid) + do (progn + (setf left-pack (logior left-pack (ash 1 (- l 64)))) ;; ASCII letters start at 65=A + (setf right-pack (logior right-pack(ash 1 (- r 64))))) + for cross = (logand left-pack right-pack) + when (< 0 cross) + return (solver-to-priority (solver-recover-value cross))))) + +(ert-deftest test-line-priority () + (should (= 16 (solver-line-priority "vJrwpWtwJgWrhcsFMMfFFhFp"))) + (should (= 19 (solver-line-priority "hMHLcmGLMLhHmsRMsSvsQSqrsrlJTTdV" ))) + (should (= 20 (solver-line-priority "ttgJtRGJQctTZtZT")))) + +(ert-deftest test-problems () + (should (= 8072 + (with-temp-buffer + ;; (insert "vJrwpWtwJgWrhcsFMMfFFhFp") + (insert-file-contents "input") + (goto-char (point-min)) + (let ((result 0)) + (while (not (eobp)) + (cl-incf result (solver-line-priority + (buffer-substring-no-properties + (line-beginning-position) (line-end-position)))) + (forward-line)) + result))))) + |