summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2022-12-03 19:31:33 +0100
committerReiner Herrmann <reiner@reiner-h.de>2022-12-03 19:31:33 +0100
commitd8e5908367a9bf54f086405941bba90f3e3929c7 (patch)
tree877055f116827aaa687fcbef444d4ae9b5c487b2
parentf99af8a126c116dc89da21fa4219398d3ce7d6b8 (diff)
day3
-rw-r--r--inputs/day3300
-rw-r--r--src/bin/day3.rs70
2 files changed, 370 insertions, 0 deletions
diff --git a/inputs/day3 b/inputs/day3
new file mode 100644
index 0000000..9b16a3c
--- /dev/null
+++ b/inputs/day3
@@ -0,0 +1,300 @@
+WVHGHwddqSsNjsjwqVvdwZRCbcJcZTCcsZbLcJJsCZ
+hngprFFhFDFhrDpzzQDhtnBJJRJZbZvTcvbfRCJfBRcBJl
+DmptngtFwvvMmwmm
+HFddrJnLdqtHBMQBmmVm
+gbvNsbhsvQtmZTbQPT
+vDshDlczcDhcssscwzQwslLJrSJLpqrrzpnCrSfLSnqq
+pDGQDSpFDGzFDQSJqzDhjhQMTjTrwTstbTBTjTtLtbTMBT
+zgzVNHHgMwMLbLNB
+WRWPgdHCZccggJmJGzJmzGhGCD
+sVJNlhldShpdpnnwVnwCwtwggt
+WLFFcHWQLPPZQCgtnCgmbtbHwt
+MPLWzRMMcGgRrWNDpSSSfDflMlTd
+BBMZJcgBRjCZZzBpSvHQvbLvvHCQLQ
+VlVTFwDTVGnfWSQPtsDPbvrpDS
+wWdqhWlwGVfGwlfTVqFWfWWjzZZBJmMZMNdzZJMpjzNjgJ
+FBWFphQBmDmpmMSpDWVcVcvsPcRbrjPMcMsr
+HHtdnHnwNCHCTJRTPTzrbvVbcVRr
+lHqHwlnlqnGCNGGmWDvvZfpZvG
+mfVtmPtsccMmHcHCFfmhVmnpgZLbWPZqWnpqZbZWpgPW
+zzvwBrzdQDvpZJfQJZJpLf
+BrTBwRdNcfNmfStc
+sTlhFLfZTTLcfsLlLDZflvQvRNqRJFNvRMRNvQQRBQ
+CWcgwStWwCWWwvgNQvJBvQMQRB
+wptGzbzGWVGSCVVlVlLDcVVsfhLTlf
+HVnMVGwLLbsGnVsLnwLSBggMhjmgmgmhtmqhtgMhMj
+zrZzJRZfzZfrPCrFcWccPdTdHHlvdmlgTghCtmtTgq
+NFfcZWWzZrrHLBpBBGVGNG
+HqFhhCBCBLmwwCqJCHFvvFdcprrrSSrjRFRjpgrggb
+VGzWtQzGGQPVtlVNslVWsPdRpmcRrjpSzcrcbdSmSnSg
+WPPGllQMPGmTLvLJBCwM
+PvDWRSmTVvSvRhbZRpRpbjjjzM
+GBFGHLglHrrrLgGrttbMjpbcpcZJBsBp
+lrHgrrndgdNnlHGFQPMMmWPTvvWSCDQn
+mmhQShhmhQfzNfTTlShbHJrRtltltJJtHlRLLZ
+WscggNqwPWjcGcWWcpNcRJHHprZvZHrvtttZJpJr
+jGjgcMGCwPNsGDCcszBfhhQQQDnFnTVVBV
+mcGjrwzQcrZtQzZQDZcPssvPVVCPCVLwswwPBC
+NJbqHddNSgdPWvvsVHVLPs
+NqglNSlJFNSbSNdldNlNdNbTRFDrvRmQrQGtmDrvttQmmtDj
+zzcBPnHBjgHjWJvbJQTvScbwcQ
+qdspVCFqVqfFqLFCqtpTwtpTbSTbJpwBST
+FRLFRCNNqMfdWNmZPBPZrHmm
+VmtRRJmtrDrwhRcvPspltvgqtqsd
+WGQBZzMMBGBGbZTTWWCMNSgggqnPlsfbqndndccglffg
+CWQQZMFWdzMQdJJwJVFrwmmmRw
+rZsFfGfNhznzsjhzZfVjGVvVdvSTSJHSDDtcmmmttC
+wWpRBWlbWMWlQDvCcRSvJRSStm
+LPlwWqbgwqjjcFshNf
+lsppsGphmPrRQnvHdRpd
+qBgjLqMjgjTLPnzHPrPRLnzv
+gSMfNjNtttVbqBbtTSStjTqlhmlZDsDsbWZWFFFsGhlWPm
+sPDPDzrGzBsGRsbwrjtSVvthVfQtQw
+ClpgFZgNqMWCgqCpMNZqNWmNdtSwtljtVHQhtwfvdHtSdhSj
+FpNCJpNcpfCpgNWPGBLcbTGTzTzPnG
+mssNLCZqSqmNCHmrqHChJTjTjnRRnnqVnTTGngGTRn
+dbwptFwQbvdtcvpZDcDddgzGPjTGgpPTRpzzzgRzTn
+BwZdtZldDbrSsNrsrSHl
+MLnFWMRWpnpnLnLCmPGTqQsFzBttTQ
+SwNlDHNcddglSDBjrqmqGQqqmGtGGwszPP
+vdSlNcrvvvnBMbBR
+psZPRmTpRpgrlrDRBFgV
+jvCqNhwnjhGNqCMqVgFHWtgHBrtwHFrJ
+cGvbNcjvvhhjcvbQGcZdZSQpzdpmpPVpdZpd
+drTHDdlHzllZDTzTQRQLsPPSsBbSjQdL
+MfVVWmNvMnqNmVVpMMgfgMmvBFFfRRLQPPsPfsFLFCFRSFjR
+whMnNVnqWmlllHswJTZT
+ZSQTTLLlTsbmmDZlmNQSNFfPwHwqCjCCfjwFPwfwLr
+MctMJMBVttnhJcBBVctwRHjHRJwJwjFfqPfRwj
+vzqgqhBVzzTlZmmTlN
+WgvlHJFvljvdBmzcvcwpmchc
+TQqZsTZttLZbRZsLLMzzppBmNShCmBNTcNCN
+LPMZsMZLMQVgglFPhFHlFl
+qsBCPVPqVbwfnMQNmZJnqJgR
+hHdrvvLWtvtjWQnZJTMrmpTZgN
+DShSShLZdFGPGDPGsPsG
+qRBddRzFFqFqHnNnPSnnmmSpgpJm
+ssZDQMvvMwppNJWRDRpW
+MMvwlsRMcQBjcLqLBBqc
+ZGHpwFGvwpHrvfFTMtDfccMjntMntc
+RgSCLRLJRSRSQQqJmTDMPMTtsJjnclBjtj
+LVmmSSddLCwVHDbzDzZr
+psgWdsBjnnJjbZWQDDLNrDcrLVQjLM
+zPSCCHqCfqfmWNMcrVSLRM
+TPHzWPFTGztqTGgdJdsssvZgwb
+gcFgBChcClJjNCPb
+sWZdZdrSmWmSZRwSmsvPlsTtTtNMnnlvnJJv
+GSWrHZdGQpRrrSGmpWQmQfLfpVzDfghppzBVLBlBqg
+BFNqFzBNhqVwmTtsqVst
+dMwMwMfCMWbDtDvDssCC
+ldMwMSHHMMWJpRpPLLpBzPZjgnZPhN
+WczRJhcWggVBdzPPLnCjdvjm
+lSpSTpTSsCCmmntNdp
+wSFDCTwsGDqQqQVWWcJw
+RqPqhDGBhRDrrhBFmPmbgssZbwbgCbwsmZsQ
+nCtjMppjfTpjJJfVZwtzZtllLZwLss
+MHfpMWdHpSCSfnSTJWhDDFDFBGqDGvvDBDFd
+MCCGMCSHVGNTspVWQznddndg
+rttLtvRbrhLZrbcQdJnnQdfddsrggf
+BbRqltRtHsNNllNC
+ncFpcsLLdFmWlRmnllTR
+bMMVzVqMzjNVDblmRTPGlSmmPlqG
+gNDDJMVZNCbNJNDNQCbZCbscvBsdBvrRHfcpdQpfFFff
+VnWFbZvFbHWhFjZWVJZJLZFWTttpMCspQTTzQCHpgQMgztzT
+dGcfdNdGrlRlBDGNSllfBMspgzmTgtQQgztMtzpmcT
+lBNdqRsBRdfPNrLPFVVPVJPZZvhj
+TLWgggJzwjgWgjgGnnmQnzQfNNNQsm
+SpPbBlPBMlvFZpbbBmQGsmCJmCstsdNGBQ
+MhSHhZPrPbvSFrJPpPMSbMcLjjqTLHDRTDDTTLDLTqgH
+fprRRbbznFbcQVPDdQPdFV
+LTvmsLmcsHmvDvSZDZVVSS
+jWtmLccssJTLjHmLWWJwnwlBfwnBbllpCBnffbBr
+plPBWzbnFLPPtGqMMwlMGwmS
+ZQjDHjrQjdjVFwdMvCSfmwMqdt
+DDhhrRDjQghHJjhWBbgbTccbsTzpWF
+vgCbbwsTbWWWgwBWDGGDqtPGtMgGlFMH
+znrznJNhLSLphRRRDlFPMmpFPjjHtMFF
+llNcSQVSNcRbvCwwWcTdwZ
+qpnJbnRRnJhRFhFHRgQSzHlSRHCCCg
+fMBttBvsBjffvsQTtfGTWlCWsSgSmHCzZmLlHgzZ
+ffMdjrfdwjfwwnhJPFchhqwQ
+NCVSTCVCQCCRVDQSJsqFPsPNspFhhsgjPh
+btvtWtcWnpgmFhjmmt
+cfnffBfcWcrMdbvMQJDDrDTDVCpCDrGD
+fZNhBWFSlFQFjWQTTldHgCwvTvqqdr
+zznVzCznmHvnwgdH
+PMMbCGPMDPcLbJhFhWhBhRScQZBQ
+WQMrDWGHbSWHMNrTQRhghmgPZccmqDLwPqPg
+svCzfpdzzdsnslCsnPZcHZPlJcqZgmqPPc
+nntVpdpVsfjCHzvnsCzRTBrtWGbNNQSMbTNSRr
+SnpDQdBqGpDSBMfQGcMQBDJPNstvJcWNsPJCtJtNRWPC
+VrVHrhTHlPHTvvNtbhNRNswC
+TzlFHHmrVlgTlTGSzGqpdMGBPQBS
+zrCDnrDVCnCgnrHgGDnVVCZsNttQZmjtsmbMqGqsjbqj
+TlRRWPSwwFwbSwTTTpNQQqNjqZZlmMMQQt
+wvbwbRTLWdFFwvRBTbvTTRzrnznnJrDDCzBczBfHCJnz
+SvTdmLNNNdvTBmvmLvSvDpgczzjfgjggpcjcNPzD
+VJHQsJVlHpjjpzsjzP
+VRlJbJQrVbVHJJPMhBdnBRCSLZZZnvnLvv
+tMGcpGtMtLtsCGspLzNCBBmwCzQRzBBRWQ
+hdlHFllDdZgDbDDlDHTWWTnzBBBvzmNHzwRz
+FSddDlFRqDFqFSdPVqdhcfGMsVtVfLjrfGfjtMcs
+RGMWnBMWfCCMBHTDptJJgZStRPmSRD
+bqzFqjqcFLNLZZSmpSBgZZ
+rFrQNbNBlNcbrQlNQvvclMswTCTCnwrwHrWGsGCswn
+WLhJQddCQwRNCQNHczHNzMvZcZvcNc
+SlSpSlrpDqnbqDjlGjGGljTjMZZPPMMfVPgfHMMVgVvqfgcw
+SbGsDspbbnjTjBldCFmLwFCJLBmtJB
+TMDjMvMqMvDTzcmFCgrJCr
+ZZZJSZWVBHZWSSZQJhVhWnHJwczGGwGcCCFzwgmzcwFgwVzc
+pLHNQSnNJsMLRJds
+TsLZGwdsDFWHBZJFfZ
+mqhRvqrzJRbmzJBFfgHHgWgHrrlH
+JvvNhJmvtDdsNTwdLV
+wwnSVSmwtbstznwgbzzVMTNpTNWdlCSlSWTffWNCSN
+cFvccLGFGvvGHZflnNTpnZpZcB
+GPqGDhGGqrDhVRgbnbttPmgs
+rzSZJScLrcBLvjvsqMPZvjQl
+nnpDqgDqFTgwqHHvMHvvvTvPMM
+GnqCGpDqqVhccLmrmSmCRL
+tJSTmdfddDTDJCPmbQvQLHvqqqbrbvlP
+zWGsjcwwGGcVVjcGWcNjvNjQqrQtNFFQHHrF
+RZnRVsswRsGWcwVBZVtBRdDJgCffTgmgfnnCpfTfTM
+FnCrzhTrNPrMcnhMTnZZZNPwDPdbDmdDtwjdtjbmQwDt
+sBvWrpppvLBsLRVBfHSfbbQmbwSjStDSwSwS
+LVRRRJqqlHNlNTChrhMG
+WNsfsstMvtMvNNGPZwmZmqZPLWZcww
+rDCdDRCDFQjSVLcmZcDq
+bBBHqTgBbQlQRCQFbgqdhvshGvTJMnfTtnnThnsN
+VwWBTNQcVzDtrgfrtzzt
+LLbpShLGvlbCmLjpGSCSCpvFdrgdddcHtrtGgfqHcDHqrd
+pmvLmlpmjbLbpljJPBBcTBBQRZBBVJRZ
+cVTcVTNvvghNhvggPPgtCVSpSQmzCqZDRCmDZDZS
+dGJMWFsFMFWsnlzRlQzlzqpzlZzD
+HdLFssFMsJbnbFjqbhPgjNggcrhg
+LLVhQCTvRvmWlCppQfQQjPrwszNsfzNz
+BZSgncHgnJStJHJgntMWzGsrPqGwsfPfGPwwwZ
+bdBdJMBcShWCLbhWVC
+vjdpGNGwSNCTwwRbfnWgQMLjQWMnLQ
+DcmFPFtHmlcgpqWDnMbDLf
+FZJPtcprHtPPHplZHPZclwwGBSZSvSwCwvZzNdwvvw
+CdJLJCJPWPWcbtzJtqJzFrQvBhfjBBvjjvdjpFjr
+sBRgsZGDNSBBRGDwphrrrThpHpgHvhpQ
+DwDsGBDNwGmMNlMlMDSPmztJVCbVCCWqPqJLmW
+LSTMgDSRSMHbMDWLHSvDScwtCGqGrjGrcLftqVGtVC
+hzJPmlphCGrCwVrJ
+zhPNdNnQZBZBhZnNZSgMWMDbMHwWSDWNDH
+rcdvvcwvrHrMZBjHSZ
+sDtWblgnltsDFlgFqltCCVQTMTgSHVTfSQfSHj
+tDtRWFpFbWWWWNNDWsNqWvmzvhzhzGmzjjGvLwJmpc
+nFSSnnbhSfgLSSnVjdjfHMgfMzGzmqlNGGmTPlqqTzTNNzlT
+pBZsJJvccbBmlWGlNb
+cvsssvZwsDwrDdfFgnbDfVbgng
+mWRNWNCTdwdCwhCddbWWmhsZVgJQJBVBfsBsJQLQBLJb
+qFFlGzFtjjcqzHtFtlRfVfsZfQHVfBHQRHgf
+jqGjtcDnGnPzFRlzrnMdWrrCMMddNNWT
+MHWCjjGMcHhbhPDLphHQ
+nRVJrtgssdLgCppvLQbg
+RlVVZNVRJlsstldsBCNlczfjjSZmWTcmGmTSfmSm
+RTHqgTgMwgnGTRzqTHCGfdFdfhmBrJrdvbFJMhPB
+lNZNNNLttLWJBPBdZBFmdZ
+SppscpLVStclNPWtCczqnQQwHTTgCGwq
+hSHRCbZRSZhbRZBctnMVjwwtWtwh
+GrdFzQrDdJstjcWttwsF
+drPJLDPGPvDvzrJPQLdDHpZlwLgRmwCHLpwgSbff
+zMSSnCtCdSdCtdfMdHMdtVBDjhWDHBqbTVVBqhbDjr
+cPNhFFNRlNDlTBqjlTBG
+RvmvRpPNRgwgPvFwhmdCssmCzdMshMmL
+tttjgrpTwmCgCwgwrrlrHzbzqqFNzdJqqZnddJwNbh
+cQjMjPMBfcLBSjGQBndFnzNdNnhzzNGFbF
+sSQPLMfVPBVSfBMvVLSPfHCttDjCDRRtrVVglgpttD
+vdTvdpBvcTPdSSvCLrCCDLDCQGDl
+sRfnFgmFRMVsnqgRmqzmrrDBDwtHlLHtrLCDGL
+qRMVjJgRFnJfMssMsgZScPJpZbPbPPWhBZSp
+ZJgNJhGZglMZZFDTPSNqFSqTSb
+mwdvwpsjrcjBvpwFrvbHcDqbWHRWDSPWDHSR
+CsvpsLLjFzhlLGFZ
+sDNQrMrNfrlQjJRgGjbTllHG
+ZRhSnWFVSwBtFRBVvVgHgbzjgGTJnngmGmHC
+vWZLShhvZLVtSFSLqwVrQdqpcqMDddRNQMdsNP
+hQhSQbbwtHzShwhSQPbJRsLwRCjJmDCcvmqCcs
+FNdBTBTNMsRqqCjTjL
+GNdrdMBVFShhSLSGGL
+cZzcCmjjcvdzdWqgWTZgPZgZhh
+wSwVGSJFTffgJTNh
+FSVpVlBMShzbjzcpvp
+qqlblClRbnTvqTmRqlmnTwrdfdwFFNrngfddDBrNtr
+PcLcQLMVLGMzHLMchhLcjLFrrNrBfrfFNJtNgJDDBNzt
+sSjjGcGQscSVSMjHVMSVPSQsWmCmppZCmtCWbbWTlZTqTl
+qWlVJmDJHWJHVJlsdVTdhbFNNgFhwhhhFhwwZg
+npjnvQpStCQLvBpPnvtBtBpGSGbzbGDggGNbgwghzZNGGN
+jBvLtvjnrtMDmmDRTTrsWc
+pmwdwzJtFmmlpFsWwtstJPGgvNgCCLWCvPgNNPQCQv
+RfbfTRBnRGQvPNnncc
+ZTbPZSDSBfSBVSbbBRbbbtrFdtlFmVsswtFwzdpszw
+hVphQcmdcWWprWWhChFQBsfHjDTTBCHlSsTSBgSH
+vqBRqqzbqMZPMwSTDjJjlHDllgHZ
+PMnMLqtMnntQhWBccthB
+vqqvCSvHSSwqvqCddnvQFmNbVjbJVVmGNNVHNNlH
+pggrhzWgptWhZsmVlFmgNNVNbj
+RzpMLLhhphtzrRrSSbQTBQwSTDBwQM
+DSFQDlDFRddDHQHQtFlDVsVMTzrMCLSWZLZffSzLWrfCJz
+jjBBvpgmbppBPbMwBBBNbbZWZzzCCTzzZgzWcJccLzWz
+bvPwNwmpnBNhPmqpPvnwwNmtRQGQMdQDQlsGVVGhRlGFsl
+SfJJwDJgpGdSGJNSTwTVJDRbWWfLtCWCLtRLHWrtbWBf
+cQQPnFhjjQlczhqllhszhqsQRWnrbrHdHtbWrBWBbtvvHBrW
+qMqqqqzFFmPjmmsFjmzsmhjcDGSZTJgTdpZwZgwSZVpMTNVG
+czrcHMcMJtCCPnpFmH
+DwGGlvLljGmDRdwLdLjfhtFsssnFVpfttpptsnFPnp
+TlRTghTjwTDRTDlZZQgWMMrMJMSZmM
+BzdNzNdgNNPfgdNsdQdNvVMLLVQVMcCRCMRmvCGc
+zHpplwwZrZlqlWWrpZwqlHhLvqMCRDCGVmLcqGMVvCMmMD
+rWrjwWwHplZbwpZtHtJJbgfFTfsNnBbsfbSdTzgB
+jPRRppDLDGDTLLggMMjpLTGcrJWHsttJfwnWrMvrJnvnrNfJ
+blqbzBdzmhhbQWnsNHtJvfssfd
+lhFhzSzzSZVNSlVPgDPCPCGTRcGR
+cqWcNWffPftvsvfpqPtZsBzrbmbFddBmbcLbdDHbHz
+TJgljTnGgnLBTZbHdBFz
+JgSnJwSlgGJRwMtfPtvfwsZQZZtv
+hHhPbQPTwsdwdHqtgttjpNfjDt
+FFlCmSzRCCmlzzRGCFNvRpvjvtZNZqsRfNRg
+mVmsFMGFzJFBwQTMnMQndd
+QQVpQGcVdGmspHHLtbqfqfbt
+JvZTFDFzJzhFCWCZZDzWPBCJfLbnnwLqttnsHHNPwtbHLwjn
+DssTMWvvvGMcQGQGld
+sshRHZSZRbSZHhBFBMpMWpFgbbtb
+JfjTjmwwTPvfTNPTQlmFFFqqmFMBBqFgFt
+vDTvJffQTJjJvPvTNSHRzhCsShRRRDtZHz
+NFLsRDNNDNBDlgPPgBglQlzj
+HJhdZpfJzlWQjjHw
+ffJTppZZqTNlGnNsMG
+ZMrWcWwqqvPZMndGdqlnnDLnVT
+HpCsshCfpFfHHJDDSlSVQQGGflDQ
+zssNzRJFhjNHNNHpJRwbwMMzWWtZPcbBbwbG
+HlNHHLHsBDRpHLlsHRlJnMhfWZMRnvCCCnWhZj
+wtqSmQqttzSSQdPmmwZhChJjWJjPggCZCfZJ
+SSwtTbTQmbtdqmGTTcfqzDLHFsBLDGLNGrsBHFGrLB
+FFDvWznMWWMrPnPnWPgsmgQbhJRslHbwHwVVsVHjBsHb
+ZtSffffpdLqpSCLfCNqfLqLCjHjHbwhpBwJllHlRVQllphjj
+ZcNCtcGSctZScqfNGScLNcczPJFmzmDzGzWnrWFPFWDvrM
+DnTPspmTPsTCDQWRZzZzZRCRfCfHfh
+BNcqTBcFgbVchVJhVR
+dTwdrBrwTSPPWnnmSmsn
+pfbbDbHpNBFmQbpNNBSlLtlDStSdSPJLtLJR
+ZcszvwgVCZswFzVTRTlTlRLgRJSWJR
+jzZvVwFjcjjnwvzwZcjMpqMpbGQbQmhhHhmfHQmh
+hTbddhQCtdNmdtwtdhTBbCddRSWscczwcRSWLJzcFJzDsFsR
+NflgfPZPcgSLJcWD
+lPVNZMMMpZlZZvfrMvpbQHQhtbtqdTQHthrqhd
+JlWSStwhWJSRJpJvJBjTwTqcwTsDjsCTCB
+dqFzgFZGGQNVmTcCrjrzsBrB
+fdgLFQLnPdnqShRMPhlJMpWW
+TMPcsPDjdDhsDcDcTTTDvdvghBNFGGtmNrSrgSSBGNtNFg
+CVCbJqlRVVWWpRqRQZRWVWJZBtmSFGNmggGmtmmBFbrGMGMt
+JRqHVJVCRLZWTjMnfLTPcfLd
+TRTZFTTrghrZVhVWdWZpMmbzbdzBmtDpDDzmzB
+wcsSSsjfPfGPqQwqsQcfJJCtJGpppCBJzCbzJzCb
+sPjflcwljfjfvqNcTZTRhtVWrNrVLnrR
+rVLLsmwmCWTmsCTdwQrdTmqWDjDHjNGNPbjDBPNDNsZRDBjH
+cFcSvgJvfhfLnShtMJtPHRRvRbBBGBPNBHPbND
+hgLcgcLpJSMwzmrmzqQrmp
diff --git a/src/bin/day3.rs b/src/bin/day3.rs
new file mode 100644
index 0000000..3cc961d
--- /dev/null
+++ b/src/bin/day3.rs
@@ -0,0 +1,70 @@
+use std::collections::HashSet;
+
+static DAY: u8 = 3;
+
+fn main() {
+ let input = advent::read_lines(DAY);
+ println!("{DAY}a: {}", sum_priorities(&input));
+ println!("{DAY}b: {}", sum_badge_priorities(&input));
+}
+
+fn item_value(item: char) -> u32 {
+ if item.is_ascii_lowercase() {
+ item.to_digit(36).unwrap() - 9
+ } else if item.is_ascii_uppercase() {
+ item.to_digit(36).unwrap() + 17
+ } else {
+ panic!("unexpected common character: {}", item);
+ }
+}
+
+fn sum_priorities(input: &[String]) -> u32 {
+ let mut priorities = 0;
+
+ for line in input {
+ let (first, second) = line.split_at(line.len() / 2);
+ let first = first.chars().collect::<HashSet<_>>();
+ let second = second.chars().collect::<HashSet<_>>();
+ let common = first.intersection(&second).copied().collect::<Vec<_>>();
+ assert_eq!(common.len(), 1);
+ priorities += item_value(*common.first().unwrap());
+ }
+
+ priorities
+}
+
+fn sum_badge_priorities(input: &[String]) -> u32 {
+ let mut priorities = 0;
+
+ for group in input.chunks(3) {
+ let first = group[0].chars().collect::<HashSet<_>>();
+ let second = group[1].chars().collect::<HashSet<_>>();
+ let third = group[2].chars().collect::<HashSet<_>>();
+ let common = first.intersection(&second).copied().collect::<HashSet<_>>();
+ let common = common.intersection(&third).copied().collect::<Vec<_>>();
+ assert_eq!(common.len(), 1);
+ priorities += item_value(*common.first().unwrap());
+ }
+
+ priorities
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test() {
+ let input = [
+ "vJrwpWtwJgWrhcsFMMfFFhFp".to_string(),
+ "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(),
+ "PmmdzqPrVvPwwTWBwg".to_string(),
+ "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn".to_string(),
+ "ttgJtRGJQctTZtZT".to_string(),
+ "CrZsJsPPZsGzwwsLwLmpwMDw".to_string(),
+ ];
+
+ assert_eq!(sum_priorities(&input), 157);
+ assert_eq!(sum_badge_priorities(&input), 70);
+ }
+}