summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShivesh Mandalia <mail@shivesh.org>2022-12-20 21:38:16 +0000
committerShivesh Mandalia <mail@shivesh.org>2022-12-20 21:38:16 +0000
commita1c075cd023714d61a6c9d7bc30a1b711e648d7f (patch)
tree5a6fe056a9092ca402d8820a723868f39443d0fb
parent277254232b852283cbc6bc6a0f31a588c458bf6a (diff)
downloadadvent_of_code_2022-a1c075cd023714d61a6c9d7bc30a1b711e648d7f.tar.gz
advent_of_code_2022-a1c075cd023714d61a6c9d7bc30a1b711e648d7f.zip
complete day 3
-rw-r--r--Cargo.lock16
-rw-r--r--Cargo.toml4
-rw-r--r--day03a/Cargo.toml10
-rw-r--r--day03a/examples/input.txt300
-rw-r--r--day03a/examples/test.txt6
-rw-r--r--day03a/src/main.rs105
-rw-r--r--day03b/Cargo.toml10
-rw-r--r--day03b/examples/input.txt300
-rw-r--r--day03b/examples/test.txt6
-rw-r--r--day03b/src/main.rs94
10 files changed, 849 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3629791..68f3f4f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -97,6 +97,22 @@ dependencies = [
]
[[package]]
+name = "day03a"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "itertools",
+]
+
+[[package]]
+name = "day03b"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "itertools",
+]
+
+[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 8e27fa8..f5eae12 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,8 +5,8 @@ members = [
"day01b",
"day02a",
"day02b",
- # "day03a",
- # "day03b",
+ "day03a",
+ "day03b",
# "day04a",
# "day04b",
# "day05a",
diff --git a/day03a/Cargo.toml b/day03a/Cargo.toml
new file mode 100644
index 0000000..ed56058
--- /dev/null
+++ b/day03a/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "day03a"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+clap = { version = "3.2.20", features = ["derive"] }
+itertools = "0.10.5"
diff --git a/day03a/examples/input.txt b/day03a/examples/input.txt
new file mode 100644
index 0000000..60251e4
--- /dev/null
+++ b/day03a/examples/input.txt
@@ -0,0 +1,300 @@
+BdbzzddChsWrRFbzBrszbhWMLNJHLLLLHZtSLglFNZHLJH
+nnfMwqpQTMffHlNNLllHnZSS
+cGpcMwfppfqcjcTCBBzWDsDbDrjzWz
+LhfjhcdjcGdhFfdGfdjdvwCCZMvvLvWwMLCLSwZC
+rDnsbmptPmlbQMCrQWQQBZQW
+gltgVPngDPbptPsbPzVgmDldfTdfczThjJJjfMcJdFHjjH
+dGlgDflTLLLrRLTLVdQLcQMnbvHbbFzNNvMbnHHn
+sZjWJJCSjWqfCqSjSmJSbFvCzBMBBzHncHNvMBHN
+twqqwpZwfrlwRwDGDR
+zCGGFTQMQrsNRNGZdR
+cLLQgPDpgcgmvPRHrwBdvrNZ
+glWpmJWQDcJpQnpjSmbhFtMnqFfCVTCFCFFM
+zNZWFNZBFrGTdBcZZBdJTrGrmgvppgDHwHmgVHCHCvCPDjzC
+qtqqPnLSfLwvjvvgvvqH
+MtbLLLQbRfPRfnbnnLMtnsbdBNsrGWNWcNcTBWZrrcrWcJ
+sZwstbbDVlHtbhcrhhZLrRpNQN
+jqGjjFjWnzWGgqWjJJNphnLMRhLhcrhcrSLN
+qCJzFJdvmHvbtpbb
+ZSRsvvQvZpsRQGJghClPCwGPChCP
+FVdMLDdtDRdDcBtmcVFntwgJJTlnNPwJnlTlwlTPgN
+VqttMWFmDbjbzrSWRQ
+TsDSBcwshdwSCrgRWZBvgGRG
+LPVJLqqJbbzpFqwpbvgGRmZPrmZgCvCCfr
+tzJlJzQllFLqtwHhjNSdtthjDhTN
+fsDLDDnwvnSdqLSsFSDfsLpbgVttPMpPNjMWVMNfpjgW
+jhHmBmlrTBBHRPVtMZbppNPPZB
+JmTTrTmjRTJqSQQSFqQw
+HPzZFgPFMCHJCcZMcDQGwpLqPLqppwhGvv
+BrWRqbqRsTSTqNddrVrthLQVwnpwphnvnDnGvGDn
+tSbBfsRbTfqjJqjCqm
+pCqrqzmqZzrmCCvCJwJPBRwJBWBmwWBJ
+VqbqbjFLFfSHnfctBwDdDFTwtRRTDF
+LVcnbjHLSqHnhbSGGppCMMZMphpNrQ
+PhTcTPsSPCMvvhhMRPttbNWfNsWFNfWWtpNw
+rdQrDbJBVVjrBVdLjHHHWNWwfHtzzNtFpZZptppg
+JJVGGdddjDjDJmdjGqqRSbPMTvcRlqnnMlvT
+SqGfTrBlSrrrfGGQvCnqZhZmPPhvJh
+LdVNwgsjdjHmjWwDsDpwsHWtnCnQQQQNnvCnbJZQbNbtZZ
+DjssDHLLVppDssdLspswFLVjzfFMTfSBcTRcrFSBzBTzmGzr
+JSJJqlldpJlcdVWMlgMJrcCjrhzHCwTjHrQzwTzZ
+bBvsGBGNFDNRFNFBRDPsDDHCChhhrZRQQzhjhCjTzWCr
+FvbLFGDDtWDFBnPGFDWGqJMgJpSdVStllttlppVS
+clpBdBQBsqGpQbVdqTTWRTSFgLLggffg
+NzvwmHvZtZZgbDSCLDmfmm
+jPJjthHzNwPvvjwjNzPzztZBlrccpbVGBQhlGBVlrpnpBs
+NmFFGlGmzCrNWHvFmFWCFvQPTdDDlbbdgJPtgbbdPDcc
+RwfBqLwZqffqnPbdDgVQDdtRbT
+hnptqLMMLwqjMMjzSzHmhvNNrvvhhz
+hqVrDdPdVDqjsDrjjqsfrrWlctvHJNLfvNcLHNNZRNZHvfZL
+CSnWQSGBBSnmBnTmSbQbNZZMJNJMccGNHLZNNvNv
+gFnmBmBnTCpwmBbgWVqjPsrsjplVrjlqPr
+vgVgJJCphzFjzbwljwww
+PWmfDgrPrPWlSWqSWlSZ
+rrTHQTGTPHDDHgPrcrcPmDPhdtGvnvNnttJCdJhtGVnpdM
+DDDhNgWNLWgDqDgtgtwSngjVSQdf
+cvFrcGmBrrrCdSfSJQ
+mBHzFFvFzmsBspsFsZqhqbWlWdPDlLHbqZ
+TLNpGpRzwGQLLQRTwdvWdWbdbgdBlblb
+FJDVzZzHfZHVzcHgnvHnvngvvc
+MzDVSmZPPrqhGmCqQqLR
+mqHWcBHVcgsbhhnTrrTg
+fWftGtfJpwJMSdFDLFSGDGFnnNrbrhTNsZnrhTswZZnnsb
+dSftppdSFStLDpQfLjWHQvWBmmqVjCqcVv
+frfNzgvzzzJwJqpRcP
+VdVSnGnHqhDDTdqhdLWmjMTmjMPjPmTsmsmjmR
+BdGLSWtBSWDtVqdSDVGqtSSHFZFZtQbZlZfNgFffrgNrvgrl
+jBVSjsJcLcqqjtgcmRFRNFFzFm
+CnHnWQQGGWnnCnfvCTmZRZgNtfZtNDZPtNDtzl
+mWWGGdmQQWwrHHMBBBhrBVqshBLBSL
+cLtFcllvrslGLcLHVzDZQzzpznWzQtQZ
+TmShfSSPJRRBBfSgmdfBJhDNVpGzVZpzQgZgbWzpnDGp
+BhJPfSqdhqJRdBdPqTJBChvrFlHvvCGCccHsMscvrHvv
+zfddZTpZLzLDfLtDCttdTfZPnlcPcnhjPDnlcjMchDPjnP
+MQsFvFHJsQvmNvvswljgbPbwlwjnmcch
+VFVqvqFQHqVJRVCBLpqTGMzCqtMZ
+PZdVgNdQQcdcZQtGhnHtBlvlvWTnbBHWWH
+CDJmzqFmMmLfqmzFwqfzfwMRvpRbTWBBWDnlnbnWnTNTnB
+zFfffjCqwLJCfrCFjCLCzCMsjSZjQNPhQGVSQQZhsGjGgd
+nbHntnqPQwTHwQVC
+BzfSZSpcBZpzpPhSBjRTCBWTTRWTTTWR
+pvZpzPzNfhddJGmmNnJb
+GwTgWlvbgTwMrbwTrlWvwtHBNtNvBhBtdZcShHDtNS
+PnndmnCmnJFnsmRdmFnnZDhRRScRQQHDtDNtcDQS
+CLffLsmqqpJljVdlpMpWlr
+dPCzBLTSLqmqdSCsmrTDVQjZfjfVVZnZhhhLGQ
+wwFpgvPJNwgPPwvZGnQhbZQQFfQZbf
+WvRwwJpHHgpNMNqdTdCdqrmHBPtm
+DbWwjSGFSFfwGfCwDSSPPjLhgrrLWRJRgggJphLzpJLq
+lQTnMHdcQBvlHMMZBcHHTrbzpdzgqrpLdqzzVRVRVV
+vlvlNlBQvBZTQBnHnQTTBBPwPNCCsfSFmbSFfmGPwFmj
+hGGQtbVjhRqlmqqrmDlpmw
+gPMZsMgdssCPPsvrgZcTZTPSnnLLnBWDwLmwWwBnmWSnWNWB
+TsvgMPdcgCfMdcsZJRQhVfVRVQFFQGtr
+NfpFTTpFNbpZMRFrJMMMCv
+dWJPngDWBtPVBdPVGHZzCGHZrrvZRSMSzv
+WDDDVDPlWnLBVgnsgJmQJNqThNmbjlqbbh
+vnznqvfrzzVzrvvnfVqztBtGbMCdGmCcdccJccCLCcpSSgcL
+RQsDsljDlhssWshHhlhsHTlLbgJLpmgbbcMSpSSbcSJgjd
+WswhhHWlRTsQDwWHTRhsvNVvwqzfVmNBtZNmnzzq
+cjcPfLlQtPsZQlfHZJqVSFdVwmSRRqSSddwDvF
+MgNbBgzgnwdPRFmSPn
+CMGbNNMhCMzzPzBpTNPGBclLcLfsptHQfQlZssLcLf
+slsdfpSlllpTVJJGgGDgHMdV
+wrBQrbQrhQcpbQrhLwRBrjVVgGGPgZMtZMVhgMPMGHPg
+QQwRnrwRbbRcmQmrjRnjpvNsNTNSlTmsTqCSvsNSWz
+GWNwppdHdpmzgPFPCRmlCBPB
+bSrJhJSsMhrJMDPRCPBlwVCtVSLV
+QbsbwqQZvrJhhQrhZZrhchTfnTWGNvWpNnjHGvGjNdGT
+NMZGmnMBWmwmNnGwHrHvHzfrvrVVVj
+pSbDRLgbpJDPpRZRQjjFqVhhDFjDVqfrzv
+sQQscLTZcsTpRsBnmlBcdCMBMtlc
+hwWslbGWbRvLZvcscZ
+gQnmmrNTmSnTfgwDwVwpJvJPJzLqLJTLLvRcZz
+mrmnSrDNNQSmmwdggrrDbHMGhtdtGhGlhtClMGhM
+qQdlGcvDQDQvDdmtPmmmlStbjSrm
+CpNhzWTCTRznBMvwtTjMrHtSvj
+nWzsfZCsBhNpZLgGdQDddvqd
+ggjTjJWDVVVRTwQcZWvchshWhs
+LmFfLfSmBtCttNLfCFBPFNBvvvhrcQdvsrsdSwdqcwrwSw
+CHttltmlPLMHRTgJQDgRDTMb
+RPJgCdhgPPSzvWDcCfGHDcvf
+HbrrwBspTwWDDnqbZjjD
+rQrFsrsstQMQHJdHQm
+GVwQVGBZBNQwsjdNcMMlgJNPgj
+SWFfSzTCSWFCSpgnJLSjpMdc
+FhTbvrzrMrDCVHsVsHGBtHwv
+FsqjjVzFVWFqRRWBssdpNSBHwJpHHJJdddSN
+lQgmhvbTcgTgfhTQhSCFCGJHSlwNtJdGHG
+vgZPbbfMhbTmchhjRFRnsDRPWVqzWz
+cvwfjjcJjqhctvSpCgCFVhrFCrpC
+mRsQmsMlNNzznWQlRnsMRQlSCpLNbpwSSSrwFLDFLLLgFp
+zznlnGlmRmMlPZnGQzMszMRfccTjcBJjtJtJjqTZtfwBTt
+PtCwCCVqbjNNqqvGssPmHGsHMfPH
+dcddcWFDJJJcLczhWQdcDScZvHZgpGfsvMfSmsggSvvnvM
+TTQmTDhdQQzdRwjBVrRwCwBbBr
+BnBsFHCrcnBrMBPSmMSCmrcFqnZLddLhdhdGLvqLqgqnLJJp
+WfjTlNVDTtjzNWTlVMWNlTwTJphdgpvJLGLdgghZvGLpwddq
+zVjbVblVDlNTlbzTzDjllDTzHmHCsmcMHcSBrCBbrHBcBPSC
+ddlcGQlCjQNGQmPLslZTlmTtfT
+MDzMwSwqpzpDRpWRJwgZhttrZmTPfZmrmtrMZZ
+JSqRBpJzwgDDpqDqvpBRdCjbCjQCFCbHvdGPjdHQ
+bwzPwGLZMsbJMPPLGLMQzbhhQRvWWtVqVhgCVtWWQDqt
+HddrHFnFNpVnVLhnvLRV
+NLdrFjHTBrrdjFSpFmNBmSfZMwZMJJfSffbwzwPbczbJ
+QTWSzTTLwTfwflSNJRdvGlRGcNgJBl
+FnmmqrqbBBgRbHGc
+MFZqrCVCqmZCprspFZmnnMsDfzWzDwSfjSwPQPTLhffwBLwj
+npfgFRTZRRnDZLdgRfRrrjcWzGpWGGGQrjjWpP
+vblVbvSShhVzHWjzzlrPWG
+bVwqvCBtShqBhCCtqhNqCJRTTBDFJJLnJgDRWFBnWg
+nHDNQvgvnNZHDnsGcjfNTrTfVrfL
+SRWFSBRLtSFqjTrVVcsVjTSG
+BdBbRttWBdbdWdbppmZlLmgwHvgQvgLZ
+PQRZlpDDptQSclBMGVBdhVFGBMpf
+nnrsTCWjLJsnsSMShhGJfwffwV
+vjzqsjqgSHbbtvHZ
+DgFmbdSDZbPgLbDDmFwZwgLSfccGcGvnvvngsGGnsGMNWsWs
+HqztHHhHVhHjhRRhJtCVBCfNprMWpcMMJfsvvMsGscpG
+tjVtBVTBtHHqCRqtzQwTPSNdSwPTTbPFDdml
+sbmBmHZbRRRmwBmsSjHzRjmSCNFLNLLQNQhFgtQLzNztlrff
+MpqPPDPVnGqrJpcqqJpMVlgtlLFLChCgChCCQgCtCD
+VdcVVJvdrVWHbwHWBSSBRb
+tPDVBzzNSNdDSQpMQMTQJMMQMN
+LqSWSmbsmfQTTGZMWGCW
+cLjLcbrjqmvfqLbfmqLwDBBzSHPzlwzcdBlnnP
+SbnHrGHSrrhHJBrrScDfcPDMfpPGcGcpDL
+QTpmpmmQWlZsTvVQDMgggFLgFcPf
+zsCNlltCslzlTNsNlShwdJCpSqdHrBhpwr
+JZmFrmLGjFZdDGrrVTvzmPVvRRVzwzzl
+WBnfMDBqMsgDBqpBvzwVlCwRTRRPpvlw
+WfghfttggfSnnqbDftfqSBBDQdHhZFFJrrHFjGJdGjFrjQLj
+rNLRjrlVlrFRJzlsjrVlRFGCmnMtftgCNDDgDmCfqNgPNM
+SpdBpdHbpHWhZqnCdtCGggqCPn
+QHHvvWwWhwVVQRscVzGl
+QffLtMQGMQfDMMwMTJwqWHvH
+nSSFznjFcfjTgVJTJjvT
+RrBpcfSNpRBcFshrCtQrDGLPQb
+GctcMldStGwPPbcLsQTV
+jhnzDgnHnnfPVwHQTTLTds
+gBgzDDhzvqdGGvrtdvtm
+PPwRWVTvRvPVLwRpMlzmbmsbHWjbbs
+dFTFCNfdjzjFjsMF
+SgdffSTrnnqCgdqgcNrfSZqVvVLRDPJZQwJBLPQPtLZwJJ
+HSzDQftHphTBHFhr
+WMmJsMJNLWNPmmsncjMJcjtvwggVvhFFFhjrVwrjrjppvT
+WWPsJJCWCtZZZRGC
+SfFZQDRLgpLlRgQRRRFWTsbhBhgTjbWBjhshgw
+tHVNGjtzzHvMMJJhrWJNrTrPbP
+jvVVvGCGtCmjHtdHzQQfDpSSlDRnFfQFmR
+ZBBPfVVPPrVmrWZJzNdPznbnbSzznP
+gvgpGqFFMgMcGgwLwGpcJNZSTZbdbdzNNSlqbTnn
+ssZLgsMLQvcFpVrhCsmtWHjrrW
+nFvhRnWWzBRPHQqcqqCqmFbd
+SJDJgVprLfDfbJmHmWWHQtJW
+wVsgWVSTgLjfSsVjVBRvRNwwGGRhNZhRMZ
+wTRrRBCTPTBPlgMqgHCqggHLgg
+dmDzpQpBdmWmWzzzDFzjGNMSWLSgLVGGLVNSLgSg
+JbFdmQQJpjpptQbdJJmDmdtnZhZRflTlnTrTlrhBwPPc
+jwSwssQbwbStlhRgtsVstn
+zPzFdFFZccPDgntzVHHgghRz
+vVVdfFmZPDMWZZBmGQbwJJGCLwwMwJCS
+PLLffLFqqNLwSffbnVzzRf
+lsmgTggChrgDtZsZVblMVJMznVnwMBnb
+hDZZTmZvhTgstvwNFdqpWQcqvP
+mmWwpwqtmmHTqHpprRZQPPZLZWSFRFRB
+gzcgscgbfvhRRNZQRRQPvr
+JsjhcshCfJgrrpttTCTplH
+TvNrvNrJfWWvtJLTHhvZZhQQwVGZZhbV
+mFCPmBMPlPsPPBsMFPszbHQJwwHHhbZVQVzjhGHZ
+qmlBsdCSmJBmsBBMnMMTDWDNcLrDprSNcWDNrW
+HSnHCVqTddFHSVqFqdStSQGQwRzQCzCRzGRRGNPQwz
+jhlBpgNvlfZjlfvmpgfgfBrMRRwMMPPLQMZRPMWMMZPQ
+hflfpgjfBfDcpchlpvndbHFDdHqSqNVqNVdn
+QBfhlVNfHSZHfVCVHSQfZfTCctdvdDTRtjDCtTRsjsvj
+brrWWqzFWzwWbswDchhTRtDhjT
+gbrFLnpzqrWPgqpLWrhnHGZlSfLfHfQBGVfHHNVG
+hcFmVScmQBVhtcvfHLfvHSnbHRLn
+lzQqlDqgpWPvJfRnlNJvww
+PjCCCPgDgqGzmMtCQstZmBFs
+GrnrHrmVVFMFhSSbSfhR
+zjTqLtBjjdWdWTLshMZMDbPNRMSSqSPNfD
+dTWjdtwWhjWTBzcnrpcwmQpCwcpw
+BgtVBsgVVJhgGsSGJbghJqbsjLfZmLjmmtfZndNNZFFZNLdm
+MHTlzlwHSvPvzMSPCTMQCNZdjjmnfQjdZfNLjF
+HMDTwPDpzrTzpScBghDbVqRBgRBJsR
+qjCsTmrrnnCmhcFrCjqmThRlbHGvJGvvvbRbbJRcQJRG
+fVBBTfMdSZLNZgPdgglGRdbtbtJRllJWJtWb
+TSZZSpNMPBLgpZLVgppBDFhzDmjrnzhjssFqDhzFnn
+MDtDMWmMQmdzmMMqvlGfRcjzgpcPPjczPl
+sZsHJWNJFJNbWFBhFBnnbVclbVVPglfcRggffGGpjl
+srHWLNZZJdSLSdvDMw
+BFqsPnsZcgnncggccqsqqpDPtDWPpPNTNSNThrWtSj
+dQbfQQJJdwdmFRbJLRJdMrfDWrjpDrrprhDDDDNWWD
+QGwdJmCFJZvGsvvncB
+GRRNSjrffGTSPrNTffSgcJTwWJZbbZvwvwtVwWVJZv
+CMcFsqmBQzMzshsBQBQvLWmJVwZtpJLJwJLvwt
+qBzChnQlzMcRSnnRRjHGGg
+dPPbPWNdTBbDpHPHpNsgzvFlglvHzvSFzCFF
+fntqhGhRMhnnnGGCVMRhCVlSjswFvvjzjSzvQVSgsl
+MMqqJJRCnMhZLCRhtPNrpZPDDWTDTrNBmD
+VjVGNTNlNchVjNGRWrSWWtZtRrzncR
+BTbbbwDmCDLTbDwfHmzZMmRrWtzPrZSZtrrz
+qDLLqvwLBsfBbBdQFQTJhqThVTQJ
+qBqPBGZflhrWznzZZdsnzv
+FmHRcCCsCDwDbjtzdjWbdz
+cTRwCCNHFNmwRgmFTNCFTJqqfqPJsPhPBlsrsfGf
+JTNhhNrCTcWpJJcpWw
+LLdLsfMsdStbtggLbnTpwfWDzpjvnnjzcz
+MqSZsgbMbGFbZtgTSZSFSLhhmHlBQlmrmrPHHCPPZPBr
+GgjjgpGvpJJtjgvPrJttsLjVwCsQsQNLsfLfMVCl
+RddqZqzcZdSWcHdcqQfQLMwVflfNQNMQ
+FncWTRcFlHWFmcFTgPJhGvDgpnnhhGtG
+ZGPFJsPQCbZCCbgz
+nrvrnGWTwwqTBRcpCRRg
+DnGWDldNmSLSMdMQ
+ScDmPPPmjmjjWgtdSmdmCnNqVQVVrNRTZTQTQDHHZGNH
+wbbMhLvMJpRwJQrJGHqQGrQHqr
+wzhspwpppswsMFLmtnzjdcmdPRWPtS
+fPlLTtBlTjDbWcTMJcncWqss
+LdvLrLpCRRQQmvhhVNpwRMWJZcFMZWJwJFFFwZsGcs
+prrRVpvvRVNmRvvzHjHPlzPLSffbbPHS
+bbCbzsQbBzbBFbFzFfJHfVJPfVPtzZttpm
+hwvrjDDwjcDcvdnNvwdnwwDPpNtNMVtPpJpRmVMPfmtVZR
+mmqDWjhcqhwvDDdTsSGGCbQGSBBLTGGl
+wthtwrBQhhSrqJJVLMRPPtJLPF
+vbmbZqfqgsfHmcllmLLJNLJMNFJNNvPGJn
+jHlDscllClCCgbZzhWqBzBQzprWCqS
+DwpDlwDwllhJwbDFNDwFPhDnQnZZzVVnnBrtNznzSSzZrr
+MHPfWRTgWzTQmSTTZt
+GdPjHLRMCfcGvwqDGbFq
+NGdNpDPdNGLppLpwSNFFFDLwnnZbMnrHlHZQcHbcnHQcPcQM
+jBgBsjssgjWJVGhBfhvJVnMlbnZQVrrrlHCcCZrl
+sRBgvRffhhtvtBgvjgttWBJTLmFLLwdwzFdqLDDDqFGdLFTd
+RBzRGRGBgnrPJrRGGWWbDggZTSTVZVFFSVZZdw
+tfmLhjfshNNsqpppfjHdwVdQZbVbQFVVTmSVDV
+jvqtwHqCNLNsNhNfjssLCzGJWcBRJRBCBBBrrWnGrG
+cGDBdNFdNdDStNtGdGQGscDMvZjjZWMvMLjsjjLZjLsJLv
+fbRnRzHVPClfRlbbmfHRlPvZvMLpqjvZJqZMpzMpZjBZ
+gfbfBgCHCPVNhNGgTtFDcF
+ljjvLZvvllFnlLJLJjLWFQrVssFpsGMFpNMGsr
+qbHSqHTcHChqCmTSRqqBVpVdBQsVQQGHdMprWV
+DbtcCqRhhTRmDnPMlLgfgztlZZ
+QtMQzPZcbtGgTtLvtf
+HwcDsdVVDnNSGLhwvffJvfTT
+CSsdSHNmSDHcCqqcrrzQcC
+nDNDfmMnmDJRNfJJdMDRBdwjcTtsSHvBTswTjwLtsCts
+QcbQrZZggGWVVWbZZjStswCSCCttGCwLvC
+ZgZgbzVglVbchVVrVhFWWpnnpNJmJMqDfMJnMRqNDDMD
+WMfNvsjWGjsqFjqTRRQVJztDzVmJHbft
+ZPhplcrLrmzQGzmz
+ZPddLPlcSclhZChndMvgTjjWNGWMGWBj
+nDLjMchghDcljfjffpfsqTmGCTGszGZVVzHV
+wdFJPFrQRwSNbjVQCTGsHZHmHCHs
+BRJJSddvdBrJwrBRNRFRSPRjvclLpWhpglgWpLplltnMgh
+BbVRzMcpbMNMHMTJmWdljdlJjT
+GtsqFnfvGSFqGfQvgnWWZlLlLjZWtWldPmlT
+sSsFqsqsGghwQQmfGRHbbVczbwwBpBpHcw
+BBFCBJCsGJBBgvgsvTlVhgNg
+ZnLdjRQddLRnZrlScHRVTTSHhRvg
+fnnjZLWdrnqdWrrPLddqVqBzGDJJFGCBDfJmbDzFMbmB
diff --git a/day03a/examples/test.txt b/day03a/examples/test.txt
new file mode 100644
index 0000000..f17e726
--- /dev/null
+++ b/day03a/examples/test.txt
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/day03a/src/main.rs b/day03a/src/main.rs
new file mode 100644
index 0000000..eafb25f
--- /dev/null
+++ b/day03a/src/main.rs
@@ -0,0 +1,105 @@
+/// --- 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?
+use clap::Parser;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::BufReader;
+use std::path::PathBuf;
+
+const FILEPATH: &'static str = "examples/input.txt";
+
+#[derive(Parser, Debug)]
+#[clap(author, version, about, long_about = None)]
+struct Cli {
+ #[clap(short, long, default_value = FILEPATH)]
+ file: PathBuf,
+}
+
+fn main() {
+ let args = Cli::parse();
+
+ let file = File::open(&args.file).unwrap();
+ let reader = BufReader::new(file);
+ let res = reader
+ .lines()
+ .map(|l| l.unwrap())
+ .inspect(|l| {
+ if l.len() % 2 != 0 {
+ panic!("odd number of items in rucksack")
+ }
+ })
+ .map(|l| {
+ let (l, r) = l.split_at(l.len() / 2);
+ (l.to_owned(), r.to_owned())
+ })
+ .map(|(lhs, rhs)| {
+ lhs.chars()
+ .filter(|l| rhs.contains(*l))
+ .map(|l| {
+ let b = l as u8;
+ if b > b'a' {
+ (b - b'a') as u16 + 1
+ } else {
+ (b - b'A') as u16 + 27
+ }
+ })
+ .next()
+ .unwrap()
+ })
+ .sum::<u16>();
+
+ println!(
+ "The sum of the priorities of the item that appear in both compartments of each rucksack is {}",
+ res
+ );
+}
diff --git a/day03b/Cargo.toml b/day03b/Cargo.toml
new file mode 100644
index 0000000..3b746b6
--- /dev/null
+++ b/day03b/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "day03b"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+clap = { version = "3.2.20", features = ["derive"] }
+itertools = "0.10.5"
diff --git a/day03b/examples/input.txt b/day03b/examples/input.txt
new file mode 100644
index 0000000..60251e4
--- /dev/null
+++ b/day03b/examples/input.txt
@@ -0,0 +1,300 @@
+BdbzzddChsWrRFbzBrszbhWMLNJHLLLLHZtSLglFNZHLJH
+nnfMwqpQTMffHlNNLllHnZSS
+cGpcMwfppfqcjcTCBBzWDsDbDrjzWz
+LhfjhcdjcGdhFfdGfdjdvwCCZMvvLvWwMLCLSwZC
+rDnsbmptPmlbQMCrQWQQBZQW
+gltgVPngDPbptPsbPzVgmDldfTdfczThjJJjfMcJdFHjjH
+dGlgDflTLLLrRLTLVdQLcQMnbvHbbFzNNvMbnHHn
+sZjWJJCSjWqfCqSjSmJSbFvCzBMBBzHncHNvMBHN
+twqqwpZwfrlwRwDGDR
+zCGGFTQMQrsNRNGZdR
+cLLQgPDpgcgmvPRHrwBdvrNZ
+glWpmJWQDcJpQnpjSmbhFtMnqFfCVTCFCFFM
+zNZWFNZBFrGTdBcZZBdJTrGrmgvppgDHwHmgVHCHCvCPDjzC
+qtqqPnLSfLwvjvvgvvqH
+MtbLLLQbRfPRfnbnnLMtnsbdBNsrGWNWcNcTBWZrrcrWcJ
+sZwstbbDVlHtbhcrhhZLrRpNQN
+jqGjjFjWnzWGgqWjJJNphnLMRhLhcrhcrSLN
+qCJzFJdvmHvbtpbb
+ZSRsvvQvZpsRQGJghClPCwGPChCP
+FVdMLDdtDRdDcBtmcVFntwgJJTlnNPwJnlTlwlTPgN
+VqttMWFmDbjbzrSWRQ
+TsDSBcwshdwSCrgRWZBvgGRG
+LPVJLqqJbbzpFqwpbvgGRmZPrmZgCvCCfr
+tzJlJzQllFLqtwHhjNSdtthjDhTN
+fsDLDDnwvnSdqLSsFSDfsLpbgVttPMpPNjMWVMNfpjgW
+jhHmBmlrTBBHRPVtMZbppNPPZB
+JmTTrTmjRTJqSQQSFqQw
+HPzZFgPFMCHJCcZMcDQGwpLqPLqppwhGvv
+BrWRqbqRsTSTqNddrVrthLQVwnpwphnvnDnGvGDn
+tSbBfsRbTfqjJqjCqm
+pCqrqzmqZzrmCCvCJwJPBRwJBWBmwWBJ
+VqbqbjFLFfSHnfctBwDdDFTwtRRTDF
+LVcnbjHLSqHnhbSGGppCMMZMphpNrQ
+PhTcTPsSPCMvvhhMRPttbNWfNsWFNfWWtpNw
+rdQrDbJBVVjrBVdLjHHHWNWwfHtzzNtFpZZptppg
+JJVGGdddjDjDJmdjGqqRSbPMTvcRlqnnMlvT
+SqGfTrBlSrrrfGGQvCnqZhZmPPhvJh
+LdVNwgsjdjHmjWwDsDpwsHWtnCnQQQQNnvCnbJZQbNbtZZ
+DjssDHLLVppDssdLspswFLVjzfFMTfSBcTRcrFSBzBTzmGzr
+JSJJqlldpJlcdVWMlgMJrcCjrhzHCwTjHrQzwTzZ
+bBvsGBGNFDNRFNFBRDPsDDHCChhhrZRQQzhjhCjTzWCr
+FvbLFGDDtWDFBnPGFDWGqJMgJpSdVStllttlppVS
+clpBdBQBsqGpQbVdqTTWRTSFgLLggffg
+NzvwmHvZtZZgbDSCLDmfmm
+jPJjthHzNwPvvjwjNzPzztZBlrccpbVGBQhlGBVlrpnpBs
+NmFFGlGmzCrNWHvFmFWCFvQPTdDDlbbdgJPtgbbdPDcc
+RwfBqLwZqffqnPbdDgVQDdtRbT
+hnptqLMMLwqjMMjzSzHmhvNNrvvhhz
+hqVrDdPdVDqjsDrjjqsfrrWlctvHJNLfvNcLHNNZRNZHvfZL
+CSnWQSGBBSnmBnTmSbQbNZZMJNJMccGNHLZNNvNv
+gFnmBmBnTCpwmBbgWVqjPsrsjplVrjlqPr
+vgVgJJCphzFjzbwljwww
+PWmfDgrPrPWlSWqSWlSZ
+rrTHQTGTPHDDHgPrcrcPmDPhdtGvnvNnttJCdJhtGVnpdM
+DDDhNgWNLWgDqDgtgtwSngjVSQdf
+cvFrcGmBrrrCdSfSJQ
+mBHzFFvFzmsBspsFsZqhqbWlWdPDlLHbqZ
+TLNpGpRzwGQLLQRTwdvWdWbdbgdBlblb
+FJDVzZzHfZHVzcHgnvHnvngvvc
+MzDVSmZPPrqhGmCqQqLR
+mqHWcBHVcgsbhhnTrrTg
+fWftGtfJpwJMSdFDLFSGDGFnnNrbrhTNsZnrhTswZZnnsb
+dSftppdSFStLDpQfLjWHQvWBmmqVjCqcVv
+frfNzgvzzzJwJqpRcP
+VdVSnGnHqhDDTdqhdLWmjMTmjMPjPmTsmsmjmR
+BdGLSWtBSWDtVqdSDVGqtSSHFZFZtQbZlZfNgFffrgNrvgrl
+jBVSjsJcLcqqjtgcmRFRNFFzFm
+CnHnWQQGGWnnCnfvCTmZRZgNtfZtNDZPtNDtzl
+mWWGGdmQQWwrHHMBBBhrBVqshBLBSL
+cLtFcllvrslGLcLHVzDZQzzpznWzQtQZ
+TmShfSSPJRRBBfSgmdfBJhDNVpGzVZpzQgZgbWzpnDGp
+BhJPfSqdhqJRdBdPqTJBChvrFlHvvCGCccHsMscvrHvv
+zfddZTpZLzLDfLtDCttdTfZPnlcPcnhjPDnlcjMchDPjnP
+MQsFvFHJsQvmNvvswljgbPbwlwjnmcch
+VFVqvqFQHqVJRVCBLpqTGMzCqtMZ
+PZdVgNdQQcdcZQtGhnHtBlvlvWTnbBHWWH
+CDJmzqFmMmLfqmzFwqfzfwMRvpRbTWBBWDnlnbnWnTNTnB
+zFfffjCqwLJCfrCFjCLCzCMsjSZjQNPhQGVSQQZhsGjGgd
+nbHntnqPQwTHwQVC
+BzfSZSpcBZpzpPhSBjRTCBWTTRWTTTWR
+pvZpzPzNfhddJGmmNnJb
+GwTgWlvbgTwMrbwTrlWvwtHBNtNvBhBtdZcShHDtNS
+PnndmnCmnJFnsmRdmFnnZDhRRScRQQHDtDNtcDQS
+CLffLsmqqpJljVdlpMpWlr
+dPCzBLTSLqmqdSCsmrTDVQjZfjfVVZnZhhhLGQ
+wwFpgvPJNwgPPwvZGnQhbZQQFfQZbf
+WvRwwJpHHgpNMNqdTdCdqrmHBPtm
+DbWwjSGFSFfwGfCwDSSPPjLhgrrLWRJRgggJphLzpJLq
+lQTnMHdcQBvlHMMZBcHHTrbzpdzgqrpLdqzzVRVRVV
+vlvlNlBQvBZTQBnHnQTTBBPwPNCCsfSFmbSFfmGPwFmj
+hGGQtbVjhRqlmqqrmDlpmw
+gPMZsMgdssCPPsvrgZcTZTPSnnLLnBWDwLmwWwBnmWSnWNWB
+TsvgMPdcgCfMdcsZJRQhVfVRVQFFQGtr
+NfpFTTpFNbpZMRFrJMMMCv
+dWJPngDWBtPVBdPVGHZzCGHZrrvZRSMSzv
+WDDDVDPlWnLBVgnsgJmQJNqThNmbjlqbbh
+vnznqvfrzzVzrvvnfVqztBtGbMCdGmCcdccJccCLCcpSSgcL
+RQsDsljDlhssWshHhlhsHTlLbgJLpmgbbcMSpSSbcSJgjd
+WswhhHWlRTsQDwWHTRhsvNVvwqzfVmNBtZNmnzzq
+cjcPfLlQtPsZQlfHZJqVSFdVwmSRRqSSddwDvF
+MgNbBgzgnwdPRFmSPn
+CMGbNNMhCMzzPzBpTNPGBclLcLfsptHQfQlZssLcLf
+slsdfpSlllpTVJJGgGDgHMdV
+wrBQrbQrhQcpbQrhLwRBrjVVgGGPgZMtZMVhgMPMGHPg
+QQwRnrwRbbRcmQmrjRnjpvNsNTNSlTmsTqCSvsNSWz
+GWNwppdHdpmzgPFPCRmlCBPB
+bSrJhJSsMhrJMDPRCPBlwVCtVSLV
+QbsbwqQZvrJhhQrhZZrhchTfnTWGNvWpNnjHGvGjNdGT
+NMZGmnMBWmwmNnGwHrHvHzfrvrVVVj
+pSbDRLgbpJDPpRZRQjjFqVhhDFjDVqfrzv
+sQQscLTZcsTpRsBnmlBcdCMBMtlc
+hwWslbGWbRvLZvcscZ
+gQnmmrNTmSnTfgwDwVwpJvJPJzLqLJTLLvRcZz
+mrmnSrDNNQSmmwdggrrDbHMGhtdtGhGlhtClMGhM
+qQdlGcvDQDQvDdmtPmmmlStbjSrm
+CpNhzWTCTRznBMvwtTjMrHtSvj
+nWzsfZCsBhNpZLgGdQDddvqd
+ggjTjJWDVVVRTwQcZWvchshWhs
+LmFfLfSmBtCttNLfCFBPFNBvvvhrcQdvsrsdSwdqcwrwSw
+CHttltmlPLMHRTgJQDgRDTMb
+RPJgCdhgPPSzvWDcCfGHDcvf
+HbrrwBspTwWDDnqbZjjD
+rQrFsrsstQMQHJdHQm
+GVwQVGBZBNQwsjdNcMMlgJNPgj
+SWFfSzTCSWFCSpgnJLSjpMdc
+FhTbvrzrMrDCVHsVsHGBtHwv
+FsqjjVzFVWFqRRWBssdpNSBHwJpHHJJdddSN
+lQgmhvbTcgTgfhTQhSCFCGJHSlwNtJdGHG
+vgZPbbfMhbTmchhjRFRnsDRPWVqzWz
+cvwfjjcJjqhctvSpCgCFVhrFCrpC
+mRsQmsMlNNzznWQlRnsMRQlSCpLNbpwSSSrwFLDFLLLgFp
+zznlnGlmRmMlPZnGQzMszMRfccTjcBJjtJtJjqTZtfwBTt
+PtCwCCVqbjNNqqvGssPmHGsHMfPH
+dcddcWFDJJJcLczhWQdcDScZvHZgpGfsvMfSmsggSvvnvM
+TTQmTDhdQQzdRwjBVrRwCwBbBr
+BnBsFHCrcnBrMBPSmMSCmrcFqnZLddLhdhdGLvqLqgqnLJJp
+WfjTlNVDTtjzNWTlVMWNlTwTJphdgpvJLGLdgghZvGLpwddq
+zVjbVblVDlNTlbzTzDjllDTzHmHCsmcMHcSBrCBbrHBcBPSC
+ddlcGQlCjQNGQmPLslZTlmTtfT
+MDzMwSwqpzpDRpWRJwgZhttrZmTPfZmrmtrMZZ
+JSqRBpJzwgDDpqDqvpBRdCjbCjQCFCbHvdGPjdHQ
+bwzPwGLZMsbJMPPLGLMQzbhhQRvWWtVqVhgCVtWWQDqt
+HddrHFnFNpVnVLhnvLRV
+NLdrFjHTBrrdjFSpFmNBmSfZMwZMJJfSffbwzwPbczbJ
+QTWSzTTLwTfwflSNJRdvGlRGcNgJBl
+FnmmqrqbBBgRbHGc
+MFZqrCVCqmZCprspFZmnnMsDfzWzDwSfjSwPQPTLhffwBLwj
+npfgFRTZRRnDZLdgRfRrrjcWzGpWGGGQrjjWpP
+vblVbvSShhVzHWjzzlrPWG
+bVwqvCBtShqBhCCtqhNqCJRTTBDFJJLnJgDRWFBnWg
+nHDNQvgvnNZHDnsGcjfNTrTfVrfL
+SRWFSBRLtSFqjTrVVcsVjTSG
+BdBbRttWBdbdWdbppmZlLmgwHvgQvgLZ
+PQRZlpDDptQSclBMGVBdhVFGBMpf
+nnrsTCWjLJsnsSMShhGJfwffwV
+vjzqsjqgSHbbtvHZ
+DgFmbdSDZbPgLbDDmFwZwgLSfccGcGvnvvngsGGnsGMNWsWs
+HqztHHhHVhHjhRRhJtCVBCfNprMWpcMMJfsvvMsGscpG
+tjVtBVTBtHHqCRqtzQwTPSNdSwPTTbPFDdml
+sbmBmHZbRRRmwBmsSjHzRjmSCNFLNLLQNQhFgtQLzNztlrff
+MpqPPDPVnGqrJpcqqJpMVlgtlLFLChCgChCCQgCtCD
+VdcVVJvdrVWHbwHWBSSBRb
+tPDVBzzNSNdDSQpMQMTQJMMQMN
+LqSWSmbsmfQTTGZMWGCW
+cLjLcbrjqmvfqLbfmqLwDBBzSHPzlwzcdBlnnP
+SbnHrGHSrrhHJBrrScDfcPDMfpPGcGcpDL
+QTpmpmmQWlZsTvVQDMgggFLgFcPf
+zsCNlltCslzlTNsNlShwdJCpSqdHrBhpwr
+JZmFrmLGjFZdDGrrVTvzmPVvRRVzwzzl
+WBnfMDBqMsgDBqpBvzwVlCwRTRRPpvlw
+WfghfttggfSnnqbDftfqSBBDQdHhZFFJrrHFjGJdGjFrjQLj
+rNLRjrlVlrFRJzlsjrVlRFGCmnMtftgCNDDgDmCfqNgPNM
+SpdBpdHbpHWhZqnCdtCGggqCPn
+QHHvvWwWhwVVQRscVzGl
+QffLtMQGMQfDMMwMTJwqWHvH
+nSSFznjFcfjTgVJTJjvT
+RrBpcfSNpRBcFshrCtQrDGLPQb
+GctcMldStGwPPbcLsQTV
+jhnzDgnHnnfPVwHQTTLTds
+gBgzDDhzvqdGGvrtdvtm
+PPwRWVTvRvPVLwRpMlzmbmsbHWjbbs
+dFTFCNfdjzjFjsMF
+SgdffSTrnnqCgdqgcNrfSZqVvVLRDPJZQwJBLPQPtLZwJJ
+HSzDQftHphTBHFhr
+WMmJsMJNLWNPmmsncjMJcjtvwggVvhFFFhjrVwrjrjppvT
+WWPsJJCWCtZZZRGC
+SfFZQDRLgpLlRgQRRRFWTsbhBhgTjbWBjhshgw
+tHVNGjtzzHvMMJJhrWJNrTrPbP
+jvVVvGCGtCmjHtdHzQQfDpSSlDRnFfQFmR
+ZBBPfVVPPrVmrWZJzNdPznbnbSzznP
+gvgpGqFFMgMcGgwLwGpcJNZSTZbdbdzNNSlqbTnn
+ssZLgsMLQvcFpVrhCsmtWHjrrW
+nFvhRnWWzBRPHQqcqqCqmFbd
+SJDJgVprLfDfbJmHmWWHQtJW
+wVsgWVSTgLjfSsVjVBRvRNwwGGRhNZhRMZ
+wTRrRBCTPTBPlgMqgHCqggHLgg
+dmDzpQpBdmWmWzzzDFzjGNMSWLSgLVGGLVNSLgSg
+JbFdmQQJpjpptQbdJJmDmdtnZhZRflTlnTrTlrhBwPPc
+jwSwssQbwbStlhRgtsVstn
+zPzFdFFZccPDgntzVHHgghRz
+vVVdfFmZPDMWZZBmGQbwJJGCLwwMwJCS
+PLLffLFqqNLwSffbnVzzRf
+lsmgTggChrgDtZsZVblMVJMznVnwMBnb
+hDZZTmZvhTgstvwNFdqpWQcqvP
+mmWwpwqtmmHTqHpprRZQPPZLZWSFRFRB
+gzcgscgbfvhRRNZQRRQPvr
+JsjhcshCfJgrrpttTCTplH
+TvNrvNrJfWWvtJLTHhvZZhQQwVGZZhbV
+mFCPmBMPlPsPPBsMFPszbHQJwwHHhbZVQVzjhGHZ
+qmlBsdCSmJBmsBBMnMMTDWDNcLrDprSNcWDNrW
+HSnHCVqTddFHSVqFqdStSQGQwRzQCzCRzGRRGNPQwz
+jhlBpgNvlfZjlfvmpgfgfBrMRRwMMPPLQMZRPMWMMZPQ
+hflfpgjfBfDcpchlpvndbHFDdHqSqNVqNVdn
+QBfhlVNfHSZHfVCVHSQfZfTCctdvdDTRtjDCtTRsjsvj
+brrWWqzFWzwWbswDchhTRtDhjT
+gbrFLnpzqrWPgqpLWrhnHGZlSfLfHfQBGVfHHNVG
+hcFmVScmQBVhtcvfHLfvHSnbHRLn
+lzQqlDqgpWPvJfRnlNJvww
+PjCCCPgDgqGzmMtCQstZmBFs
+GrnrHrmVVFMFhSSbSfhR
+zjTqLtBjjdWdWTLshMZMDbPNRMSSqSPNfD
+dTWjdtwWhjWTBzcnrpcwmQpCwcpw
+BgtVBsgVVJhgGsSGJbghJqbsjLfZmLjmmtfZndNNZFFZNLdm
+MHTlzlwHSvPvzMSPCTMQCNZdjjmnfQjdZfNLjF
+HMDTwPDpzrTzpScBghDbVqRBgRBJsR
+qjCsTmrrnnCmhcFrCjqmThRlbHGvJGvvvbRbbJRcQJRG
+fVBBTfMdSZLNZgPdgglGRdbtbtJRllJWJtWb
+TSZZSpNMPBLgpZLVgppBDFhzDmjrnzhjssFqDhzFnn
+MDtDMWmMQmdzmMMqvlGfRcjzgpcPPjczPl
+sZsHJWNJFJNbWFBhFBnnbVclbVVPglfcRggffGGpjl
+srHWLNZZJdSLSdvDMw
+BFqsPnsZcgnncggccqsqqpDPtDWPpPNTNSNThrWtSj
+dQbfQQJJdwdmFRbJLRJdMrfDWrjpDrrprhDDDDNWWD
+QGwdJmCFJZvGsvvncB
+GRRNSjrffGTSPrNTffSgcJTwWJZbbZvwvwtVwWVJZv
+CMcFsqmBQzMzshsBQBQvLWmJVwZtpJLJwJLvwt
+qBzChnQlzMcRSnnRRjHGGg
+dPPbPWNdTBbDpHPHpNsgzvFlglvHzvSFzCFF
+fntqhGhRMhnnnGGCVMRhCVlSjswFvvjzjSzvQVSgsl
+MMqqJJRCnMhZLCRhtPNrpZPDDWTDTrNBmD
+VjVGNTNlNchVjNGRWrSWWtZtRrzncR
+BTbbbwDmCDLTbDwfHmzZMmRrWtzPrZSZtrrz
+qDLLqvwLBsfBbBdQFQTJhqThVTQJ
+qBqPBGZflhrWznzZZdsnzv
+FmHRcCCsCDwDbjtzdjWbdz
+cTRwCCNHFNmwRgmFTNCFTJqqfqPJsPhPBlsrsfGf
+JTNhhNrCTcWpJJcpWw
+LLdLsfMsdStbtggLbnTpwfWDzpjvnnjzcz
+MqSZsgbMbGFbZtgTSZSFSLhhmHlBQlmrmrPHHCPPZPBr
+GgjjgpGvpJJtjgvPrJttsLjVwCsQsQNLsfLfMVCl
+RddqZqzcZdSWcHdcqQfQLMwVflfNQNMQ
+FncWTRcFlHWFmcFTgPJhGvDgpnnhhGtG
+ZGPFJsPQCbZCCbgz
+nrvrnGWTwwqTBRcpCRRg
+DnGWDldNmSLSMdMQ
+ScDmPPPmjmjjWgtdSmdmCnNqVQVVrNRTZTQTQDHHZGNH
+wbbMhLvMJpRwJQrJGHqQGrQHqr
+wzhspwpppswsMFLmtnzjdcmdPRWPtS
+fPlLTtBlTjDbWcTMJcncWqss
+LdvLrLpCRRQQmvhhVNpwRMWJZcFMZWJwJFFFwZsGcs
+prrRVpvvRVNmRvvzHjHPlzPLSffbbPHS
+bbCbzsQbBzbBFbFzFfJHfVJPfVPtzZttpm
+hwvrjDDwjcDcvdnNvwdnwwDPpNtNMVtPpJpRmVMPfmtVZR
+mmqDWjhcqhwvDDdTsSGGCbQGSBBLTGGl
+wthtwrBQhhSrqJJVLMRPPtJLPF
+vbmbZqfqgsfHmcllmLLJNLJMNFJNNvPGJn
+jHlDscllClCCgbZzhWqBzBQzprWCqS
+DwpDlwDwllhJwbDFNDwFPhDnQnZZzVVnnBrtNznzSSzZrr
+MHPfWRTgWzTQmSTTZt
+GdPjHLRMCfcGvwqDGbFq
+NGdNpDPdNGLppLpwSNFFFDLwnnZbMnrHlHZQcHbcnHQcPcQM
+jBgBsjssgjWJVGhBfhvJVnMlbnZQVrrrlHCcCZrl
+sRBgvRffhhtvtBgvjgttWBJTLmFLLwdwzFdqLDDDqFGdLFTd
+RBzRGRGBgnrPJrRGGWWbDggZTSTVZVFFSVZZdw
+tfmLhjfshNNsqpppfjHdwVdQZbVbQFVVTmSVDV
+jvqtwHqCNLNsNhNfjssLCzGJWcBRJRBCBBBrrWnGrG
+cGDBdNFdNdDStNtGdGQGscDMvZjjZWMvMLjsjjLZjLsJLv
+fbRnRzHVPClfRlbbmfHRlPvZvMLpqjvZJqZMpzMpZjBZ
+gfbfBgCHCPVNhNGgTtFDcF
+ljjvLZvvllFnlLJLJjLWFQrVssFpsGMFpNMGsr
+qbHSqHTcHChqCmTSRqqBVpVdBQsVQQGHdMprWV
+DbtcCqRhhTRmDnPMlLgfgztlZZ
+QtMQzPZcbtGgTtLvtf
+HwcDsdVVDnNSGLhwvffJvfTT
+CSsdSHNmSDHcCqqcrrzQcC
+nDNDfmMnmDJRNfJJdMDRBdwjcTtsSHvBTswTjwLtsCts
+QcbQrZZggGWVVWbZZjStswCSCCttGCwLvC
+ZgZgbzVglVbchVVrVhFWWpnnpNJmJMqDfMJnMRqNDDMD
+WMfNvsjWGjsqFjqTRRQVJztDzVmJHbft
+ZPhplcrLrmzQGzmz
+ZPddLPlcSclhZChndMvgTjjWNGWMGWBj
+nDLjMchghDcljfjffpfsqTmGCTGszGZVVzHV
+wdFJPFrQRwSNbjVQCTGsHZHmHCHs
+BRJJSddvdBrJwrBRNRFRSPRjvclLpWhpglgWpLplltnMgh
+BbVRzMcpbMNMHMTJmWdljdlJjT
+GtsqFnfvGSFqGfQvgnWWZlLlLjZWtWldPmlT
+sSsFqsqsGghwQQmfGRHbbVczbwwBpBpHcw
+BBFCBJCsGJBBgvgsvTlVhgNg
+ZnLdjRQddLRnZrlScHRVTTSHhRvg
+fnnjZLWdrnqdWrrPLddqVqBzGDJJFGCBDfJmbDzFMbmB
diff --git a/day03b/examples/test.txt b/day03b/examples/test.txt
new file mode 100644
index 0000000..f17e726
--- /dev/null
+++ b/day03b/examples/test.txt
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/day03b/src/main.rs b/day03b/src/main.rs
new file mode 100644
index 0000000..f309d5e
--- /dev/null
+++ b/day03b/src/main.rs
@@ -0,0 +1,94 @@
+/// --- 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?
+use clap::Parser;
+use itertools::Itertools;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::BufReader;
+use std::path::PathBuf;
+
+const FILEPATH: &'static str = "examples/input.txt";
+
+#[derive(Parser, Debug)]
+#[clap(author, version, about, long_about = None)]
+struct Cli {
+ #[clap(short, long, default_value = FILEPATH)]
+ file: PathBuf,
+}
+
+fn main() {
+ let args = Cli::parse();
+
+ let file = File::open(&args.file).unwrap();
+ let reader = BufReader::new(file);
+ let res = reader
+ .lines()
+ .map(|l| l.unwrap())
+ .chunks(3)
+ .into_iter()
+ .map(|iter| {
+ let (top, middle, bottom) = iter.collect_tuple::<(String, String, String)>().unwrap();
+ top.chars()
+ .filter(|t| middle.contains(*t) && bottom.contains(*t))
+ .map(|l| {
+ let b = l as u8;
+ if b > b'a' {
+ (b - b'a') as u16 + 1
+ } else {
+ (b - b'A') as u16 + 27
+ }
+ })
+ .next()
+ .unwrap()
+ })
+ .sum::<u16>();
+
+ println!(
+ "The sum of the priorities of the item that appear in both compartments of each rucksack is {}",
+ res
+ );
+}