From f040734a83a241ebb654d48624f649658d9030de Mon Sep 17 00:00:00 2001
From: Oscar Najera <hi@oscarnajera.com>
Date: Sun, 4 Dec 2022 19:05:57 +0100
Subject: [AoC2022] ELisp 03-01

---
 AoC2022/03/input     | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++
 AoC2022/03/makefile  |  14 +++
 AoC2022/03/solver.el |  66 ++++++++++++
 3 files changed, 380 insertions(+)
 create mode 100644 AoC2022/03/input
 create mode 100644 AoC2022/03/makefile
 create mode 100644 AoC2022/03/solver.el

(limited to 'AoC2022')

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)))))
+
-- 
cgit v1.2.3