summaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2023-04-21 17:05:03 +0200
committerSanto Cariotti <santo@dcariotti.me>2023-04-21 17:05:03 +0200
commit6f0383f0b1dd202b11758da3448aec99dc3084fc (patch)
treeb40136abe1df4ab5d4fcb33313f4e3e28cbb391c /2022
parent01188b501b7f2940936a06bd8d4d11bab9adf372 (diff)
Add day 3
Diffstat (limited to '2022')
-rw-r--r--2022/Cargo.toml2
-rw-r--r--2022/day3/Cargo.toml8
-rw-r--r--2022/day3/example.txt6
-rw-r--r--2022/day3/input.txt300
-rw-r--r--2022/day3/src/lib.rs129
5 files changed, 444 insertions, 1 deletions
diff --git a/2022/Cargo.toml b/2022/Cargo.toml
index 4aeef49..6de40d5 100644
--- a/2022/Cargo.toml
+++ b/2022/Cargo.toml
@@ -1,2 +1,2 @@
[workspace]
-members = ["day1", "day2"]
+members = ["day1", "day2", "day3"]
diff --git a/2022/day3/Cargo.toml b/2022/day3/Cargo.toml
new file mode 100644
index 0000000..898e70d
--- /dev/null
+++ b/2022/day3/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "day3"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/2022/day3/example.txt b/2022/day3/example.txt
new file mode 100644
index 0000000..f17e726
--- /dev/null
+++ b/2022/day3/example.txt
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/2022/day3/input.txt b/2022/day3/input.txt
new file mode 100644
index 0000000..37c2369
--- /dev/null
+++ b/2022/day3/input.txt
@@ -0,0 +1,300 @@
+BccTFfTPTsffdDDqsq
+lGGLQwFhDgWdqvhW
+wbLNjGjlwLFrpSbllrHnHHRmmJVBmZJRRVcBTc
+vvGLllBBLtllJnJFMZNjFcNG
+bdhrhTgmhRrpLJMMNJgNffnf
+qhRmTpzpzVzmTTbmVhWWWpVvDtsLVlwBVHvSsDCvvBDl
+sLlhhthVRndBZzwBdV
+PfmsPsqsGFqrSQpqBDDwpddDDM
+mFjvSFrjPSvLJWvbRssN
+gWnWQtMMDQbQvMDjjcwsvqcwsSSqZq
+HzPJTtmtZJJsqfBJ
+hCFPrNNPVNzFtQhdQMWRhhDd
+sNhmsQZdNdsztNpHGCdjcBcwCvGvCv
+brSlRfFFppHwfTpf
+MbRlRpqMnqRpMhVtsQQQVWsM
+HsdttdfHrHrwdhftMHMSDnJFwlQSgQZQZggZSW
+LjCTqBCmmmTqgFQQFQjlnnDJ
+GCTLBCmTBDBDPTTzqLCBpVcctcHbtbrcMMsdsdtcPtdb
+QnJLdNLfLRQjpLlPflfQnlnswRvwsHVWVHWVVDZwWHcrwV
+zFbgtqCBhtgBhsDZVDNHwvDv
+zgCGCFCFGtMpJjlGTnlnLN
+ZFhJZbvZVmFpFnJbnZFbLnbHPrjjQdBdCrMPQMQHrrrrVC
+gTzlqmNlTflmtTRHdDPqMjHDMrjdQd
+wcRSwglcNSwgWmNzwNlJZLpphbbnFhvLWhnphb
+lRRrcbRfQmwwBLSLlvjjSvvFtS
+WbghzhHWbsdHhVtGLVSSvLFJtSGC
+WWbWzPHDqPfBqRZrmqnZ
+frgLHMcHLrSZHPHcHrPNmMJtTCTCbJfhdwVbfJwwTbdd
+DpDWRjQvqjDGFWhdVwQCnJgTnTbT
+vvqggRsRpcssPrcsrN
+MccbcZjmbbNSbjllbRqrhstVTMtqRtssTW
+qJdwCLdCzQQzwHLQLTtsTtsTRVTVWWTJst
+GdnpFHzwQCdpvpbccPbSbq
+CbQhZpTbTgMMgptzrdGtGzlVNlrh
+FWvmmRHSmjqnSjqnSjPqjnmNLGVGJlGWLlLrLWlVrGzNGW
+FwvvBjmBnqmVvFnvnVPMDspDQTfZMCMTgDQTCB
+VmrsHllHVLTdZtRclL
+bjwMNQGCjGjjPwpRQnRLTtRQFvcdvt
+MbWgjMDpNLMjNpwGpjbPWgfsHsqsHSrrHHJsgBSBzB
+HFlwVhfLBZZLTLFHwqWCqWwQpWwSpqWC
+PttsNjdtPtcmcDTnDdtjjDMpCCCCmSmqqGqmvMvbCqpC
+jndRrTtPdgNPPnLrVhVLHhVJHffV
+NJZVqHNNNJNqCdqZZVjtzCDMtzrtrFhhMFsPCS
+TbwgwWRdQgfggQgvMPDSPszhSbSDszFs
+QpRmWglwTQgGWTvGRvQRdwnjNNqqqBqVlcqVVNncVVHV
+gqBFHLFDNCBClHgbLFbllLggVSTWJVWWpjvJpSSWJjBjZvjW
+mczdshQcsGftdmcwcfhdzQVrhJZJTZhTVTDjpWpZvvWT
+twGdRtcGnRgDqFRC
+fsPjCjgRpwjPpsGgQwPfSZcdSZdWVHzSzcdzHRWz
+MBLTTBMvbMmvJTLvTDvczNdZNHdHcJNzNqSZVG
+rTlDlbBbrsjCCGnG
+FsmBPtzHdmmvcvdWpcWCvM
+RMJGjGGJJGLDRNJJnfGRRSvplTDccrTwSWClvCrwww
+nnRqNGJLVLRRZNNZzBHMHVFVmzBFbhmb
+MmTSpBMBCCMsbbrVvwwSLb
+RffNRFRThtqHhHHqZNrLVvwQtsGvssdvvsGb
+DThHghZfgqhFWRNHhhRWqMCnMzzznlPnBlgzMpnPCz
+GhlMNMdpMZHHhhRLLjqSjjqvvmSh
+PcTJDBDcBnBbTFcDwnPTQSLqLrqvWjwWLqRSvsRmWm
+PDcDJbQTFBCBcncgQPcDgnHgVmppHVMddmZglzVHdMmt
+BqFJqJGpBVnJqnjjmwvrNwVPHPrd
+ZMbQmhWstZScWjdswwwHNdzHvj
+ZZtQCtgZQWSbMMhmMSWQfGfGDBpRJnJqTFFJBgTR
+tVcPGGqwgJPqtJtqZZwcZffsfrcNWBnSWWFrfhWBnz
+dRMCMQLvNssBWFFR
+pvjjQvmDMpHLdPPtgPPTssTHsq
+WDBlFBbGdmBrqWjhWcqZCq
+RPSRPtncngwgwzhCwghC
+cssVsPpVncQMRsVQpRPnRcfJfTTmTdDBLbFlDblTDDDLJf
+CZgCCzgzsCDZDzbbBclgvcjcnnjFBqgv
+VLGThLWhWdThlWRHVTLTTjNjjdjrnBNBcrNcqmqqcc
+VTRWLhpLWHRMPGRGRplVhSfttJpZzwstsbDtwbJzZt
+fqhZRLhwZwVSLbCMCJdJCHQGZWdW
+ztvpjtpcvgzppPvjvPlDQLnMlHDGWnQDLQWDdJ
+PpsPzjPzgLrjzBgLggzrmrVSrTSfSqFVFmVhffFm
+qMFDRLNRRJJphbhSgStpptbj
+rZrPZZNCCCGrlfsCzBbgstBwtvbtvbvBth
+CfVrdndzZGrfzrzdrGddPnNCFMRDJWRDDnRWDFqFDJJFTJJT
+dMDbndBMQWnnbDstnMbMQQwspFgsFFjRrqCCFrrprqrgjc
+SlLzZmHZSTVGSPVmSPlSmrpFvFjjpgrpgFcvrcFcWG
+PHZZTmNVHSWJlHPNLSzPLLHwDBJtbDbnnnMffDbwtnMndQ
+tHBzNCztLBRBtrjvSjfnjvvzfpjj
+gQwWqlnqWqJgJnDplfflddjdsfdpFf
+gcwwmnDccTPWWgJbZNNbZHZCRRTrLB
+ZhjgtrJNfDNpqbhqQmqpmb
+cFLcwGGHwcGdwFCQjnnnVcmqmjCp
+HvvlzjWHjFWTggWStDrDZT
+GPjjQtPQbjwWqrmnsjmnqn
+SNGdfLLGdlldZSSRWznFsNqFRnqsWs
+DdMpMfZMhfZMpDfbDQQbGQVgccgcVt
+hHGGGTlddWGgpRdcvwDCDwzgLJzCwzwgwL
+MFSbZSnnFJWwQBNMzw
+tSjrSFSfqjqqttPnssqjssbhGmWGhcmvldcmhHRhGRhTRf
+qdBjBTNndbnqnLmtZmZvvtLvHd
+hDJCpfnGhJfDPzGzzCnGPmpZZVLZvHttZHQLHgZLHt
+JDrfCDJhGMhFhPzMrCCnrGSwswswFsblTqRlRwjcjRsqBT
+tJPRSZCSJJCnmvvvQMrpqLVwqLqMcCCM
+hhGGGfsdfTGlfggjMLVVFsMVwMMbqbLF
+hdTGGhGhdhfhhwlgNfdhZnZtHHRNtZHnnZmHHzmn
+HlgRZglZDWZgfVbdznHddTvV
+MhShhQMSFShFPPQplMPmwppwbzdtVbFtfvfbzVbvbTntzbVT
+lMwpmJLLLNGwBrcZCjrGCGrD
+qjjWRLjNjtGRRWTCghNwsgwcbwmC
+HPMBpVGMPMvvVBPswmhTbCwgmsVThT
+vDSMSvflBlHpvMMfSSpMFWZdtZWdGWGddqfFtRqQ
+ZmnGQfnZgdmRGQGvgnnmHCbbchhpMLrpcbLpdLpzbz
+NBFPBWFsSVNJlFqLDLwcwrPLzzCwhp
+qlWJqqWFJJjNqJWsFVsVqqRCggtmvvjQZgQnZQmvmHRt
+RdCsJbdsVJtRvdzBzrBcjzMTqT
+wNSNnnHhnwhHfBHqHjBDJMJr
+GnSPLwlFwwLWSwpNWLSNpVZtvPsVJsmRCmtgsvsRsv
+GPMwMMPCBPwBGsCGGWqBsslQhVQFccphvhWpmcFhVLmV
+rbNnHLLHfHfZFfQQQZml
+DzSDNtrztbgCMMBLLCsBts
+rTtrVbrrhbbGGhbbbbRqccdBcdBcvRvBSRRV
+fDqQDqLFQgQgZFMlFNRgvCNvRRvHvRBHHR
+mfPqmFsqqsbJJtGtbt
+vNHvgsSGSFDHvspvtSGwJwJNJrllhwhcnwJlwm
+dqWdWfQdqQVWwnfMnlcfwzMs
+VqQQqBRTqsBQWLppZLpFSHZbvvDt
+gdcldHQlQndnHMzCjvCFrzjSFtbLtv
+NJGmZZJZGTDsWWJNmDVmsCrSvfPrvTtSPbFFCFFvCT
+BDDsmJZVBJwBRsGGDmZNBGqMdnghhcwgbngpqqMgnpgc
+VhhvVwmvmwTPCwPwmDRgDCsgWSnfRMSWSM
+ptHZZtlZzqbZttHbzrFqnDSMShMgSRRMngDWgrGh
+hBttqBhBzlFhtHvTJQJTcvBQJPPv
+FjfzfGjsjBfQfMLBNg
+VlrppVwrpVSdScwTjVnCCQLQNCMBhWgV
+jvtSrSjjtSZpqtHPDPJqRzGR
+ZSmbSDswfCDDHBFFvWHJ
+jcjcVjltntQMltnVrdNnNjdQgFzWHqzBWGWQvzHwgqqJGz
+nccLllwwhLCCSLTmmRTP
+HBSnnJSfHvBfNWMNrvnMrZlblFbsbHwsPFVHTsHFls
+VLmDLhRgRbZFRwjZ
+zQDmCLLDDLGttGGgtLvvVSfqJBSVftSnrJnN
+CgGhbgVMNgVVbjrrtcfTDTfvTscrTvSSss
+qqFzFBzsPZHmddmsmvWSnHJnncDfWnDJvv
+ZwdPqdqpdPlPwdRlsdBqBMjNQjGVgbQgQhGVCCtgbR
+CGFTTMLGPgmPfGfCwTPSSFNQDLNQnscQNccWdQLqvqds
+pbJlzhZRHtjrbrbjHHrplRWVNsNvddZNWDQVVcnQVscs
+pzJtlJlBhJJHJjHhfPfTTFMDmMPBMSgm
+gzCBPDDzgvLvgPLgNThPlVZccJTmrZNV
+sndSnpsdMSnRMRpjShhNJZJhJjrVcTljTZ
+SRRsdnGwRSpptnfMSSpdQtfdWqvbwFgbDJJzCzqqWqWbLWWz
+BDnsPDlmmwcnCLLLwPtFTtTtFRqjRrrSVFqn
+dfhhzMGzWJhpMWhHWggTHJVFVSSqbqqjdRRtvqqvFrtF
+JMGfHffhQhQTNcTTBLCQmm
+bfZBvvRRRzFfFFLRvFzZCcQlScchLlGNhSQGGVQh
+mwJqTbsHmjbTNcNhQGGJGcVS
+mPTgtsnPjwHHmmmbbRDgfpdgBpzvZD
+lSnRStHtTZdjrHjnqJglbqgchhDCPCPc
+swFBzvBNLpBBsvszvDJhCzgDDCgbbJQzDq
+VswvBFmvpSrShmRRMn
+vWBBSrWnZfCWVchwhbcjVN
+RdHQQpRPJZLTtJgNcNGgbhGh
+zpzDzTdqQRqRzzlRDsBBnBfMmCCSZDBS
+ZtGSZVpPDtVbQjbwBDzbbL
+WcFvTFnTMnnMcnhmQhmhBbBQzCQjVb
+RRWsgvgnfqgpGVNg
+WJTrJJCzLqCqBTWLsCCqzmPPQrjwHQQGpwGHHmRPVw
+bMvnDFnFSbSlGgnpmGQVpRjV
+DZSdFZdQZZclsscWqWLhcBhs
+PzLlRRNjjRQzvPNQsvddlZfchhWWZJHSlhChDhHhcc
+MMfngVwtpVMqVrwrMBgmtGqCHDWqJSDJWhHHSSSJJHHD
+tBgnMTMMrgVmrBwMmGfnNjjsdLbbbTQvjNTNsQLz
+ZZBZRmPmgpgZGLWLQWslSWmLQL
+DnHJJjzqrJffrDnHzJjnMbQWSltttSbStvFQSstSvCLF
+MzJDnfzHwHlljJJnqrMjfPGdBRpRBGBRhwVdGGRTBG
+CnZCpMFNnFvvNdpHVrWghgtFVFlLRWhh
+cBsSBsGcjGcJZDrggtgtVDVrgWmh
+wTBJbcbzffJbZccjSbSjBfccNCNMPqqPPdvnHvTvnMTNdnvQ
+vMgPmvQmWDMpGpjBbMMH
+CcVJNcdNgdhtCVpjBBRppfRTGbph
+sFsgNlcdFlJFFwFstNJcvzDWZqqWvqLqzLzmzDwQ
+LLVLVsPPVVPCLLrjCNNNgmRdJNdCdfMJpB
+DTZZHTWbwwpWbSWDBmJMSFFNmgRRBggf
+ZvzDWqDnDwnZTpzZTzWvphPtqhQsltVtPhPhsQrPch
+zDgWmDgrpCLmwgWTrjlJBQRJjbFGrcbQ
+hSMvqvHtqsdVHlJDcclMBjRMQJ
+sqvHsSstSdqhVVvZdqVHZDgwWpZZLLmfmmwfNfWCgmLg
+SQWcTnWVWbZWWBcVPnZVbnrNrMFMdqFNqdMqqFhrDQvq
+plGLlLGpJLhCGrRqGDDDrdzNGr
+wgflHCCCJmpLjCLHtjjgLCtBZswnsTBPVPVsBcPTbZBBSh
+vvlMQvvdjdGtVCTJlVJVfJ
+FLrFqwwZgNrFWqZwgqrZBLWcBTtppztVbfRJztJbztfztT
+WNmmFJwwrFFnNmDgmjdGQMdHMsPvPjsHDG
+hGmZHdSRdMmhMZSHlvbTvRbRlVtCTlCR
+znnfzgPPDpPfDcgnZTJvJNCZbJVCcNJV
+nrLLfQznprrppgprWrnPzQzLSjGsZmHmhBdsqWhdhBMWhdqd
+zhtNFSFwRFLCsNrNNBdl
+BmQBPjDpBTDgHllgHc
+npBjjpQpjGbMnmPpjPQWpwZhtbzJfhwvwtSwhhFFbh
+PZcZbcPlbSprcQbbdCwWRSttgtgvWfjC
+TGVLVHHmTVHGDTDnGDhgWjwvCjwwwRLLgBjWBR
+CHTGsnHVVcJPPcNsNJ
+tTqGSSGPGfVfTpqGTbbcVWJLdjtvdzjJthCjlhdlzQ
+wwFBZMmZBmgnjzlCWBBjBLjv
+rNMsDZnMMWSfDcDWPR
+vLzbsczhLmmnlNvrNQHfWd
+SMSFqMwjFFDVSZwVTMDjSQlQfNlRrQRWdQfRrWrqHN
+CPTwGZDTFCPSjFTSPSFbPgpLscPczmcBLbfgpb
+QnQnpFjsbFcSSvCMNvqVSrqq
+WfzfTfzzPgHTfwfWtgRLMJDvjMmMVtvDJJCVtqmC
+wfWRgPzdgRTWBBWHPBHHBRLTlcZdhjnbZQcGZGpsnphjshbG
+pHzPTsBHzqqtQCZZshlWjf
+DFFbnvJMDMljjtQjfCbQ
+dgJFDGwgmGlMSggGdgdDDlvLNTzpBzLzzwpTBLzqPBczLT
+jccNVNdwnclRwlbwlVjdcpJSpGpSllBHgGHZpJpppf
+mDThTmsnDsSBpZfmmgBf
+MrFrhCshqvWvnWzTWQtzVbRRQwQRNQjdwQ
+tBnLJfnQtzRCffmNjSRjZjNZSRrP
+dVdMVMvMghHzPhzZhHND
+dGWGgplWGVMdMMzCTsbLtLTCLpnT
+ftNfNDdSBdrMTdrjMM
+cHgHGHzGgJhrPLqSrrJTqp
+mVFnQnhQGHFznFhBBbSDRBlSVBBRfS
+VqqPBPcPbQHgfrrpcSDR
+tpMnsztnGnthhzTtGTGTzzWgJNDlMfSRlRDgRNRrDRHfrg
+zWtTFWzTwphChnCzFhzWZGGvBvLqmVmbVQqjqjmBPqBLCP
+ZZgZnhrmwmnmgmvrghPmgTGcTSGSMSldgcCQCSqW
+LzFLDBfHzHCCqCFGcSlS
+HBjRJDLpHpJsJVJqsnhP
+PqrqmvmrwzznnPDpjVpDLfDtPGLt
+sdRhRWFhShhFccZZsSsNbsNcjCtLpMVWCjptGCfMftBDLMtG
+bVZcsdlhdNSbZRSshRcbbqlmnqHmmwzrJlzzgQlmvz
+pnrcNGqmrGqnchGhqdWdTlldtQtlMsTq
+DvSLgzLSMfbgggCLCwbSSLLtfsWTQTsWllssdltRQQtttQ
+bCCzzPPgDPjPvwSzDbwpVNnpnjjrhpnVZGMhcp
+jWbGtDdqCqZjdHwcwZMBVQmcvZ
+PnTflPRRrlgLTTRlTzFPPQQBcNvHBncQpHMwHNBMwm
+fFFRrFLJgRcJglgRzTzrLqWCjtqGGDsjCjdbGdqdhJ
+GwbvGqMsDMbpMGzzgRzgpBLjhcch
+WFTFNZTZSCcBggBFcrss
+CJWWlsWlCtqGJmMGwJ
+CGCVhprTrthCZTCNtVGtZDZNdlPPdPwmmvrcbmPmdQRvQWmw
+LfzLzssfgHjLFjFLfjMfHsLHmPwdcQWQQlscwlPdQclbPvlw
+LBFHjgMzqqjfJqLMzffHzqgHhhJDZSGVDVChCDDpDNNpNtDW
+TbzVlmNTVVtnTSWNwDDrpGcwdp
+fQQMFbhCfLgfQCsdDcHpsWpdSDsGrr
+ghvPLQMfZhjjvPLhbQFQBZqJlTnnnVzRmtRzlmBl
+JCLLLwVDwCQsNwwJHmfrMZpMfMMrfPQSMZpS
+WlFlzFRnznthqWRGbMpVMbbMPtMjMj
+vTnvzqllhdhqTwVBLcJHmmmC
+tczhtcJJJbtclWrtJBWJBtJtpqPRSPfpBRgqRfPmpRqddSmM
+HCvnsQLNCQwLnDsNHLwQfPSSpPSMfnPddRMmmGpp
+wDQwjNwQNHjTHNFDCNmCFNWtWzhJbWbVrhtWccVFlrlV
+sPRpCndBCGpCGHttSdvTbWvgdjST
+wcmDwqcwmGDTNvjWtrbSrc
+lwlVLVGqZGlLzVHHBBBCHBHRPCCz
+wdmhffzzphrjqtzRbrrq
+CRgGTGTFssZsllHNBlHsFJRjcrtjtPDPcbCtDrLcrjctrc
+NHMRHTlFgGNwpQvMpwVvww
+MPLJNPqmFWmDFjGS
+nbsZtwbZlbZlGlFDDMpVlF
+hvsbbbZtvfhhRZbZsfzMbMZbqcrqdrNrNqLgqhrLhJgddLNL
+SnMLpRDGlZSZNlnMZpCwjLwzFrHBWCFWBBBr
+TttvvtbtVcsJtRsvtQdzWJrBjCCHBWzrFFhCjC
+VmvsQdgPbdgVTvgPMSDfPPZfDRRNDNMl
+LjngLCNhDNFNhFDhcMqrqqZMcSZnHTMc
+PPJwtGlfszGwWtzwQJBPGslJSqRTHZvgcRRZrMSTMMTtRTTc
+llPPJWzQPmWmVNgDbLFCLb
+NPFlLNBLprpdmmdPBmJnLrdjMVDjMSdqgggQTVDqWMdqVs
+vZTbTZRwvvGRTRjWDqSqqQgDGsGq
+vzZcfRRZbwbRHRtwZCChBmFNtJBPLBlBJJLpmFTP
+pmvZmmTjQFfnvPPHHv
+SczhzfbsLNhfccNFsWFRPrDnPDnVnW
+BtBbSdtzLBwSLwBmTZpQMpZmZmfZ
+PqPQZqtQQLDqrnqdjqdVwVbz
+MGRGWMgJHGlRRHfSwfzCfCVVQzbwjrjn
+JsmHmSJJmSMWMlTWQBFhLTvhDFZhBQDZ
+sbgbbFGTTFNMbMNFWrjsrvWzHWPzPPpf
+CVmhVqSqCZmJQhPpHzvZvtzWHjHP
+CnmdCQCdnFTnNgRpwT
+blZjhbZWVttjWjWLCLVVZCZQjMDQHsBsBQfMDQwjHDwBHH
+NdcJdFcJqgpJpNnDQLMFsBnLSnnS
+LJrJdJrzvdrrpcNdNcrVlZWbZzZVRhRtVlPttC
+mhRtNNtrtBQQrtrBBmQlZwHHqHZSVHHGshSVDwhS
+gpdPMTcsLscMccTpbLdHSfGfqwHZDHHqZqHZ
+zbzvMpPLppLzLMjTBQRmssjBWRQjlmrN
+VzzvggdvFdmffwmGpd
+HNbnJTRTmCwwrRpR
+LlTnWhLlhLJmLmtZtPcPcVFFPSZgZt
+jHcZjHlHzLHHnSNSfL
+pQWRrwPwrRWBWBPWBRrpdPmzhShsSFFNShLhnnvPtvSNNs
+dzbmwVwbbBmGcqDbgllJCC
+ndnvvzJDHvzHHHjnHjCCSDLgbSFwNFVbFVTL
+mcQmQtpWTQGlmpTtMtqtpqTFsLcVSSscNCwLNLbwbbLNwV
+pRZTQlhmtGWqqWnPHdnhjHrBjPPd
+TtLpNHspTcLNNsLpthhsfmtjRSRlWWbzSwSRGwbWlWSSvlmS
+qBJVnZZdJVZrZndbPbWwRzSMVGbbVS
+QCdnBFBndBQDnrqrnqqNhpNNLpHthsThjGCTLL
+phCgcdrFbPLpgrbFHqQqzzlbGWGqQbHW
+SFTvTnVVMRnNTNfSHjHQMDlHwDWlQwDz
+TZmTvsFNmvTtsggpdJLBBsCs
+PBBWQjvsPsHVsNMcSzNDjcGggS
+ZtrTfTrrrrdCqpdtLNnMLLqNcgMzgHLq
+CZFmdTrJtbZrBvWHVVvHbPQW
+djcrrBljMrTdCTcdCClClMlqRvtNqqSRwFbNbwvNBNpSzq
+QhPmGJnPVGVHHNzSqpzFwztF
+nhgPFmsnLPGLhPDJhGTcDjMfrMMjMZWfjfWj
diff --git a/2022/day3/src/lib.rs b/2022/day3/src/lib.rs
new file mode 100644
index 0000000..0eadb0d
--- /dev/null
+++ b/2022/day3/src/lib.rs
@@ -0,0 +1,129 @@
+use std::collections::{HashMap, HashSet};
+
+pub fn part1(input: &str) -> usize {
+ let mut tot: usize = 0;
+
+ let lines = input
+ .lines()
+ .map(|x| String::from(x))
+ .collect::<Vec<String>>();
+
+ let mut map = HashMap::<char, usize>::new();
+
+ for (i, ch) in ('a'..='z').enumerate() {
+ map.insert(ch, i + 1);
+ }
+ for (i, ch) in ('A'..='Z').enumerate() {
+ map.insert(ch, i + 27);
+ }
+
+ for line in lines {
+ let half = line.len() / 2;
+
+ let (l, r) = (&line[0..half], &line[half..]);
+
+ 'o: for ch in l.chars() {
+ for ch2 in r.chars() {
+ if ch == ch2 {
+ tot += map[&ch];
+ break 'o;
+ }
+ }
+ }
+ }
+
+ tot
+}
+
+pub fn part2(input: &str) -> usize {
+ let mut tot: usize = 0;
+
+ let lines = input
+ .lines()
+ .map(|x| String::from(x))
+ .collect::<Vec<String>>();
+
+ let mut map = HashMap::<char, usize>::new();
+
+ for (i, ch) in ('a'..='z').enumerate() {
+ map.insert(ch, i + 1);
+ }
+ for (i, ch) in ('A'..='Z').enumerate() {
+ map.insert(ch, i + 27);
+ }
+
+ let n = lines.len() / 3;
+ let mut group_of_3 = Vec::<Vec<String>>::with_capacity(n);
+ for _ in 0..n {
+ group_of_3.push(vec![]);
+ }
+
+ let mut idx = 0;
+
+ for (i, line) in lines.iter().enumerate() {
+ if i % 3 == 0 && i != 0 {
+ idx += 1;
+ }
+ group_of_3[idx].push(line.to_string());
+ }
+
+ for g in group_of_3 {
+ let mut h1 = HashSet::new();
+ let mut h2 = HashSet::new();
+ for ch in g[0].chars() {
+ h1.insert(ch);
+ }
+ for ch in g[1].chars() {
+ h2.insert(ch);
+ }
+ for ch in g[2].chars() {
+ if h1.contains(&ch) && h2.contains(&ch) {
+ tot += map[&ch];
+ break;
+ }
+ }
+ }
+
+ tot
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_example() {
+ let data = include_str!("../example.txt");
+
+ let result = part1(data);
+
+ assert_eq!(result, 157);
+ }
+
+ #[test]
+ fn test_input() {
+ let data = include_str!("../input.txt");
+
+ let result = part1(data);
+
+ assert_eq!(result, 7428);
+ }
+
+ #[test]
+ fn test_example_2() {
+ let data = include_str!("../example.txt");
+
+ let result = part2(data);
+
+ assert_eq!(result, 70);
+ }
+
+ #[test]
+ fn test_input_2() {
+ let data = include_str!("../input.txt");
+
+ let result = part2(data);
+
+ assert_eq!(result, 2650);
+ }
+}