From acbac89af10a7c9cafb2bd6a900a42564aadfb88 Mon Sep 17 00:00:00 2001 From: zv0n Date: Sat, 3 Dec 2022 08:07:44 +0100 Subject: [PATCH] 03 --- 2022/03/Makefile | 16 +++ 2022/03/input | 300 +++++++++++++++++++++++++++++++++++++++++++++++ 2022/03/main.cpp | 85 ++++++++++++++ 3 files changed, 401 insertions(+) create mode 100644 2022/03/Makefile create mode 100644 2022/03/input create mode 100644 2022/03/main.cpp diff --git a/2022/03/Makefile b/2022/03/Makefile new file mode 100644 index 0000000..fe2d36d --- /dev/null +++ b/2022/03/Makefile @@ -0,0 +1,16 @@ +CXX ?= c++ +CXXFLAGS ?= -std=c++11 -Wall -Wextra -pedantic -O2 +PROJECT = rucksack + +all: ${PROJECT} + +${PROJECT}: main.cpp + ${CXX} ${CXXFLAGS} -o $@ $^ + +test: ${PROJECT} + ./${PROJECT} + +clean: + ${RM} *.o ${PROJECT} + +.PHONY: all clean test diff --git a/2022/03/input b/2022/03/input new file mode 100644 index 0000000..0b6d449 --- /dev/null +++ b/2022/03/input @@ -0,0 +1,300 @@ +VdzVHmNpdVmBBCpmQLTNfTtMhMJnhFhTTf +FgqsZbqDDFqRrhhJnsnLMTfhJG +bRRRPrRRwSwbDqgjvDZbRbQzpzmQVWCzzBdvQBFCzlWV +GcDdRdvhRssRhGDdShCRtqWjlQzqWgqzNfNjfQWWjt +mwwnnPFwmVrPmJmzfNzqCjQCbgVlgC +nPnHHLrHwmJTrCTJpThBscBSdSLGZvZBvRhZ +RVQQcVlcSRclfZCCCnMJJTSTnC +NdHwjdwjbBBZrrZrbJDZJJ +wmhjGGBGwwmjtjtdPlfRcpVQlhRppVJF +pplbNBPPrppllrFNbpvppSTcwqcWFhTTShhJDTchqd +RGzRfLjjmZmfmwLftTWhStStJWTdWmDm +nfsMjQssnpPvNnrPrw +SjjBgllzlQjBZvlBBgcFbgJHsMhJqbMHPggJbM +hRLRVDdRRWnJqnnHTqMCnH +GRfLddRRpVhNVrWSjwQQzSzcGSBQSc +qMwNqqBdQdnTVBBVVhMVnVFzTHPggTPjGRDzvPTjjmvPDj +sbSrWJpStrtPtRPttzmmDD +pfbJJcbsrcLpWLllsnFmcqcwQncnQQqVNQ +RBTWCMwCwdZThPZcZZ +pVmVpHLFFFHHVgVmvNmHSQNvddlPPzZJMPcdhclhjczLdZMP +vnnNnFStGMRDwWnn +fWDdJTpDJzdBBBdmDSbSRHRwPqbPbHgSbz +slQtQvNsMVvrrgPRgRglnhwWPH +sGMMQFrsjvNMfWmdpfFDFZBf +vnMRMWCMJwWWwwWPjmSdVmLdzvVbLrhL +HsNfDHQlZpNqfQzbLbrqhjLmVdjd +dfDZQsNpstHHHptZDDtZWgngtgBMPMMRwCPtBBGW +HwQwwbwFNWHwHBVFQFLQzRznZnSzcjjjpPbcPpSP +vTfTJsCmsftJZmTSSdPvzdjRSvPdjd +TrGtTJfmGDfDhrhJJJsqrZhDBFLHHLLQWFwwlWBVBBVwgLFD +FFTJRLccQgmTbSsbGm +PBPPqCvCwqwhQQVhQngmVmSgglmGnHbnmb +zqthvtQPBfCCzPwQPtwQzPwNLfNRFNLdLRLFRFFNLFdFdW +nszjQnsPwjznzCCrhJqvjqhmBv +tFWdHGWFGtctlNNpZBBhmqTrrbWqvTBT +dlFtcpHDVVVHFdNGHGpGfQgsPDzSMsQwwPwgLLBQ +TzQqTJGvnnSzqrWTnvfbbcflQcVltfcCMPVM +jFjNZFFJLpFwmBwblcpptcVtfbbVlR +jmmJdBBLNdGDWDDrdzqn +pzddqQmGgbqgGpbJmmdnLZDCRZnZvFlLRZLSlLRT +rVwchcBBMwVBHhHTZCTSGSCRTZlTDr +HtccPfjfBhMtVBGHWpNqJdJdpjNJppWz +WThTWWhtPbZRvvWbbvRTSRMjVRLLgFssgLpVsfSF +JdwrlJcCwfzdqwwjsjzpLMgVsMFgML +lQrwHNGJHClvTmfhBmPQmt +lbRLhcLRpLJzgdGddF +qvhwqDDCVtBDVhfMVGFnzGGzTBnGzGGgFg +VjCwCWCMtjVDtChvQhtffcSmHpNWrrcHZHHZpplWbp +DJVDVdvpmZdPgrCbgbgCJC +lzczcWwwznGhBgPSvTlCrNgqNC +wGzzQhzGGsBBGRBcQwGwnwjmmRHpRfmmMpppMjjHDvLL +HJjJQWjFmmWtFmJTMchghhDwNMhVMWML +SznPSRfRSSPdrrPSShbDVhbLPwcwGGwVNh +ddRfzdRrCrRsZDSnFjspvFvqFqFqTvJt +lflfjQfjvljfbfMLTTDCmHNLNVbL +HSJnRrrJZJssnGRrnsrcqqRnDCLBMhVCTLVLhVNVJBBBhhBm +SsrGGqqnSsWSnnqWHSrPfzftvFdvWlwfQgQwWvzz +nQlsGnFGwwqNJWmJJjpplt +HMTLPTRdvsTCCThDCZdLdLDNNpJBWJbjJMpBmbtNptBWmm +DLCzPzTzZDdLdGSGfSGrsnQGzr +LNPPLHNPHQNQSBFDWDPgggFv +hszfWCWJhrBMsSSBgvFD +GGZjfmJTjmZfrJrZrZJRGwNQnlLNHWjLVjlwdVNHpV +BdNVdTcGVclmTwrTnwPwrHCr +zttBWzfLsCggHPwDrf +szsWSMbWzzbqBbzJjtjsvMzzvdmdVpGllpcRNZZhmRpZcGGc +CjdbMmmmZFnzzgHlttGBVqtBGtsldG +LvPPWNcFSSRslWhBsllT +ppccvLPpcSNwLLwrDNNpLvwJHCMDmbCJbFzgmZZmFgbgnM +TTNRwZqhcTTjsNTTsmrJlvrmmmqqHSrlJH +fLQCCdtcfCDDVbVVQdFbQbdJHMHrJHrHnMllHdMHPrMdln +WfQLQWWDbwRTWcRssN +HQGQWHPDHNjMNQGNWNTWCvZllzqFZqzvvzhCtvFj +DfgwdgfcFpchztvt +sRggdwwVdgmnSTnnDBPBNWLn +WbCZCfTVTTJjSwGdWNDGGw +MMRqggMsqhlmlhrssHgRnRmRvdzdczvdNGNLzScGDrNzrLNc +lRqsnRhmqqQnQpgQMlgDqRfBTJVFbJZQtBCbZQJVZFFb +JnhQcCnmLDsmgmgr +bbMZppRFGGRPfBMMRGMZssTTrLlLfsLlVLdsLsdn +GZGSpPGMZtGGPFFRGBCwhvwjjcnJctvQcvHq +vvrPrHZMGJNRMnqn +BVChWWcDVWsBwCWwGrJNhRLJJnJtLqnq +cjDfcfpWWsfWccBsHgPgrPTdpZbbgggv +GshtVtVtjSCVtVvVGtlVvFZLMvLRZmHmZwbLwZdLdZmR +JWzNDQzjcgJgQBJgzgMwLLHZZcdPwRLwRdHZ +QWTppBWfDrrNBTTfffhFCpVSjnhCGsFtsqSl +nmbCnzHHNzCjCJHJNSCWHLBLrvBrrSGRBDhrDRLrGL +TVtPllwcgdmTRhLQTQhT +fdFtccFcpPmggfdfNzHzCMsbCnWnJs +fMgddvjgRRvjvjVJVdTlZGGtGnrlnqTccNjl +HHSFSWSmmpbBpZlGncrNGbNtrn +WDWBDDBDBDCwPBWBDWNQDgzvVvLRvsVLRwvwdJVLwL +ZSmmvcpsmcJmJvqgBZgZqqtCtZjl +WhDwhFSDgtBFjnFg +rTrSTLWTTHNMNwNrMVddwNNhsmJGQcRsRcJGsJzQJsrzPsPm +GBtLmPsCQqsGqgghZHDzzgLbFz +zjjVTzTlRjRJfznrvrfpnNhFSghbbNFgHrbHZbDHbH +vpfcTJVpcVlfcQPMPCGzCBsd +HMhZNffcPZfNMrzjjFdGcJDjvJ +VSBVVLlSQQmTVSWpSQzDrHzTTvDvFjFdGGzT +mQSplVHWbHLSgWQnShNwsZMZPfbsNCRNCt +MMqvDzLwZzlMqQfdGWPfgPffPglH +ShTcJshsrRdnrdfrrfHp +VVRtFhsCJVJVvwQqDdbDQd +dmnNMlFNvmvljnbpMWNDFQvfQJJGvfPCfHGgQQgcJg +bRVzLBSSTRBRBBrwTrVtRwCfcGHcsJgJgzgGsggHCzcC +ZbtVTTrrqrSSVwhqqwBRwFWMDFNdjdZpWjdDDppjMW +MTzqtbLtwFzJgbHgfbdWWH +VMNBjNVjvNfhhhhfNPhP +jmGMvlDZZnVMtzlwzqqCpwFt +PpzGspGmpPsFLrTnTLzzBg +QCWvfjfWjRPFZgrvqrBvTg +wwNRCNQQVNRWjNWfQbHCCClHGDGJdGhpdhtPGhltDlJD +dhbpGzhllzGlPvnzNcvtNVnc +gcFMsTJDMMwrZqfjjqvvfnPtqJ +sWRWTRFwrTgLDDFWgMsTlpSlpbSCdWWdcbmpChGd +QccdFFFcFbcQPQPHMgpPMp +NJlNSSMLDfJfmlSqHZRNpRqNBRPRPq +LlMmJfvDVVTJSmVMscsCFtvwcjWjrjCj +NVVMGWFSMRVGWSthwhTJWzcJCcJsTs +jqRLqlfRZcmjcCzT +rlRRrdrflpdvPbHpflfPlfDBgBMQpGVQMgpVDGMggBDV +VwRhccRsnQStRhtGQVQVsmjgDgqJdggDjqLDgJlLzmLl +BWFZpWHBNCBCNBzBNvWBpzHZqqlMqgNdlllDdqDgJDLlfDdd +pFbTrrrBzbzTtSwStQnnsrVn +DRfFbFqzbddfPFtsJnJRsnClJRsn +cgjgQgWvSLVQgmWWgWVjVSSSBTltThLnqJssnTCZsTThntZT +qjwpSrmWgcSrGMfdFDFdwHFd +RWjDDWDjDNjjgDtSRRgjcjzFpnzwdFbFNdbFbpnldwFF +vQfPfTQJbZdThTzL +PrBQJQsfQqrrbfmPqMBfJbggjRVgWjttsHRSgRctDjSs +NgqNWqqWWdnJdqpBNFtCmJGCDHttDGDsHsHm +BjvzhRLTrTBQhTMQRjRRcjPGtmDCZZDZSCmmMSSZmVmSSt +vQzRvRzQcPcvfQzRnddppFgnFfWwBFlb +nnPvfvgrtPDHgvvGTRRRPZQGpGCLLV +FlBsBdbllFdfWpbGMCVMZLVbZQ +lhchNcqFsJBlBszztvwHjvzgrzmzffgH +zZhdjTpJJpjmmpPZhvqnnZHqZcggvgMbgv +tFpFQFSFtBGlFNwFfNMnHfbHcnvcvcfvcqrM +GBFlNLSNVGVSSGtQSLLBBlNtphDdzpmmPmTPhRmdzdVCCDdR +rpRCCDLpmnCdJCjn +vMhSFvgsMGLmnmWMmm +wVqFFvwvPPHhFhhgHPwHshpqrDDzqlfRbpftRLblrllr +CRNDzdJCVDWzVgDjdjzRJzWRMTbHsMNZNbZMMbsfhTtMTLMB +wSlwQcSpqPpcqcqFSqpwslsTfZtLhtlthtBHtTMZ +SPGFGFFmpcPGDrWDmjDJVffR +dsmdtJthJphWqHRPnRRsvvnnfR +cDBMDDDlBZglDZTMDfzVvNRrvNPVHzRRTV +PGMCCDClBDDbbFqmmhqQdpWGmmWp +BJjcGhcvCnBdGHsmHSzZDzSDMHmRMQ +qLWPLVrTwWlwwwrfrFfGDNmDQRMbQMzzmmbQLNMM +rVWrFlGqlqwVwVGgWGphnvgBBsnvsjdBnCBnBg +sNNsfBsmcGmgNTcHHSpnTWHnpV +QlrhlrlMglhDQrdFblvFtMdnDWwSHDWWwnTSjLwVDSwwwT +QtdMvltZhbFlPPZbQtQthZQdqCsJJGzBqqCBmCNCqgRCBsfP +SZnQnnHRWRQRVjHnqlJTQPfdlqfJftqG +pDzmbDBFbBLvvzttfdlTTl +gsDLLpcmsSZVwlnRsV +LHsWjwjWqCLsqCHcLsjdLqcdbpMGZPPtBhthbZBpBhMllwPG +VFnVbbvJSfbgphSpGlhRBBSP +JrrTgmFgzvNbrmNnmnvzgTLjCQWDLDCsTjssjqcHLc +QmwwqTqsrdqNNqgtvnVDVcGNNtvv +WBFBpzzjSJBJzJbfntgPzVzcvPnzDf +HcpbHZJBFpjpcSZrZsdRQZrCwrwd +JqmLmbtTWThBTWvWGVSrrVDsSGSG +wwzRzNjNNbsPVPds +jfgQRZwpQclQfffHgpRpwpfTcqtLLqCbbFFFLmbmTTBnFB +fGpcccNNqcctqGMprvMPmbbzFSflSRzPBBlBbS +JCjnjTZTTGPSGmTFPb +ZWHhJjHLDVDgHLLDGjnhctsstwqctNwWqNwwQrtv +sDwQhcwhBDDwrhGsQnRBQHHMHHMNJMZFCFRbCRftMM +zjjlmjqfdTqlWdzTqmLzlzVjNCHJNHNFMFtbJNZgVNMMCCtN +vPTfLmPTLWBsPDnSscnS +ngznwDPPTzhPPDCTQnTTDQBQqHNNrHFVppbbjRFFqFhHqRqr +tZJtcGsGtLLcctRqVBbbqrspbHNq +BmZSvGBMdWPzMPgnnz +MpNWPVNWWZWVVNZHVcvJjgBjJMStMJSjjg +rzdCzrCTTLRCslvJDSjjdScgDm +RLhCQzqTCssThRQzRzwGQrrCFffbfWppNpWNWVcHqZbHpVPp +zQzCVWdSSjCdjpchWcGftflGZcgG +RwnJTJwmvFHTBFmtBccZZfBGMstllM +wwvvHRwqDnHFrmqnrSbQVVQfSbqQjbqjbQ +ttDftStSlftPgSHmJbFwnMnFwzbrLHMMzz +GqTBqhBqBvppBvMMTznrCbCnLwfr +RBjjpZZvvZqGcNhjjpNmDPfDcsgfDfgScsQQQg +rsSFccvBHppHPsvQrSHSprFjnbLGdbzLfbGLLtLjjzLzvl +JWWJhmwwTDTGtnzlhdbtLG +CWNqWRNCwnCJVppQFFFFNrgHBB +MSRVnMjnVRVnPlcsrtMtschgDl +NWHBwJBwBBQCHHqwWQGBNgdrFFtsthcqdltdDsqttq +CCTTGCNCCBfNJNNWbGGnvVzDSRfDRSZvLPSzRn +MpRfjRjWpZzzzRzZSpjzZjTCQcGdHLWNGqdBdcBWWBLccn +lrbrsPQDPQglDtwggcLCqnCdNNdHBLsqNd +blwbJggvgbwlvQbvtgwmvVwRfTzfMMjFVfSFjZjMTSTSzj +ttSGjHWVrwWrWWvhzvhmhDfR +qMBdNNsccQgfDRzRmqlhRl +gQJdfJPdQBsMggMjPrTCLjrGrCrtVT +tGFdlwDwGFdNtStghWWdQFSnTVfCfZhrfVTVCVprnRRhVn +cLsBPQJsQPmbmPHTnRRnHprCVfns +MjmvPqqQjPbQzjLwwDWDSlzSlGSgwl +NSCpFgfbscbZZZwrtgPZJT +zGCQlVGmmQGVqqJwGtHZGrPHHRTH +qQvVmvzmqCdhhjzCQLjljLQMnMDSFWcSfnMfpbfnNcFFbFDN +zFgqjQBmWNlWlfHrHdLc +wnbCpSSZZTJSJSnmdrtHfGtftlcpltpH +ZSwhVPPJgNVmNFzs +WNVJthVHRRfLqpqN +gdCGcCgJBCrgScRLzbjQQLfRRR +SCFdGSFvlhTJsnvW +FFZwFZZwRmFFhHtNLNLGRtsqjLMt +gbDnnrMbMCffMPbPLNjGNlcppNtspp +rgbzrzDrgVgnrBzFWMWmWBwHWHShSB +zjRVjDqzRjvSBnBGGsfsrFsV +fLccLLZpJMctwJWWWJWpJGCwFwsgnngFBPsCnnTBPT +LbJlZNWMtpMlHRNHzdfSDfdj +VGbbnJGSTsVTssTTnVVWMtfBBmvftRHfHBMJJfZp +ghqtrzgPrjdzQCjmZMHfRHZHBmQmmB +gltFtDqFVlTVWlTl +HqNqZDTvNvVTLPSTvzfrfHfdndffwnbdnwrH +MpSJlFcMJmcpFlmClcMcRnWbWtthrnfwnCGrrWfrwC +RjcJJmSFMRQpMRFjMNVvTZjNPPvLTBPBBB +MzClDtlzJzFzNGGm +bjcLRHlTBsFJGmRm +HcPSSfTSpLZLbSwtrtvMnlDCDPCl +gWWgQJCsVhgRLCWsdjpmcBHvfvrrnvCvBB +TqDtztqtStlbNTPtllqZpvmcFHjNjvjNvHvmrrmj +ztPPGZqTPSbJgchGgwRQgQ +wVrdtTqtCCvbNgbNTTDN +mhGzWhGzMGWGrRmbFLBHZRNHNvZvgB +hhGhShpnsSrqVCVSSj +HnlbmGnlHZHnlBcjgwfDVfwLsGLGLDgR +WhWMWTvQPWPLDMFRCDMsVD +QdzJQPSPZqJnJRnZ +TTjTjFBcRBGjwsDTBLmrCftfRVrrCftCVNRP +WnqbJWnnQJhSqVfVPfDnggfrVN +hSlDMllvhbQqllZlSWQdSQTBjsFHBjTwGdHBTBszLzcc +rNWqWDLZWcqFqLLLgQQJnndnQdNzzJVMzd +cPtsPvChtRsGswHPGbwcPcdVnpzvnmBmVvJBJdJVJdzn +PfRfRGtsHsSRftbbbbHhwCCsjZgSTgSZWDTcgDZjLqgqFWLq +BNzPnPJNNMwHJRhBGRWRdjFQddFlFjWd +npbZrgnLSCSrWFjjdlZGlcDF +gqtmmngSbmgHJqfqzNBHBJ +stgzttBPRRRdpSVVpdpS +WJFcLQmJZHcCFLJmcZLMfbpGSWMNpGftSSpMrb +mcvvQvHmtLCJmHZQHZHCDHJJnjqPjjPzwvwhnwPqTjPBzPnB +DDmbbPqgFSbSQPtPQJttrltJ +CRfcnZWmRRhJNVtsVnQlsp +fcBvWvWzcZWCzTTCTTvccFMBHGDdSwGFFbqwFSGSmF +tCRBPCPRjzsJszBmtjmCvSpHcppJpvZdHHHcHZJG +qbrlLnWlQDQDNvmHHHHcrZZvdm +nmnWnnWmgQsCFzFCRVCg +sHMHCDZfcwMcRcLMcZDCRCHMPdJqgjvVdvqgdgfdJbQgvWQb +FFhTzmzGrnmtjTBjBBprrmFtqGgQqvVdPbbgqQQWJvvWJQqV +TrNjrnFSlwNZNlNL +JQGdsdzSzsdFQFSdssnndNlZjNPTJZNljVjTPhVPhT +GgGLfRmHGLhNVjjNTLhV +HvGvwpbHHRwpBrvBgSSzSFndtzndCrsFMd +DptFshMrhDhDwmPPhwSNhmmS +RLdcdRvBjnvRVcvlcLbCcbCwwpGBwSmfZqqPPPPwzmfqZq +VlRLvVjCJLnlpvvRdllLcJJWDHgMMHDDHtWFFDDQgH +SsSdrndpDlCdLftd +VGPVJgmQrVGHHZfwLlfCTmfwlDlT +PcJHcGgcWWbJpjRrphRbFpRn +PdPSMHMLzPPSShBdffMMzMRHQQrpppcqTCQQpCccTGTRCnCQ +vsbWmFbmJmZFFsmsbfpGVrGnWrrpVpnnVcTV +JZslstfZNNSSPdlSMwlM +bLLzRzZLbRqJJrDGGVZdwssDvGQw +FCtNJlTFtmPfldSvDvQFVVsjSv +PmCPHBhhPpWLWgzgHJ +qwmwFHCgPgPPqPwMCrHHFBVVRBttVRRffVfmsjVNNB +WSvcSnvbSWbhcbjlQbvlSQhlfBGcspVVsVGfVscpzpNcpBtN +hJSLhlvlTjPFHMLCCq +bggDpTggncGVVWbQcG +sRvSwwwFBSpFzvRvMFZqmPmMVqmcmPPVqhqqWq +SRBBrFZZwrddBFRjlptnLgDnTggdtd +PPfMcZMflbMQcMllPVfTVMwjWWmZvpWWpWhhjjpdWWww +sDQNnzsnQgDNsFzFqtGjGmWWSpWrGhdpvphdSW +nNQNqLBHLqzDnHgnVJfPJPCRBbfCcJlT +fppppWsjcSDPjjDpGhgwbfTgHTCbHJwbHbTR +rLBdQnvMNMmFPbLqHqTqgLHCgL +nrFznvMNMQdttrBcScsDstWcPGtWSc +lclnRSDnGZtvSwnZDZzhLffqdsCNwTBCBBdNsd +mPjmjmrFFpmQjMJQjlNdlhCsCLsTlNLs +ggmrHHVVQVPJpWrgpWScRvzZzGGRnZvlgzZn +GjGJGQJGcMTVfFDQzNVQzP +mHqdbmmdnJqVzVhRVNzPbR +wStmHJsJsLZLjTvM +QssMbVGdMQjZPjwVwHVZPZClllvgSgvlTgwwSSCgSCtC +WmmFBmJrcFRBFrJJBFchzWCStgCTgvhvTlfsNqfTlvTv +sFzzssDLzrBPjDVVddHMQD +fztDZSGrNrlnbnPTgFFpln +jvvQMMcLcjJmQwHdJvjQJnnbTbRFRphnnpsWgmFRPR +vTLHHCQLHBBjJCSZrVCZtSfSfrft +gHfHffHLjwHrRjLrLRZVMnTdTBsNTBwTVBsBnN +DWPhqhhDhvSGvWPzSzMBQBQVMMBBmvssvQvQ +CDGbqCDbChSbWGrHcHRgbcVcfrLJ +frlTLmtllbbbdpJS +qFjhzjThjHTFGHTjqhhjMzBhVpVpdbBnSJQRpBnVVdbRRQJd +vjWPWjWPPPWgwmfCrNvTvZ diff --git a/2022/03/main.cpp b/2022/03/main.cpp new file mode 100644 index 0000000..efb3dfa --- /dev/null +++ b/2022/03/main.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include + +using Rucksack = std::pair, std::unordered_set>; +std::vector getRucksacks( std::ifstream &file ) { + std::vector ret{}; + std::string str; + while ( std::getline( file, str ) ) { + ret.emplace_back(); + for(size_t i = 0; i < str.length()/2; i++) { + ret.back().first.emplace(str[i]); + } + for(size_t i = str.length()/2; i < str.length(); i++) { + ret.back().second.emplace(str[i]); + } + } + return ret; +} + +size_t getItemPriority(char item) { + if(item <= 'Z') { + return item - 'A' + 27; + } + return item - 'a' + 1; +} + +size_t getPriorityPart1(const std::vector &rucksacks) { + size_t res = 0; + for(auto &rucksack : rucksacks) { + for(auto &item : rucksack.first) { + if(rucksack.second.find(item) != rucksack.second.end()) { + res += getItemPriority(item); + break; + } + } + } + return res; +} + +void findItemsInCommon(const std::unordered_set &a, const std::unordered_set &b, std::unordered_set &result) { + for(auto &item : a) { + if(b.find(item) != b.end()) { + result.emplace(item); + } + } +} + +size_t getPriorityPart2(const std::vector &rucksacks) { + size_t res = 0; + for(size_t group = 0; group < rucksacks.size(); group += 3) { + std::unordered_set possibilities{}; + findItemsInCommon(rucksacks[group].first, rucksacks[group+1].first, possibilities); + findItemsInCommon(rucksacks[group].first, rucksacks[group+1].second, possibilities); + findItemsInCommon(rucksacks[group].second, rucksacks[group+1].first, possibilities); + findItemsInCommon(rucksacks[group].second, rucksacks[group+1].second, possibilities); + std::unordered_set result{}; + findItemsInCommon(rucksacks[group+2].first, possibilities, result); + findItemsInCommon(rucksacks[group+2].first, possibilities, result); + findItemsInCommon(rucksacks[group+2].second, possibilities, result); + findItemsInCommon(rucksacks[group+2].second, possibilities, result); + if(result.size() != 1) { + std::cerr << "Something strange is afoot!" << std::endl; + for(auto &item : result) { + std::cerr << item << std::endl; + } + exit(1); + } + res += getItemPriority(*result.begin()); + } + return res; +} + +int main() { + std::ifstream input_file( "input" ); + auto rucksacks = getRucksacks( input_file ); + int part1 = getPriorityPart1(rucksacks); + std::cout << "Priority of item types that are in both compartmens is \033[91;1m" << part1 + << "\033[0m." << std::endl; + int part2 = getPriorityPart2(rucksacks); + std::cout << "Priority of all Elf groups is \033[91;1m" << part2 + << "\033[0m." << std::endl; +}