From 2f85311df38d46084e46f6c63eb897c6adc77190 Mon Sep 17 00:00:00 2001 From: Martin Potier Date: Wed, 14 Dec 2022 16:59:06 +0200 Subject: [PATCH] Overengineered Day3 --- adventofcode.cabal | 5 + executable/Main.hs | 8 ++ input/day3.txt | 300 +++++++++++++++++++++++++++++++++++++++++++++ package.yaml | 3 + src/AoC/Day3.hs | 65 ++++++++++ 5 files changed, 381 insertions(+) create mode 100644 input/day3.txt create mode 100644 src/AoC/Day3.hs diff --git a/adventofcode.cabal b/adventofcode.cabal index a50c85a..b4eeb80 100644 --- a/adventofcode.cabal +++ b/adventofcode.cabal @@ -14,6 +14,7 @@ library exposed-modules: AoC.Day1 AoC.Day2 + AoC.Day3 other-modules: Paths_adventofcode hs-source-dirs: @@ -22,6 +23,8 @@ library build-depends: attoparsec , base ==4.* + , extra + , split , text default-language: Haskell2010 @@ -36,5 +39,7 @@ executable adventofcode adventofcode , attoparsec , base ==4.* + , extra + , split , text default-language: Haskell2010 diff --git a/executable/Main.hs b/executable/Main.hs index 587311e..11ac532 100644 --- a/executable/Main.hs +++ b/executable/Main.hs @@ -2,6 +2,7 @@ import AoC.Day1 as Day1 import AoC.Day2 as Day2 +import AoC.Day3 as Day3 import qualified Data.Text.IO as T (readFile) @@ -17,3 +18,10 @@ main = do putStrLn $ show $ Day2.solveA input2 putStrLn $ show $ Day2.solveB "A Y\nB X\nC Z" putStrLn $ show $ Day2.solveB input2 + + input3 <- T.readFile "./input/day3.txt" + let demoInput3 = "vJrwpWtwJgWrhcsFMMfFFhFp\njqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL\nPmmdzqPrVvPwwTWBwg\nwMqvLMZHhHMvwLHjbvcjnnSBnvTQFn\nttgJtRGJQctTZtZT\nCrZsJsPPZsGzwwsLwLmpwMDw" + putStrLn $ show $ Day3.solveA demoInput3 + putStrLn $ show $ Day3.solveA input3 + putStrLn $ show $ Day3.solveB demoInput3 + putStrLn $ show $ Day3.solveB input3 diff --git a/input/day3.txt b/input/day3.txt new file mode 100644 index 0000000..fca63f0 --- /dev/null +++ b/input/day3.txt @@ -0,0 +1,300 @@ +qFdBBvtHHfvRlfvsqldvqjPpQmnQmjnjjjTRTLGRNG +ZCWhhCsJCzSJzSbzgsmPTGNNPPNGjgLTLjgn +WJZsbJMwJcszJcScwhVltFwBFBlqddvFdHDfqq +crtTsGTtqFThGQGCrsjTwdNJwpRdnJJwffRClpSf +PWVBPVHLvHHVgvZWBzmPpnfRSJJRQnSRflRPSNSl +gmzBzDgzmZQWLDLLgVmDrqGhsscrqDMGhcqtqcFr +HsbcdVrsbVbcLfPqqQsqqtPj +mMBFzZRnmFMRBDnDFBGZDGdDqLjtdQtPtgfPfttgtqgq +BZvZZdJMBFdJhSvhbhchcHll +GNRSqRfcNTpfGCcqjfzBpDQPWBzgDpQsPWzW +rrSdnVHlbMdLdBDzgtBtBmQt +rbFwwnLFLFwlMLrFwFhMVLrGNSTfZTRhfTqjGJRRZTCNcf +QWTnQCnWNNWmTnSPQwmqDbcscbpcjPjVPbrjpq +vJhzZNlNNgdzgzJdlGzHHcHDpjsHqrvbVrbvrD +RzRdRlhLgtCwCWSLnN +SFTJFTTwTVVSJBnSTdvNNfWbZCZWNZCNNhBv +srLrcHDcsjtLcLLcrLctjlcvbDNhmWCvNhZWGZZhNvhZmb +rclgtMPrrSgVTgJCng +DbrhDzcDffbzNbZvZWSSqSTNSVWv +gCPltPmCPglFnPFwtGPhGPwTCTdZZWZVRvWqdRqVVdTdvR +hLBhlmlstcffBzrpfj +wFLLmhMfwZLDwmMNRhZwRLDvJgldbJHPdQvcQHHJQPgH +bjrVrTSSJdQHcVll +CGCSsCCBpspBrqbSttpbqWmWZRmfFRZhZMNNLFqFLm +zWGjjBHGjzzTWMjhtDDWtPPlJZPJpvqQrmZTqQQpmr +RFbVLcBVLRcRVcCsCCqvpCZqmplqQJmPrlvQ +FLNRRSSRgScSVLLLNdFdwjHjnftBtGMgMjzHgzjWjj +znVSqnqbqzSbzTHqDDZmlcFcnhDMnDmn +LtjsvdvLJdjfFwRRCCMlChwCpMcclCcZ +LgvjjfjFQVgNTgWq +SJRJRFFCMSsGRMMwtZJRCVTgqgTVgTBCVpjTjmmWlB +ccvnnpnDVqTcBVTV +vPHprdHdpnzHSMsSrMRZJGws +GddGrcGNHnGvnCHddvCSWqTSWsTwTWShbHlhhb +gDPzLRVZgQfpRRFQDDVFDfzhSzsTBqqqnqbhnWTSSlST +QVFfFgRQQgLtgffZRfpFPfntjrcrjCmtCdMMmjMdJJJNtm +jjmNcpGCNmDqqsBfnZnGGGRLsZ +lrmlVWlQQtWllgtbQVrWBnZsJgsRLfZLhZBBBffL +rWMVQtrFlbFlSSMHVSdHHNHdcdDcddzppzzm +bTpjpjcVTLmphbLppJwqzqwJLqqzzzgRLJ +sdHNbrvNHrqPvZZZPRww +bNQCrCNtNsSlhffhVhpVWFCW +lpNnpMMZZDbNbnBjcrbjvScFmbGj +wqhdqVqdscrjdLsv +HQftVqWCfhwqtCCjWwfqzzVPZRJQgMlggZMMMZTNMNTnNRTN +fvvGbFtVmtTwgtMT +WcCcClzPCCcczJJScPWWZzBDmwbhBBHSghgDDMTHMDBD +nWPljWzZWnbcbRsNFjFFdFdVjFsj +NQrcLNmQGRfGLHHLZgbbnpjZJJJndbgnlv +DWtThDWtzzhltWTwjbdpvjbgqjgg +VtSPFWtBPBFSFBWCStshWBmlRfHfMRcfQLQLLlmCrCcN +pbmwqJnqSJVwwDPCjZZzrZfD +QtssBTvNdNvNtQvQGpGhdjPjDjczZDfjhgPPDcgjgr +GltptQpMGNNpRWlWFVFHJFHLWH +ZLLsDGGVhZcQQLhrLshrVFwHnWqJnWMnJJJnqfWfGn +jMlPdTlPlgCgFpngFWFnJfpw +TlTNbdSSTSTmTjPMTCdBPjBMrLDczsZcNrDhRNDRQRLLRVVz +HDLpBqDVVTvwGDDNRT +PlVWjfhsPMMmWtlFNTrhrrvCCCTNNbvw +lsglfgVJmsfMjJfSqSzdZnLgqcnLnp +pfCDJWBpfDffpJLgQJzzVzNrgNgNgNhNzmVr +ZnnGZbGTPZnsnRFdTlbrwdrNzrrmmWwmwVwttH +GbPGRvTnZljWnpqSMMCjqJQSCf +ZgnFgwggznFrfrwfHhNMMr +pctLCLRhPHBLMLWfBL +JJcdJcQCCJmQJppmlgndnFslsVnsvghZ +WpMgTppWGSWWJmJDpJcJJhqm +zZzjZNHvNjPvNsbZLbRLzsPcqhVJSVttdwhwmdRhtdJRVd +sLbvvCZCPSSSbbPfNlQQTQGBllCTnMnWQn +fwbwswddwSbBfDBggMBPDPhHcPWDmhHhmWnWPC +FQFlzLCzQTlrTTzvltFqFrmhPHjnhhnnchcJWcRRmRRq +lpLzlFZzCltrTNlTztQLZfSMGBNdSBVwbBNVSMSbVs +FMmgbTFdgLSgFQdjrRPrQBPDdj +ZqqWRvsfGrrPvvPC +wZzwnqccRwRNNpRSMztSMMFbgzLTFS +qTwBPfTfqQDMDrssHdvtRHccHMjR +gWSZGWzGFhnFFgnhNsRHtRdsVjZcRjHs +jgplhpJJFgnDrrwfqprwDP +CWhMSRfWhVVnRSZnVVdsLQqQMzGqLBvGMQqczv +PHbpNwrjJplttvcclLlQzzDszc +NrJbJrFNNJNPrmwrtbjtNmCfSWfWhSZZfSWCsfShfFVR +VLhRPLGLRPRSStRRLwfGqfmDwbmqbqqDlD +rBSFvppnzTbwDwlDcFWm +MJrnJTMvMsrTsPtshRNPZdSLhL +BZBrRCrnCQBBnZfGqhGGMMRcthMhMG +TLjsCdDCPTvNssjdsPsDgsgqGcPHczchtHczWzPWzzlWhG +gsTpsdNbvNNjNSpsNDTsmCnSVQFmSFwZnQBnmnQQ +llbsNsWrmbrGbWCNtBjcCFBzQFZBCFjF +LdSpwgdqSgzwJdRdLMRHLjQQjHjFHctjHBDTZj +gSppgpSJMhpzwrhblfbhhlWlnW +DwhTvvsJZWsBnDzPpBLbFp +GHtNGRGNdzbMBBtmBt +NljlCSVSHdjGSQRGlCQSCswqfWzhZfTcfzcJvshJ +lmsGNFsDGqCbFQBbffjjwpzptw +hRQdvdrvrvSngWnvnHrTMfzfzRtftzwVTwwpzB +HnSSWrvLJvWJGFDsmFLPDFcQ +bwwpGphpLghpTvpWphvJlFLJqqltjSjVlSStSR +cmszZdDdBZzcNcDCDcNsmNMcqVjMJStFRJltVPVrlVPjVJll +HcdmcCzzzQcHNcsCdpnGnhwGgnRggHvbbR +CfMBbwBGbMbDCFrDvhFFDT +mjzRjjRdSmjPnzFZgnnrTT +cmSsVcHjLHTwMfLBpBpBwM +whqqfZzgHvhSzzVNVDbpDbmbVbNpJD +GcQFntGTCCcCTMCTGBlJsJsDDWpRbWBsJpNS +FnPcrGFFdddMnCnTqgqgqPHfLjLqgSzz +zMSzzjssFdGnszRtNftqqwFHbbZw +RRPLVrgrwHqBqgwt +rPWmLCTCQlCQQmmrWLrQShJshhzdhhJjcSjlzRds +lvgvCDfPqLHppqpCCDJncbntttbBtBBVHjwtrB +TdddszSQsWcngjzVbcVZ +hRWsTRTGQhNRGhRTFSWmlpgfqlvLmplPqvvGgv +LbWFLQdWWPwWSjSHPHRfppHHDRpggR +zmqqNNzlzmnzzNCmVCmtBzpfGsfpBgDgspprcfcfsrRB +qNNVNJtNmmmNzznVJzvCTDZWhvZZjZFbWQQhFhbZSw +DjdHqJVVhHVZjhDHPWtDtZLFBRBFmSRTFSbwmRRTffTTJf +NNznnGlgMQsnQzNclzpfSRSMRmfPMmFRwBwB +vzrcGcNcPPvHvHPt +wLCcmZwWTNtZNdMSMGSCnJGGMB +RFbHsPhVvFPRjlshhrnQnGjQGSdSqJfqnQBM +HhzVlFHhPwzScmSTgL +TNlBhDNvNBFpJgpPPpDQ +jjfCdCZZqsCZsbdqPgFGGMRzSFMqQMRS +jnWPtWssCtWcmZbbtstvnrrvhVBhTNNhBHlBlL +DZwNWPDzPVWbJngrQjrNnrQcMg +GRRfttLBhhvTvmLmFcFcgFFSnjWrnsrG +TLthBWtTRLHqhlLLfmhBqVPDJVdPwzJCPPZHwdDdVd +GGVhrVSMQwQqfVssVvnWFgvgWn +jtlcRBBtQRmpWsjzFCvzWnvF +QPcRbpppDmNDtPPblZMfhZdDwdMrqSSGrq +ZRrdtBdQvQsWnnfWFZsF +bJLcMzNDLbMgwfnGMWFv +lpvhmzNDmDmlNbzbmrVVPrHRCPHQBVCP +rZllQrsRWrlQswccMVbGbVbTdcQQ +NtJCntLSHCjznfLTcGGGqWMdWM +jCtzzSFthhSSSjPJrFDlvWrlDZRpwpRZ +mQmbLjbrLQjLmTtwwWBTTvWjtt +BHSqdHclHHNFlppNqWPwfwDvTfDPPtCw +ddSGMGHcdcMhMZnBbmbZmgGJJg +lvvBzvDnlzjfPnfjnQPlldRbVbRqbqqCgsqqVpQQgVqc +NNFtGNMtTNFmJNGNZtZMwVRTTcsCpVTbbgCbgRhscp +FGNGZMtNLWmmJWGFWJGLSNtPrPnBfDzzvjnDBzpnvDBLnv +fwvQRFQvQqwpwNJrwN +BstDnBjhjBhnshSptpJzWqNppbfr +CsDjCdZcBCDcjnfDHfhnfggZMGlgQVmgMTRmgVGMMl +MwlBVqVlsgnmzwJsvjhWZhGPvjvRRWzG +QNQpQpftHdHHCHGfSpCrQNdSrDRDhchhjvjcPrRRWrPvhZjv +LtLSCTSGfHGdGwswnqsggssTqV +qDDCHjzjznTvWshZQWfnZZ +PFFmmNMMtNMVFtczcFPJNrLhZwQZQsSvvSvWvGQQJQssss +tFzrrPPNNFlzVrpRTpblRDqjTpDC +DWDrrBdpmdpBrCgDthdtfcHsqJsCqscqwfsjzHcq +TNLNFNSTQNQTSnlMcczVJjVzsqLDDfJJ +TFPZQRvvlMSPPtRWDtmDRWrBGr +LWGVZdrvWdpLGWRsjPMsHmdHdHldlj +zJzznChzzzCSfTgMhCPDmlDCbmlsmjDDQj +nSTTJhJtnShNtzwhgNrGRRWZZRvMWMtVrqGp +PbPmtNmBbPlqBvqlDJBT +LpGVDzVpVZqqSTvq +pMnWGLRLRppnGpGndrGPtgDCjMPmbPgCQmPPNN +sqcZcbZZpcZspcCCRMmznWGWdLWhwDRGTTWggT +NjFSJgVHrvfVtrGzWdSznDwLSTLn +jFrBNVVjBFNvHrFHBlBFFpMslPgPcpMPmcQPPZCgpP +frddqsThtsTfTbPcvhsrbsRLpRBNRpmDpGmRGcRNLpGp +QWJHCJwWzlHZQZHQCJJRzRqnLDGRGpnGBRnNDN +CVwHCClJjQgWCZVZQgMwSdthjrqvrSPPhdbqtPhs +TvdphBBhhhCgdLNNJJJLWz +fVcsqRVrPcnJWgDnJN +JlqsRJtssZwqwVtPwltRPsHHbFTwTFbpjHhQjTQbvpTF +cQSnPDDQJGNzwnNpZb +RHDrssVRDHRgsRFHRlrVwzzpNGZlfZdppZdwGNZb +sHCHtDgtCjVVLFChqPMhBCMcSTqB +hdbQbqcCCQcqFbCbVdcWCQQlRMBtGlRHBtBMpHhpHThZMR +LLsSLLfgJPrgPnssnmlZtlZpHGHVGfZVtZpl +PvmvgmvvnzmrSsSLJDqDNzqFDQdDwzWWbV +HNNjnLbpLGHvWJDhdWWPpWDW +lVcSNgcSVclhRlPZPRCDCR +cqmSQrwwrrVSrtQFqVNmFwjQnvjHzBbLLGjfjzHTzvnH +QmvWVppPHQQvbbvmSHSpPzfzwnWMTZFFzwFMCzLnwT +jGBljlNNjgDtGDrNjjtjqqDRnMzRLnFzCFnMfRfMzCnttF +jqNrrGdJcdgLjqDqBrDQbbmhdQQmmpPbphmbVv +ZHQCggVHHRDWvbfjGptVtLvL +nnFwnwrDDMShnhFrFLLLpjvPlPGGtLGb +dcNSMhrrTDCBCsWgCTQW +HqDDLGtDdCnhfDnwnV +PmlJsJTPlbdBTzTnzhnnCCWWzV +lSPjMScggsScgjSMMbqHLFGrRLGHRZZtdrcG +ZVVtNNppdZSdLtCPqnHhqJJFtb +zgwwQBfwmGgSrDfgrrGBggzHCnbJbqbCJFnqhHBhnHHCqJ +rvrzfmlRrgDgmrzfggvwzvdjjcccLjMjVcVcsVLjVSZR +dppcLRHpphchhNhSddjzHzWQWQLtrMsrWQCWCsMZssCZ +JGfBfJJfBqvGVlVbDBwDBDBfZnrQsMQtssMttssDsQMWZncn +qPVwlgPBmjpPhcmS +zGPnzBgPzPnPlHZlDDHnZBNCvrtcjcjmMcFzNcNFmFdc +qQpfsLTTSspqTfJdmdCtMjdtjvJcmr +bfQqqSrswLLrfpLTqprfTnDVDVBBbgHPDHnhDPgDbV +JssTnsdFztZLdNJnNtTsLNZGqlbGFBqrGMHqHBcFBqMFMH +CCgSfgPSvSfhpShSRppCdfrlqGHGGcHmclmqbbqbqlPc +wvVSVjQSSQhRVvfQChvZZsdtJstjLNLZDJnLss +CmfNNNZNqDrnDjMhZM +gdczzGtdFcddtWQgGGMnVhnjJwnrJFDPTwMP +dlvcdzdHtzQSLRSfmhLSqv +ZpFFLcHFZZRRmJVZgD +PzhrtQntzcrjCRJtbtRgBsBRVR +zdzWfCzhQzlhWfWhlvpFNlpSqcMSHHMv +NrrMgMhNQhNjQrtqtPtwVtZpggPw +TfRLndnLFCRFTFbbRDHwpVqqBBwsHwZsfH +TJFRdLlRThrlcvZcvQ +scrwRVjbQvQBzsBC +gMfVqNnVmnCBQDTvdn +SMqhWqVlmWSmqMVRSJjjpcFrcLpJrR +HtSQHQntHsHMrtHnGfHQVVzLvSBSVvVVSFNJzzVN +cmPRmpqlpPmcgTlTpjJNjjVDvDRFNVVBFD +hlmCpmqmpgqpZTlcdQHFQfbHHZttwMQwtr +VpWgbgfwCjbftwVPPpGQFQhzTBQTBGPzqFTS +dbRbDcRrsnsRrLZmLRDZldDZqTNTGqqFFzGGhSTNTFTzNmNT +MlLdHlDDHrHclMMrCwgHCCwWwCbCCjjg +GGNLhfDMVcVrcGsT +jSJQFjHbwPFSvQSHwZFvHSHrqCCrrTsqBwNBrcBNsVTsqq +QjZSjZJZPvNRZJQPnSZbJZRWLfnmgDlmhdhWgWLdMdfmhM +CgGnzPNggCJtNTgTZTPZzZZvvcDcDDdqDFcJssJDHDqvHq +jhhrrLVlmLRRnRflfVbFHHHqdVsDqcvbHVDb +jWfWwrlmRRnQmPzZNGZPBNCQTB +NzDDhwNmhvtrGmNCvWRVbcRRVTcHHcVFTbwV +LgsPlLsQgQdJsLdldtpgFFTMbnFqTcMbHqFcPncq +dgsJsLLLggljrhtGNNtSjvGm +ptzSrZtzhsmmtPrhLFRFnjnnLMsnfLRL +HvwVDHwWWgGDGdHgqVDWDMnRnTjFNTNjfLJvRRRRRR +DwDgWgQbDDDHwBBBWdwQGVHhlhlZZSSmztfcppSBhzZcZp +CWmWRzlMJqWDWqCJbqDlCBBVLMQHVMGrfMVtQZrsLL +SnhPdFFPNZsBBdHtVQ +SSPcFFgnwnSpwvcSjwzCqRzTmJbpJCRBmbbD +wQbqGWWSqwrbGWWWGjbNMJPfgfnnDmPnPNLfjN +tJFztRZCvVRCztZFZRVgmMhmgNLfRfnmDPNPhm +BFCVZzpVFlHCdbQqcTcGlJbbSG +tttfLPZZQZTlZPHHPWgMVvBnjmvjnjgGBQ +FzcNDDDrNzprrrshprhFJtVGVnjtjGvnhvVnnjnjGM +RDqJNszDPfdqPtlT +QCJdMjCQbdBjSbTHDsbWDDwHTP +zlvlmqzqGfgdNzLldrHwwPGpWDrPGZWprr +gfVfRczVqcRzmdcSQMjQSQCSjQCQ +RhhCGhRBShjjRfpwppFTfFHZHZZD +qzdqzlnPPctPdmtPdTZbwQvvwqvHHvZpwZ +nVTVTcsWmWSRhhRVrGVB +GmshRMnzqRGsPNwMwcrrpcVV +CDCbFCLvCgfDSFLslgDpwpLtTwwcPtNNtTTprt +JvSFbSbbFllJlgDvlJbgdRhRdqzBGnzshZnRRRnHBZ +ShJhtcsvvvQbnnsccVTLVTppWqddpVnLWp +NdzPrPZgPMNNrmzpTzpTCjWfzCpzVL +dZgHmZRPPZRlZmrPDtDRccvbtQQbJbRS +wqjLjwhznhBLqLWGfvSlvcmlrJsqrtJTJJ +PwbpFPQDRCDrDJTrTmvs +gbZVFbZHgwHbCdpCRMnffNLhWnnzMdzLLW +RVVGSNTTRlNqHblBNB +JfwJMvLLZwLsMJwWMJfwLHBqzFlvzpBQcqzblFbBqblq +wMCZJsgJCCCnsMHrgLLjSPSVTgShtRjTPhRRmt +lmQSSWdMHHLWgWqD +ZZtVGGGJrJvGVCwfgHNLccmNFFcqtc +vrCGPhvrTPdRBnsRTmmp +dDMDDjzCQjwCCcDgjSLLLsLNlmpplN +FqrHFTFRLCLVFBmS +JhHJhHRThrfPZPvhnTZZbWdwdwDDWtDzJDtbMtCW +ghwDzJRDwHmPthncSPncLLsPcvnv +MWCrNTCHrMVjQQMQcSdnpTLnFFdTcnTc +qbWMfWfNrWVQWfbjVBbqMfwDtqzmhmRRzGhtHhHhRwZh +fmSmnjTjrlzGlTzJdH +BrhRRQMrgQvgFFhQQbwpFvGGdZqZJqpJqHVpJGJLHdLJ +ggbDwQMsvsMQrFMFcWSPSCPmSsPfnnmP +cmNVbMrrrjcHDRcvfW +wQGdFfSThFsLhhHWvDCWDCJRCCjd +LtpStGhqrrpnfnpp +bvcccTqbgvpGndJtgdsgNd +wDQwQhtQhQRmSmjsJndJdBBJBJnlLS +hwhmRrzFVjtwzDmrVFrvPCcCMVPPvfqpCCTVVb +jRrRNPNRWjPRWPRQNjQjThTCzBBzDCFBGzgDFGGQ +dnppLwmwCnvtlqltvtnTGBThGhdFZhgzDzGccD +MvnqpLlMqCqCHMjWPPHMSHSs +NNpNNvpvBdtTrMFFMhSSwzjzchzwhzwL +VVndHqflQZZZgHSLLhjzRSmZRhcR +glGgnqbQlngnWCGJpJprtrtFrdPPGs +WqwRjzGtRzZZRRGjWBJzjwmfMTHGGssTTDsrLmmmQLMD +SNdvSdFlSNNhSPFFcPFclbQQslHmfHTDsTQMLgDTmHQQ +CNcCFvpdnWpjWwJf +PVPnVHcnRncGZqbVzHVPnnLbSMjwrzWMjSwDtWwWtwWhwDWz +pTfsQCshCllpglWWSjBMSQSrMrjM +hvpvppggCpJTvTmshgfsmZRRHqbcLPHZmPLRnmPZ +LQbhVZZmZhZjBdbGmgHqnHTmvqgnnWHr +SzCfDFFNRfsSFFMFfvprvpWzqzgqTwHTvp +CDNDFJgMDSQhjVdPJLQG +plpdLdpjjrrHJJjLrrHLFdbzzCcvzgFgcwggzPMFvvcMhM +GRtSBQNsQlMPRzRlzw +ZSTtsmBlmjLLpnpH +hglGNVSdNSghzSgCBhDFLBMBtFMMFtHtbtLL +frQZccRcqGFmFHrJ +nvfGZwvTwGTfQwvfTwfgnCSlpdnzgzslppCsCV +snTSPbQnTTnQgbmsTJsLfZwjffhpLnGRjpGfjL +dcNWcNHHlNtWHHlCtltWNFNMLZwjpGfpmrZfrFprrRGpwZfp +HmdNWCmDMVvQPDgqJs +GGFtSngQLfnSnQffgPnRgFRGRwmRJvwbBbJDwjvTbjrwhJvJ +WHClslcNNWcqNWlCZdcHsVrThBwBjbhDTDBhrvDZJTwm +NWVqqcHHNpsNcNVdVlhCMlHQQMQQzLfzQPttFGPMLSLgtF diff --git a/package.yaml b/package.yaml index a1b9087..e175af2 100644 --- a/package.yaml +++ b/package.yaml @@ -6,12 +6,15 @@ dependencies: - base == 4.* - text - attoparsec + - split + - extra library: source-dirs: src exposed-modules: - AoC.Day1 - AoC.Day2 + - AoC.Day3 executable: source-dirs: executable diff --git a/src/AoC/Day3.hs b/src/AoC/Day3.hs new file mode 100644 index 0000000..24a6698 --- /dev/null +++ b/src/AoC/Day3.hs @@ -0,0 +1,65 @@ +{-# LANGUAGE OverloadedStrings #-} + +module AoC.Day3 where + +import Data.Text (Text) +import Data.Maybe (fromMaybe) +import Data.Monoid (Sum(..), getSum) +import Data.List.Split (chunksOf) +import Data.Tuple.Extra (uncurry3) +import qualified Data.Text as T + +valueMap :: [(Char, Int)] +valueMap = zip (['a'..'z']++['A'..'Z']) [1..] + +breakInTwoEqualLengthSubStrings :: Text -> (Text,Text) +breakInTwoEqualLengthSubStrings txt = T.splitAt (T.length txt `div` 2) txt + +findCommonItem :: Text -> Text -> Char +findCommonItem _ "" = undefined +findCommonItem compartment1 compartment2 = + if (c `T.elem` compartment1) + then c + else findCommonItem compartment1 (T.tail compartment2) + where + c = T.head compartment2 + + +solveAOnOne :: Text -> Int +solveAOnOne = fromMaybe undefined + . flip lookup valueMap + . uncurry findCommonItem + . breakInTwoEqualLengthSubStrings + +solveA :: Text -> Int +solveA = getSum . mconcat . map (Sum . solveAOnOne) . T.lines + +-------------------------------------------------------------------------------- +-- Part 2 + +findCommonItem3 :: Text -> Text -> Text -> Char +findCommonItem3 c1 c2 c3 = T.head $ go (go c1 c2) c3 + where + go :: Text -> Text -> Text + go t1 = T.foldl (\acc c -> if c `T.elem` t1 then T.cons c acc else acc) "" + +tupleMeUp3 :: [[Text]] -> [(Text,Text,Text)] +tupleMeUp3 = go [] + where + go :: [(Text,Text,Text)] -> [[Text]] -> [(Text,Text,Text)] + go tuples [] = tuples + go tuples ([t1, t2, t3]:xs) = go ((t1,t2,t3):tuples) xs + go _ _ = undefined + +solveBOnOne :: (Text,Text,Text) -> Int +solveBOnOne = fromMaybe undefined + . flip lookup valueMap + . uncurry3 findCommonItem3 + +solveB :: Text -> Int +solveB = getSum + . mconcat + . map (Sum . solveBOnOne) + . tupleMeUp3 + . chunksOf 3 + . T.lines