From f51e96b5d0e469d3085b2a17b2958fa52fed6d41 Mon Sep 17 00:00:00 2001 From: Jur van den Berg Date: Sat, 3 Dec 2022 14:28:24 +0100 Subject: [PATCH] day 3 --- Cargo.lock | 18 +++ Cargo.toml | 1 + inputs/day3.txt | 300 +++++++++++++++++++++++++++++++++++++++++++++ src/bin/day03_1.rs | 7 ++ src/bin/day03_2.rs | 7 ++ src/day03.rs | 68 ++++++++++ src/lib.rs | 3 + 7 files changed, 404 insertions(+) create mode 100644 inputs/day3.txt create mode 100644 src/bin/day03_1.rs create mode 100644 src/bin/day03_2.rs create mode 100644 src/day03.rs diff --git a/Cargo.lock b/Cargo.lock index d37200f..de51018 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,3 +5,21 @@ version = 3 [[package]] name = "aoc2022" version = "0.1.0" +dependencies = [ + "itertools", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] diff --git a/Cargo.toml b/Cargo.toml index c1cd145..8debe7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +itertools = "0.10.5" diff --git a/inputs/day3.txt b/inputs/day3.txt new file mode 100644 index 0000000..fd343d8 --- /dev/null +++ b/inputs/day3.txt @@ -0,0 +1,300 @@ +BzRmmzZHzVBzgVQmZLPtqqffPqWqJmPLlL +hpvvTDcrCjhpcrvcGGhfLHMlLtMCqflNlWPJlJ +hGjhncHhGnhbTHczBBZVVSbRwgSgRV +rWVQjPQQjGRWNSrWrPjcptwBpqqJBtJBBcZgMdtq +zzmmpzfTCFpTlMlJJwBgMlqMBt +TvLszpbhhTLmsnRQPDQGWDWRvQSR +zGzvLlGlQHLGBQZlhBWhdjRdmdWRcjPj +fTJNfTfNSRWPhjdjfj +pbsbVVnpSnbVTprnbqqrzvLLgQlGLPLHll +ZCCCsWvNvmsCsCmZLZmgMLRpQMhwQRpQRfphfprpTfpM +tlncPjzlndctbzcPPBcjwDphwrfGGDffbDRpDTGG +cdqnddwzqjNVWVLZZLZq +DTLbDbRrlQbwhhNrmmfwdt +zzMJMzjCjJJjvLjMPJpcgPpzfhHdfqWcqddwtwfqdttcNtdN +pJCzVpCvDZBLsVRQ +STzBBbJzRRBZBRTqCCsfZLtNNLClCsfh +jsQnnQjjHcvQFrcPwCmtLCNlvDfftfff +sGFscMQQMMpqzqbMbd +QlNDWGsjQjgQllWQsbtzqTJczTJcbFmmFJJP +MhLrhgLVndRmzJFzVqqJqP +pSLnMdwhwdRZRSwhLZwLhdGWQjlsgWjNQWWSvgBsWDlj +THjSRFSddTjdBTcPLcVVvVBw +GzWnWfndWfznDfsnsBsPVwVwPPLL +zNflzJWqqzQDdSStHNZNpFFtbj +FSzDmsFSFlDlBzqVjqHHjHHpVgHLbp +rTrTtTQQntRQnQJQgggHZttVgHLBLhZL +WTJJRRQCRRJTRdBCRdvRNDFSWFMPmDlPPSsNPSzS +WQldlMtMVQgVMQHnDGbHGGnRnQmD +rqcZPrCFjmHlbGjZ +zSScchqwchBzTzFzhhSlcCwNtdVWWJgsVdMtWNgNVWTJTd +lMZqjMWllrTTspjprWWSSwgWNSVNDmWGVwFwgN +cdCCdLHcnndHJnmCRntLBnRzDvFNtNDVzgSgwDgFNVzFVv +BRLcCCJCmJdcRhfjPPZphrlrPqlZ +GdGqcrrZGDrvDJJqJHcBvmFFgmFMMgMgBtMLTssLmF +NbPVPDlljPmTmsTj +VfQDhflCCRWdcrQwJvvnJv +RLcWgLCqqPQLcqZwzHgwmmrmmtgwTw +DhbhNrMpnJSDJwVTHmmTVnTTVj +lrsvblMDlcWcfQPQ +PVldlphHwGwJJGdjZZWsRbbsGsNWrWQbNbQR +SqcDvTmDLtfmSmtqppfqzTgTQBrRQsbCFWbNNFQFBBrRbLNb +MgtmTgtfpqVlnVddZMwV +BdmfmPBPSbSNdGSdvWrwcZrccZPPcZnH +jzzLsjsMRlQQVHwswvvZrCHrrT +VqhzVFzplFlpLwpMphLRQQVRmSqgbdGtNJBmNSmgGbtggSgt +DHVpNZjdZjFZWVFHpvFvzmlRzPnlfznFRz +lrTBTsBwwMbrrwLPPfwGmGzvRf +scrtMhMCtJBBBclbHdHttWZWDSqDSjHj +wzqsPmqsbsfqBwPMNRMMZcZmFFNtZM +CgCnhlvvLJgcRFNNBdCpWM +QnQrVgHSvVHjbjTGBbbTHb +HdrVrdqFDdZVmHgRmDRFHMnTdTssMGnLnPJLbPTbCs +SczlScjwcNzplNzQSSfjwQSrTGGsbTsnTCnGTMCMLMGGbN +wQlfjrhfhQFHqZhRZRtD +RsfJDGJvzPNcjpddSWJWMd +LLCbBCwCrCmVVnrmhQFmbVhdcdlWpjZzSpMdWSpcWczSBj +rrLCbTwnHTvzvNGT +wPhPhbCqqSCrtJDlqvlrJr +RVVZddLFRZZcQLvJJtzptlgPJp +TVQRZGVncFdTGWZdCNShHhfPNwwsWPwb +dzLVzPSgrgDDDCMSMLLPwFmdTTcsvmwNwjNsHcFF +nWBGntQfGNGBflWBBqlpRQGbWFvjwsbsFswbvTHjjbmHTc +tBNJBnGBflQnDPJrPhDgrPVg +VtWztWtqpqzWpWzqjNRjNpWTmrrmrSbnmJwSJwnMPrCSJVwM +sDHsBDhBdsBZGcHvLHDLhhCSnRSwCJMZrPbmnMbJSCSR +ccLRhgsLBdRsdHNTFFNNgqTglqzF +hztlmDhPhgPlPNNgmZMCbmwwQjcwjjwMjVCd +RSJRrRqnqQJFqvnTGrHCcHHCCHHbHHMcMvdM +qGJsnQTRsStsftPlhPNl +BFFBLPRCwsLwhlPlRmhcGGrbmmGjfNTTnp +VJMVpzgqggJnrjmjNcMjmT +VqdSZtQgZvtdzqHqHtVZdVQpCDWWFdwlRPDpWPPBCswlWD +fCWCsjPzcbzwRSzVTzhhDLqvdg +TmJtrNJrBLSLJqgS +ptNTQFHrZlnpFPwsWMbRjCpcjR +nJmQNCmbmlllmbClbfMLjMFqbGBsdLFq +ZcgTWcTnMqqMTBqF +tPgctSnPctZZgDWzZgQHwNmHlhlmzlQhlJlw +ZpTCwpffdslvgShCBhqhRz +FDMPnNFNmBPzvRPRBg +nNgMrnnDGjDmJMmnFdZTTsdsrZrslcwcQr +pTmczpCldcdDDnPttpvWSqbpJf +jgjRZMGHhGLgQrjvPWzPJgJvzStbbq +LGNLLNBBzcDFCBwwFC +nJTTqnrNvTzNMzzNfqrTPrJnwpwPpZpsHccZVsBRpcVHwpcp +bgDhgbghLWmFmStctVpZtBCVCCpfZp +LLSgLGSjggFGbSSbmMnrvqvzjfzTNrJrqM +RRpDmmPMTjwfGmJQgQ +WsNscdnvvdVZFVnnrZbjjflwljlbzfGFjQjq +NnLZsNnrrVVVcvdBLTPCPCRMwhPMBMPhCt +lbVvzngGJnVbJHpHtHNPpdSQvc +TsMBswFZsWMWBZMNwPtNNtRNHcNpSQ +CcZCTrZDsjZTsTsshWhrWrTnfgbLDfJzVVLVVlgfnzfVGV +JzTTRtJRZWmWjrMHCT +DDFGlLGcGlSSSLsFGBspPBmNMBHMghmWNmWjWCmWtH +nSSpnbsGlLDnpPsSSspFtVvffRQdVzqvvbqdfVQwRz +sMhzszlHHDsWbthHDqsbJjpLNtmjVJmVLLVLVLBp +nrTPrGwfPLdprzJzdL +wgPQcTGGzgccwCgnRwgRChFhlWSDqWWQMWhssSsMQl +NSNmwtpSpCpvMphCsr +PHcRGPLJMrsvzsqG +QHjbnRMcfbPbQZmlZgZlgBBQ +cPRPbhQjbQRdtPQdLqLHqzFZjCFCqLjC +mmfsnnwrfvwrfSNZFzHHLDCFNlLlqDlN +wsmrwswwGTffMrBnmQttJtcMZQQtPJPbZc +MvBPDDRRdnnvHPCHZLHZsFLL +rmJcbVqbcjWwWjQHLzTZFTHSzFrpsz +cmwllVqqGJbVVVmmqbQcmgRnRvGhGfgDRDZBBBvRdd +nMvMhMnvhnbTZWSSZgHmGJDFmmNDzBmbNmdGBN +rCsPLRCssRjrLLsrLlwRVrcNJQfDQfdBmmfNBGJNzmDPfB +CRjCpLltgtJgJJWq +jshCzJpjzTPpmCWvSlpfwHfSWglf +LQMMNMnHtDtLVRvwwgRWlldgWD +qHVrQNHVMFQtrrBBQMBcrrZsZbzCZhbbJZJsmmsmFPTC +JZQZnsQNMqTngZqJBVfBfPPVBNrwvfPw +SSmDstFjpDpCszDjcLLhrPVlGlrGGVBwrvwVPt +FSssFcLjFjbmFFCzjLcFLRDnMJnTHRnZZTdWqZZWnMnRnZ +GbHRHpldwGMpWhHpCMBlCbRdVSLhnqJLSrDPLPPLPDqVDrhh +gvjWWQvgZFtQFFNqLnVnDnSJzzztDD +ZccccfTsffHdWWdRWwsw +ClCtbHMlnnPPlszV +gSDWSLgWQWQJJNWqgtQjPsnfcdVcLVdVdzfzVzff +WQgqtFQgDgQSFqJhqhSJvNDRrZMZHwHMCbZhTpZbGHMTMG +pZJZlCQtHFhPfdNfCh +zcmLSVczwcMcLDNFHdLPhPWH +szvVVnBmnTGQtHTQ +RVVCNDlNGzlGZqHGHWqWhGqQwH +ZFLFTmpLvvmSqsbb +TrfpBfJpJMlnnNfNZD +qHHlDClHhltMqQsHDhHslGznwdTnzzwDGSdfnwGnwG +mZRNcNcLLPNPBFFbbPmLmbZFSCVfJJTVndVfSwnRzznfTwCS +CcCWFbbBLCWtgWgHjghqvv +TjbzlnlFmfqCFFVVCRWr +PhMcLpPDtMLpwPDvLPJbMhSgVCGqggVqQgCqCgCgSWvv +btbZbNZhJDJJhDtwtsTTTmBzzBBmlNlmHj +FqhjWtqlqmmsnFPTCvMCQMTTCjQd +pfffRfLpgrgGgzrNVzzpGVzRCdMCPJbwwcVMbQPCJVMVdbww +DGGDZRGrHggzSsFQnnWShmtH +vtHVVMMrvVMVrSHvLgvlHcZFCnRCZcccZtRRZfJFCJ +rdDjGsdTQDcNZfdncCRR +rBDsTwBbjbmbbQswswPhqVmmSvpVhlvvqMhHhh +vGBLrqMNvqSLBvvrNbllLHfwStWWtFttccjtRtjtcj +MhCDJmhMDzmcRRcjzWfztH +ZQDmDhVVCQbBVdVNMvvv +ptCtCzhWPWptnhVzzpGZbZTjTjVjFGjVFgVl +fQswRRffmRqZlgrqqFjjSgGg +HwsQDNNsDsmRLLHmffsfvHptBnhtzCvhWpZWBdhnMdCh +RlHzzTqczBPfbnvcpB +wVtNwpSZstppwwMsZhsdnLvnbtBBmbnLFFdnmF +WNQJMVWsZWwGJWhhSNrQzlgHrDCgQRHpCHrl +RrZWpJZRrZpdTGstlchLGGlLMd +NqjDPCQPnQCSvtMzSLhhjM +nQVQDDDDfwBwNCVCNVFNpWpgJgrRTmLTmTmgRTWF +SHMcrMHpcjGcjSrMMbvSvvSvwFTLJwJNtFGFWJNtDLFTLfWN +zqRnPfzQCRzqsmRPzznhszzLtLwQwwFTgWWLDLgWFTwTNQ +qVPZmRZhsCZPhZlRCqRRRCbfpccMBjvMVjdHjjMjSvdf +VVQdHwBZLVltlddtBczhrzvGcWWFRwgsFG +TDTTTqqTSSqjqnmTmPqPPmTmGhRszvsrzsjRsccgzrRzgWGF +DpJPqpWqHbZpllpt +cCSCFsnnZFnscDtNdJFJtJtdmb +VgBqBsqRrHtNdzmNrt +BGLLVVjRBsqPBfsGwPsMfSSZCSfTZTZQpSphfS +plCHCHlgglHHGpNbtngNrDvBDpfQDBQfZDfWZVrr +mTmMLhRfwhsLPQvQZDMZQBQWMB +cwsssmqRTFFfFgtbCtGl +LQPPrCPnMZwqtRMn +cWTSlJWlcplJdDTdGdpDlGcGgqmtwwZtqRrNRRmRdNZqmgNq +GSJcJSjsjTpsvWGWBHLLvVVBBBrFrzVz +NVPCSPMNDSNFVSWCsJJJmpGmZZGLLcpZLHGGtsHt +fwzlBBqghqvzqqlDrHbpHjZHmGZbLZrHLb +dnBgnDqQvwRnSnnFMFMP +BCbPsFFwCRHmDSBmWnvDDj +phhZVzdpVfQZphhZpRhSVnjmrcvvnrWtDrvWDS +TfQJMfLphMhJdfdzpQJRTPbwHHNlgbGwsTGgCP +ttWLlnnvnNnBBtlTqWlpvpndQdZsQQFssFDdsRFdVdRNFQ +jSgrScrbGZSGrrCGsFVMssFsPPFcDDMV +bzSmJbfCZCbzLwllflwqtvvw +zmFTJwFLPmzLztmjDzTJwfNrdFNrFppBSNRGNGdbrpBR +gqlhWQgsZMsvqMlMMvsvqsNlLbcdppbrRpdbbcSrrbbr +vssCgVgCsggZQZCgsnsqWgWvfJPDLwffwTPPmzTnjTPmPmwJ +SpcRTPQLBLWpNNzjmmwwwRrR +tGlfvGhfnbDlbqlChnfFMrwsmwNssTMHMHjFwv +ZlhtCtffCdWcZWZVVT +jTTCcWHWJNgCGTzTmnzrmnGn +BwRRbFvtvvQmJJFMpMJr +ZBBwLvqbBZsRsbVsZSqbcZdJjHHjhfPCJfJfHhgc +VrnDSvvrLrfTdTLGfdRp +zcJzmcFcHGfdGmWTVd +tHsMhwPVctccHFHFcbSDbbPjnNbBnbvBQB +QttWQwLTnLnWTtnffnLQSBFVjNvBjBFNgMdCsVWsjv +pDqcmmRPHqgVBddjvN +DcclzbcbPbJLnNTfnw +plRcpsZDGlGZvWvMCNcLtttq +SrfrwSjSVrSjwbmSrHzmHJCQQPQzqttNNQJMzJtqMW +wSHVnfHfWwwHWFVfSnfgmmRsslFZZDBBGZsZsDTdGRTp +qSFQSgQNgQBrBHHcrW +VTmjVJLTwlTmwTVmsMJMVlJmPvcbvvbCBbGBPjGvBbBGWcbb +DnJTZwmnZRhnpqNdWt +dTVHjZLLZDVCfVHtLDDjQbscjWbSJMJPjsbWWb +FnqrnmzzFllmsWwtsFtQMMFc +lmqzzzngGmlNNBqGllzlBNRvptHHpTCHpDLpgDZdgvHvDD +sdRZQbCfZTSTdlfTZCffccWPHPPcPPwLwctRnLWn +BBJDzFVgCDrCJrqDJJhqJVVMLPHwcctFwcWHHGLcwGwGHnWc +ghpJgqqjCZbQdZpd +tbcpzbHSszcHBgqHGZgJJJhhww +jfvdvRTffQQrrFCRFTnGwJRqNRZVpJGZLZggLh +nQTjTnMndlTdQFMvnrClCnpzmzDtbbmBbcPSzzlmmtzP +BqBqTCSTcqHsJHHM +WWPGVPLtzVgWtjWPGzVjzVGcbDhPsRbDcsbJwNRswRDRss +VQfWjfLFGWLjdFfVzTZZpJTpnmlTrSQlBl +jLNsZjqSHCsGdsmpsm +MvnVFzWMwMVWzfnVDwfBMfnnrCtdtPmPlRrdrJCJrtPDrrPD +zznfFWwMfMfFMwVTMQFnQjhjgjSZhCNbLSTcHHgbbC +GGtssttVmvnnGNMQrrVzgwVrCWMz +FdhfhhcCDhHLfzclZMcrwcQMZM +HHqqCBhHSSpdmjGqmGjtjtjj +bbQLtGMQQtQRQtrDtGprrrbCqwplZhhqSqmdwvdzqqqhSmpS +FsJjJBfnsJcFcFfjVPjWBzldqhqnlZZZzzhmnSvSnm +JPcFfFWjFHJVVsVjPVscsDlLNRHGDbLRMRCDNrCGbG +JdMdlMRJnTwdvcjv +CDLHbNSzzLFgHvnTjrswBNBTNT +QgbvzSFQmZQPQQRW +NTBrNzrpjjjCwGbB +FRbQlcvFvcRQQlRsMlRRRZjwCqMwjmjwJZdLJmjCZC +cVPPQcvlWDNhrbPz +VdbVtbbZJdtJVVdDVZmTLqqTSQvNLjjDShhvSG +zplpnBnFpnrrlghGNpLNqHvqvjNj +cWncllnlPFWzcMwtWWtsVLVRmJWCds +ShLSTnZnTSttTSbLQdfSZTMwcDHwwcHnJvDHnlnlclMM +NmPMsssRrVwjDclHJwwR +gNNMWGzNmqGdtfZTbGGb +sWNNlRHnmJtmntJt +brbbBTbbFbCbqqGgBTrCfmQVVZfSSQQSVtJZSrVZ +bbFqvbDvvGGLGbCCtBGDLbLlcPNHhhccPNcdPPchlsdR +DCFvDvnCnNfMBmMMslDZML +SQQQJHwpSgJSJHQWSWHqJWWbmcBBBLLTsmhhTcZbMhmlshcb +RJRgpJHssgwSQHRqsQPGGjjtNCrrFvvnFjjPrP +mThmsgjzTPjMpcvtWP +GNNBVqVGNZbbNbNqqZQVNVNbWcpdtMCcpCtMWCdCPpQccmpp +VSmNrmmbBfZVlsrssrLTRhRhTn +TdmCvLDCpTRNTdFbbWnnSWCfhjbbzn +GrrMsPVGcQHBGMbhjjSgWfHHDbjb +BPBVqqrQPsQqwrrmmmJdRLDDqFRplT +fpDDJljDlCfDTjprjrfbddWthCSCtdPPQFhSSSWW +HsLZgMGbgBBsNzMvGbdVtVQzFRQSthhFPdtP +sMBmGBmbNvLHGMnrDppTcJmcjpqljf +ptSpSJQqpbNGGDDhcMWrlNHcZZWWls +zRLRRRjvvgjHMMsMpWpc +vmCPLCgwvwdnCzmvLbpTbVQqJJPbJPpTVq +TJCfhhJVFffrJJQQllNWcvWhwvWD +GPSGjjpLslBbpLpLqqqPDvdwvwvNzQWGzDDNdzGN +msbRjbpPqsRpHnlZrmJlnVHT +GGfFsCCTvGDsfTTrhsCMMzptZJMdpdgtrpdMcV +LBlwBHPSqjwwlVggHpnMZcVHMt +ZlZZlBbRPGGTGfmRsD +CtCjbVvzQQZTWVdd +MlSqWlmsmGBSHJHTDFHZ +pcqsmsplwsqclwRtRWgtRnPPvb +zCrzCrsdjrhGDCFqGDjRRPtpWfQQcpfQZcCZPp +VSVwVMgLHHLTwMDTMMVnbWPRZQRcRQPptWnpbZcb +MNBBBlSMvLVwTlVTFdNdhNhFsqsGDrzm +rBLWTwTThWwVVDTwHBsZZWppvpGtpptppmRvFFFMFMfL +qPPNCCbqcbcNqbqQjjJQqzjRpptmlpMGmMlJtftmtFHpMt +QnCgzzQbbQqPcPQnncbdQdnVTwDssZgrShBTVgZZsBSDHT +PFGJFqnfqmPgFJQPWdbLdpDRhbphWjDm +rclNHvcrzCNwrWRprjdMMMph +wsZHwZNvRRQsQqBV +LqlGCPlPLTCPqqQlpqLlWfBfWgcHNRJRfWNsncGH +VVtdwVtDDdVmhrdwSBmjbdzNHgfgJnNnsSnHsNffHgRsgR +wVzhbjmDbDrwjdbztFDDthMCvqPppZQBQLZQTqTvFTvZ +BnQnQFwRmRwmwdBSFDFnmSDVLCJTCTppVVmGLVTCLcgVpC +ZlWvhvZjNrbNvqjNhlfPfqjCGHrsspggTpVLpsJCpcJVgg +vPzNvqjWhqFzGSnRGMDG +wZnMZzzZZchDRtVsqtCtwV +WmWpWWmPPWrmrmBmWrTlTFPNVqVCRSDCQHcqVTtTqsSDSTSD +PrppdFlWWlfrWmpWFffrdcGjJJGggnnhZGdLLgGGndvz +FShHNmNhRhNJmBnQBQJrmP +VTgzDTjwfffwzDvwlcczzVSJbQlBQSWBWCnPJPbJWWbC +tzSVtzvSvGSRZqqFMNtpRR +hPZhGDZpnCGtDhznjmLmdJffdNzJ +glwsSrQwBvLdgLzdcj +QsRbHllzzlHwHlBszWlTBFbpDPMhbPDVGpGFpPtFPp +SRjStRDctgDSBzLvPvNrDhmPLr +QqTHGTPJmmHmhNmH +TGQZsTqFnQZCJTPsnJnZQMjVRBVtcVRSVRBlwccSCtBS +bbsNsvsvnNPTRRllbblLqhtQCqQSLCGGHSqHNC +wFpzFgqVzqVJWFDwqJDmSBBmHBHhShLQhCGSBCGH +MJVpFMqgwMqRRbZsMbZMrP +PPdDhvNDQdmgQPZmQVHHtHGGWVGbffWGvs +MMLCTRRLlLclTLRMRLCwMLHWVctbVVHWWWFfVjVGsFWW +MRSMMlpTJRqClBCRqBDnzqgQPnqgznZPZqbP +MrMNPNNpjvdprWtrpMsthqBfqlnfqcGhVBqFRcnqFG +QbDgSSQbgSDDmDVmlqSCRllRcFqnqfBl +QVJbVmwwDQbzVTgbppNJNMWNjNNPrdpM +WwJJNbtHfpLpVgZZPVFhZh +vmmqlDvRvRfqBSrlzmmMjRBhcVhQVZhVghCQQQQTcTrPTP +jSqMmqRzMDDjvqlBqsBMBmmwGNJwJnwLNfbGwddswnJtJH +RLgRmRggbvbzzPmmRNmzsQWFtSGNtwSNQnntFwnnCw +pDBrBHpHhlldphHBHhJVFSLnWWFJttCtQSttSS +hfHrpphHBppfTvmzgMmbLbgf diff --git a/src/bin/day03_1.rs b/src/bin/day03_1.rs new file mode 100644 index 0000000..ab7c32f --- /dev/null +++ b/src/bin/day03_1.rs @@ -0,0 +1,7 @@ +use aoc2022::day03::process_part_1; +use std::fs; + +fn main() { + let file = fs::read_to_string("./inputs/day3.txt").unwrap(); + println!("{}", process_part_1(&file)); +} diff --git a/src/bin/day03_2.rs b/src/bin/day03_2.rs new file mode 100644 index 0000000..3e61dc0 --- /dev/null +++ b/src/bin/day03_2.rs @@ -0,0 +1,7 @@ +use aoc2022::day03::process_part_2; +use std::fs; + +fn main() { + let file = fs::read_to_string("./inputs/day3.txt").unwrap(); + println!("{}", process_part_2(&file)); +} diff --git a/src/day03.rs b/src/day03.rs new file mode 100644 index 0000000..c19eb75 --- /dev/null +++ b/src/day03.rs @@ -0,0 +1,68 @@ +use itertools::Itertools; + +pub fn process_part_1(input: &str) -> u32 { + input + .lines() + .map(|line| { + let compartments = line.split_at(line.len() / 2); + let overlap = compartments + .0 + .chars() + .find(|ch| compartments.1.contains(*ch)) + .expect("There should be one overlapping item"); + + match overlap { + 'a'..='z' => 1 + overlap as u32 - 'a' as u32, + 'A'..='Z' => 27 + overlap as u32 - 'A' as u32, + _ => panic!("Invalid overlapping item"), + } + }) + .sum() +} + +pub fn process_part_2(input: &str) -> u32 { + let result = input + .lines() + .chunks(3) + .into_iter() + .map(|chunk| { + let lines: Vec<_> = chunk + .map(|l| l.chars().unique().collect::>()) + .collect(); + + let overlap = *lines[0] + .iter() + .find(|c| lines[1].contains(*c) && lines[2].contains(*c)) + .unwrap(); + + match overlap { + 'a'..='z' => 1 + overlap as u32 - 'a' as u32, + 'A'..='Z' => 27 + overlap as u32 - 'A' as u32, + _ => panic!("Invalid overlapping item"), + } + }) + .sum(); + return result; +} + +#[cfg(test)] +mod tests { + use super::*; + + const INPUT: &str = "vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw"; + + #[test] + fn day1() { + assert_eq!(process_part_1(INPUT), 157); + } + + #[test] + fn day2() { + assert_eq!(process_part_2(INPUT), 70); + } +} diff --git a/src/lib.rs b/src/lib.rs index 28326d5..2ec5ec5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,5 @@ +extern crate core; + pub mod day01; pub mod day02; +pub mod day03;