diff --git a/Y2022.cabal b/Y2022.cabal index a0253a1..c9ab74e 100644 --- a/Y2022.cabal +++ b/Y2022.cabal @@ -25,8 +25,10 @@ library Util Days.D01 Days.D02 + Days.D03 build-depends: base ^>=4.18.0.0 + , extra ^>=1.7.14 , megaparsec ^>=9.4.0 , text diff --git a/app/Main.hs b/app/Main.hs index e89e017..02052f2 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -7,6 +7,7 @@ import Print import qualified Days.D01 as D01 import qualified Days.D02 as D02 +import qualified Days.D03 as D03 import System.Environment (getArgs) @@ -14,6 +15,7 @@ solutions :: [(Int, Day, FilePath)] solutions = [ (1, D01.day, "./data/01.in") , (2, D02.day, "./data/02.in") + , (3, D03.day, "./data/03.in") ] runAll :: [(Int, Day, FilePath)] -> IO () @@ -29,4 +31,4 @@ main :: IO () main = getArgs >>= \case ["all"] -> header >> runAll solutions - _ -> header >> runAll [last (solutions)] \ No newline at end of file + _ -> header >> runAll [last solutions] \ No newline at end of file diff --git a/data/03.in b/data/03.in new file mode 100644 index 0000000..78a9293 --- /dev/null +++ b/data/03.in @@ -0,0 +1,300 @@ +vGFhvGvvSdfwqhqvmCPnlFPnCNPcCFcWcr +ZbWZDMgsTHsrNNLJcJnsJl +HbBWQgZVZZBzbgZphwjqpmmVfdGmjG +vvCJLGnthChvtrvCCnRbTRqRPRBtbTRfPRRl +djZSgHNNwjqcdWlbcbfc +pFgMSfpMfzMDZFSgSjGJQQnCvMCVLnnJQLGC +gVhQWQpcWZVwwHVvFvnnnnDFdL +lzbPlztjltztzSjfGcPdTHLTHFCnnHCLndFGGd +jsNbzbczclttSlfbqlljRQMJRMMpJwRZhspZgJRM +hLJvfGcNDttSGvJtvSSJcqbqFBBWbjQqDrqbjDDjjb +lTswlzZdssgFpdPwZpMQnCjngCCjWBQBWWQqng +PRZMpzPZTdVZTfJvFvLFRctJcf +JHbQtHVHHLLbTJmmZddgdgwhllMNhhhTgg +spqpNGDjDPMhCFChMj +DBSDDGnpSDsDWqWczcvSqWvsBtJJLLZrRVZLJRbBZNVrBHrV +GwGhfhPhpHccvwSwrTsmsCjDmqTfbDqjss +tQntQcNRJMFnnVQFFctJqCsRmsTjjbDqDlTqTbWT +NZdVBZZNFzMFNNNvGprZcLGPGrrpcP +SvCPLrrlCSvZLrCPPBNPRvNLQBbpmbdggQTTfpfQgpgTqbbb +HVjHwMVwWtdMGwtwMwdhDFgbJgJqTmFMfFfmmfTTpq +whtHVcjDtHWtsWdwVGVHthDPzRrNSsCRLrLRlZNzZSNzNR +rjrlCCBtbtntwPPt +FvfJHqBJQWWgWgWLwnMwMLbzvhwTTp +WqHgWqBFgGfQgHfVdQFfVfrDllSsRSDmVmRCZZmSSSSZ +gjnppCgGHNPrqqmFnnbr +tGltVlJRtLRlrqcJcqZDqBJc +VvhLlvWltWdVltRTLTfgwSjGNHhggQNQNjps +HDWjCNfQjmwgWhcwPPVbZGcpMb +sFltFBRRSRJBSSsBlSSnRLPZbVGMVPZpMpPZpcMrFZMc +BLTBsstlqBRRBSvJJBsHdgdDNHCQHvbdCjQNNW +lRGzWLZNFwJVbVVGcJ +HqqpjPvHQnJgVgTnbdTV +rVvjBQHQrQhCrzlzWrRlDZ +jZjTZRSjZnhGZhzGnG +HbnPHrCbBDMnhcrVLWWLLWWg +MBwbCNDDptwNMttjdSnsqSRSFFdjtj +bSfvcsNsDdccHHQm +ljrlplvBhDHDHHHHJl +jgpzhrzRrvhFRFrzFnWfZtTwSWZPbbqNbsTqsW +vvCTvcDzHcgtvWjvcDcvgBCgwTdPFPpwpwmTSwwmdPwZpfZh +rNLMNVqLGNrVsRNJNsPnGnnfnpSFGdfddndd +VPQsMbVsPbzzvgCzgv +wPsrqprHQQZsChZn +cjgFLwWDlDltfLmTCnmWCnZZChCQ +FccccSLGFwjVlfVLLtgdSPSpMpBMdMBRRdHdBp +mQQcpmCCprrfLQqZVGqLGv +PtsJdsMtTTTvFqLTnnqbGZ +HjldthsHWztJzstZhBcHDDgpNpCpmrpgSD +lCmhDljDJgWggcnh +LdQrbdTDQGfGLPdqqFrHwRJcWRHgHBWHBJ +sLqsGtDqdGQfSTsqtfqqVMzjCzlvllZljNpCsMMl +CfLCZCCqqHlhSSrrtpRjpL +mWQbnQZVTWwNdwmDSbpbrFptjDrjRj +PJWVnTWPVnnclqqBsCCZHP +tqvtbNCgqJSgZgZvSncrrcGjBGhcnVcR +DswGQQQdRcjBnRDn +sMdlFMQQpfZbvlNtZGgN +RMlPllHtrlrlcZLsZfLcfwdDGD +QppnQhTBgwQDJsGzLQ +gTjnmjvphDSNMbtMbtMRHNVr +RHHcChrVVChCWQmRnMZmnmbTbGmFnqTT +gpzpfpszDwvDDNdwjdstnSMMHGMqvZnFTTZqbq +DsDdpfppwHsgJdjzfdDjdssLPlRccPQQrJcchPQWWQRhlQcr +rsrjQjnRnQZZqMmMMVqs +WTSTdvJLvTGJTGCMGvzBBpVVqqFVzBzVmf +tTSJhGLJbJhLJRRbHPQbnHHMrl +GGgMgBJHWHhLWMhWhgfrhgWLzmsmlzTtzHmsmlszRtszRVlT +bvScppfcQfcQSFCQpnPqwwTdRTvmzVssvswtddsv +ZDpqnPbQbPPnQbFbfSPSqbQJhGrjgMZBhWLrLrBBBBJWhg +hQCCGCNhDmGFJsTt +fcggBBpvBSrtsRTpRmpD +wflWlBlfnvfWWgMNPPLhPnzhPmLQ +pcGGTvVpcQLLzSPPPpVBVQwngNqgsJqgJgqSngsJMqJg +RZDFGhtCDGmWfWsNdwJhnMgwswqJ +ZCGjRGjZllFGHvvcTPjPTQpB +FDVsWrFZnnnfNRJdgBBBMLsJLH +wcThcTphvCThwTlblpzwGlpLRgHJWLgHLBHdHWJLBLWR +mwcbPmClwlzlwvvbTmWbQSjZmZSrDnSNVZfVFnZf +tMlttlFRSrcSFcwQSRwSzrMMPPGGPGLWgNfTNTcLPNPGBPPG +pbZVCDTqnCjVDHnHVnhBPBBbhBhbhgLgmWLh +qZCJZJqqjjCVvvRQltlzTrJtMMMw +QvvdBDdMbdFFJrMMjjmjCfCntC +lHTPsNLPcfVZLnfj +GgsWpHPpTPWpNsGvgdnDbQRQFRbdQg +jPNwllsVZjhslSjwGShZMdJDmmdmWLtMDDPHMPFd +QbvpDrbBrtMbbHJmcH +vznvzBRpBprQBqQZjNswwZDnSlGjZl +PdNTzLQPLrVMzGcMtt +FsSvDrvmrwDggHGwgV +vlpZpZmfnmFTlTWJWdbrdh +mZmnggMTSJrrmnrbmTbngJMtwPvwzzRvPGhQdGZPGPLvGvRd +FFVBNHVlFlDfCsWwLwPzzhGPCvzhQv +qBHLsDcfqFfDDfsFLNcNNBFsrgpMpnJSbnmTnrtmbMSqnpnr +qjBNwBPNPspqddssbsTsMDhTDrThQb +gvzZSZzFbgHnrHmn +fcvfZcRSZFGfZcvFbGttcPfpVjWVwqBqdwNdwNNpqV +RrTmtTrqznrnRCSqJrWlWDbhWVnfVDVWdclV +QBBgHQGvHHQswLHQQLGLHdLhfhlZZFlsscVDZfWfDhVlZZ +dLBMPpGPjLHPHPBHjjgQjHQztSJRztmrNCSCmSpmprrrrz +HHWJgjjsJrPBWBjgWgDvbbvtbNDNVtttMPPp +SnLTlhhNSntRVVLFVbbb +ChqdcNTNqqJCrQrQrrBC +BvfLLngFLDrrlDFDDnGmGlmzqzdGqMMWWwWW +RVsPbsbVZbjctccCcsCSPmdNqMqMWddwqVzhhNHwHd +tcsjPZRctZTSbbtSbtsSjZznnJfJBrfJgLvJJDDBvpTrgp +LJJsNdtJQtbWRJQttjGhjVnjcnzcsczGqj +MDPPlvCwrTlZfMMvTlPTdVcVhVVjchSBrjccSnnq +lgZCvTTZfMgHLptdRgmR +gCDrJRNgJDZRCwMgqGbtVVjTjlFbbTtR +mccnfcnSQScdvdcQQQpWdnWSjPqTbFFlbPqbPVGNjTPjtN +NnzmpWmBBzzpzDgwhDghrZrw +wcbVDBQwVBFQLFQDQcqQcLcJfpHJjmljGgMHfcfgGgjf +PtnWMtSnlgJmWWmm +nThPtRnzntstvrtRPqDFLMLdDwBBFLQDBT +zshqnVqTwqHqZQgZDSZjpFjFFF +PsBRvttdcgFFBSmc +GlPsbLtrvrrrtJlCTnVTlwwfnhwVqH +CvVVnFwWZnZwJZMNlCMNMpbMrrQG +cpghqzqqtzbGMjTNclGN +PqLBsgqBsSfBffShVmvRVwWsFpwZVpsn +LzsLSScvscqNdGdgddQjCDbzhpCDbRbhDpDDwDwt +ZlMBBBnlMFVFHVMJflJjJBfhRnCbCDpRttRPDCbWpCRbpW +mlrFmJrmscNGmsjm +FqQjLRjfvTFvlPHHNPMBDDNDPR +chWptpcWTzBPMsMMMBHW +zcJghwJZpZcgnctccdzzpGQrbQbblFFlTCCFTbdCFCFq +QcwNpCcQzpwtCGPPPnrGrfHfvN +FgjhhhjMVFVjqRRqDBVBqvMZvdrHnPZWZvsnZHdWnv +ShBFhDVghhTBgBBFRRgRCmCPCcpPbwCmLTcCmbpb +ZzlzsBzZnWnsBhFRvfvvLfWqfvMv +GgQGjjddHHPwpHpTGjPdHMvtvwJqLtJRFlRFRqMwLc +dgbbdjpGGgTHGGgQgdpmpgblrBrhrhCBSSznChsVhBsmNB +PhSwPdnpsmSWWcjjDFNqnc +GJGCTLbTZTrlfflVLFchHDHHDFcVVN +RhlhrllQZhCsPvRBvMtSvw +GVgnrgTWGVGjLVjWSpvvNmPTmpQmzvhf +tBbBDsFtszzSSbPZbh +BqlqdcqSJtFMdMjWrnGCWRrWGG +sJVJsQhMhPPSQMwdHRmmsmmwRmsr +zLFjLDTBFNWWwrqrffldlRdFRq +BLjzjTpzLpzWGTbQpMJvVMQwQhhMQM +RqSztDRhJDLmRMLlfvsP +dMdMMHZCsnbdvmbP +VHcZVVcZTwTQpgHQcgFMFBpDDzBqqqDhqJSjSjJjSD +rdMnMGjdHhfnjqWWDJPpGWPtvW +PTBSQSSzZSBSCzQFFSlZTFSvcZpWWcJvtJppvZpLLcDVcv +sgQCsBmmlFCPFFzTgTBgdNnrNndnMrrrfbrNjf +bpZdggTjHbgLglpHjldvHpjdhTVzmhzzzFPzmhFsFQSFnhhN +rPCDBcCCMPGcWDNNWQzQQSNQnNzQ +fCCJtDtGGGfGBtGqBrrcfRBcvPwpLgdZZvHdljvqpvdwbpvl +qpmsNldnlHlCqQlHsHNHwJpJMtwvvvjMvfWjpDtt +TccVBScrzBzzTGPbVTPQhWjfMjwwRtJtjMtWDWWfDS +FQFbzBGczGBFLnFmmqsCLg +qpblblvpvJzStJDrhrnGrdhDfFqf +ggNQNwBgmTcgCBTBTQQjNfDCnZRRRrRGCnrFfdnhrC +mjVFHQTHNjTwcmpzJzHltltbSssS +WChWmdcmzndhFcZrrbvrVMVssj +NQLDlDplpSJGpLfRRMZVBBGjVsGbbjbBZsGv +QNDfNqlpLgSfNfNgNfpgpqwndwWwnCCnnTFMdHndzn +ZGRPTngTZMSGMGnhSgRjQHsPbqjmsWHQCQWbNN +BFLLfpzVDBfDdlfQcsbVcNmQsqqbcC +zFvdplLDLtzFmrrwMMtTrShZ +nTdmnVCGqTsSBTqv +HlMPwMlHfPSfBBmFBfSL +trHHwRHRwMHPMJQJHnDhbdRhdpCZmChNnd +lwHWjzplvHqWHGsMLsLwLfgdfLdg +tPJNPQmQmSGcTtFmctGmSCBgsBBRbLBRVdLVLCBBLgVf +FPtTPQNPrPPQctTcNPSQJJPDjlzplnGDDjWWplWHhGvpnr +jwvvDbvsRsrrjrfvfrrZsPpCpmPJJPqlqWmzRJRTqq +HdLttdSQHdLHMMtNdLMSTtHpCmPplWhCzmzmPWlJhlNplP +BTSLtLLQtnVZDnffbwfw +snvQdrtrQprWpgmGLp +FhzwlwHccBcljFBSDmHmLpgRmPDCffWL +zFhllqjczzwJqqSqlZMsvJgVNMTbssVNnQbb +dLZHrWjWPFZWZnPjZttjddFnMDVMGJMQqvMVGVRVpjVpGVvv +zhzTwTlfTwCsShSgNhfzsQQqvMQStQMDGJJGvGQVvq +TTwCBfsfBwhzwTBCzlmHZdLmBBbtLnLbFnnF +BhBRLFmlBlmhgShHmhSlZlFgvbQNwvcsvMCcsQCwNQvNMsBw +ttWddDjrfjDcssscDbvH +jfjfPWdzdfjdnWpjtrzqnhmJGJFhSJRHSmSmlqlHmq +QvJTgvsvghHRHHNbZvNZTRSzBBCLrDqzrfDDtJSqSLBC +cPPwdcFFPDwfFrBrFfFfrC +nppwdplpRvllsgDH +BGLLWLLwHVZwHnNhwsMsrqMqhh +STlTpDpmjzmjjjgccqdsbNbBhlNnNMhsqs +pjmgjfSDSzmSgFzRZQfRRZLBVLVtZZ +WHjddztMtVLNNFFTmbFPFPRw +bJnvpQfqccQJZfpcbvCphcFGDPFGRwDGDDGwGsmPFnPF +rvffQJZJqrpZCJZJQrQpvBvStlSWSzVSWBbzBLzjtjWWWj +SJFMSMGSDLTsFgHvHL +mNzRrRRzjzqqgPHvLTHjlvWg +ZLbRpRnRnCrbmnmrRRNnwbGfMwDwfDDdSVMdVJdd +nsqTbhcDssPsPWsnchPJMSTSMmJMwTSTCJJfJw +DHvFvvdHpvpGFHDMVVJVplCCVpggCl +RdQjtvHtDQNGsZqzcqPqbNcq +GFzRjczzQJnLjJvvTj +mSfHrNHDzHDrDSSSBvTZLTNqWJWBWLlv +PfgCmfPzDVrtHsddVMsRFcVFQM +sfBgfBfBsHBHFGhsqfjgQZtQQMdZgbZQptbM +rNLRSzRTrrvvLSTWGpjpNZdQPtGtMdNM +wvSWLwzTGTCcwwwJwvwcrcRcVfFBqhhVhDqhBllBfFqBCDCs +LbTpDTcMTSzzMLhScnDnSppNQwVNZFBVnFsrwQQZrQrQrN +tJtJCRlGWljGWCtjJZVPsJBsVwQmrQNN +fvHRftqjGfWGwtfGqvLTzDTzzzchSbMDTd +JJhWZlhqLDHtBDrqrB +bwwmfrSmbmFjVSFQwSdpDvGdpPnRvDtHpGtGPG +VgFfcSQfFgmLLrNThllTZc +QmfvrpnvrrJGnBSCFTBMSWFS +NVMggbVPzCTgDFDD +NRqHRZjVRZdRVdZwNPrMrchGhGpcGfvhQlHJ +nlBdCldndlZTttSSBBccPfGWLLHcTTcWPbbW +jpsFzFmzDzNzDGChGcGGmPQHQf +CNzqvvVJNFqvgRtlqRtdnwSZ +MJtDbNHDDpmVPJVzzjLm +RslhvlfRTWvWWRwfllSZngmggznjSPznLjmSnz +TlhffRwWQhChDqbBQLFHqNrb +HWnmSbzflWltlzLfWWDzjMBvCjjCTCgcMvzBBB +qRRRZJwhZFGdRNfghVjMVVgfcghC +QFFqwNNNwdNZZpqqZfnDSHmmlDLtWtHWlQmD +JrFdNTTLRBTJrFVrBNdVLFBdlHbzQQsQzbPJtpbtltWsHbQw +gZffDfMlCfjCSqMcpHPWHszstzHjQwpb +GMnvfGlfvSqvcMMDgDDcfnqSVFRdmTmVdNBTdmRmBFVnLLBT +ZvRHtDcZntLZssMssQBrMdnC +jglqlVdlbqgVWjJMbrrBCpmQBBfrpm +GqVVPPjPNjFVllNjJjFDvzTLZRvcLRLvTGdGDv +fDVzvVfzzZPMsMbb +LHtBwLBdhFgdHLLthRwFGGMsmrHMmmbZSmqbMGGG +bblRwbTRlllfVQnCQn +fVZzjRzpzpVCRPZhVWQvvLsWWWFQlmjWmG +JDHgJdtwbZqJqsWBBDLlQlvLms +cHHtdbqwrqbbtSbTgSTcVCMRZnRRVNhVPNMPpfMc +fCMPBBdpMpsqMssQccnV +TlwGWDjDZHLjZHHlLGmnlnNcRllsJcqtsJRV +ZHhZHThLLrGwjDDjLwGWWWSjPpbpzrvBFBFdBBbqvCbpFfpg +bvDfDPtCVfFFVdWWpmLRmzWzzdBW +jgZTghhjrGrsswrsghHrlgTGzSRmMLwpJMSMzWLLWRzpRRSc +lpjTpGHlpsNGTHllHrCFnDNPtVnvfQtQtQNP +BwlQcwZBwwwQNqJTrrsRGCDTNt +bMpVPSfRvCbCtTqsCs +dPSRfRpPPjjmLMgZBZBLZZwFQnZn +TsVfggTqVnsLVTdTpmDdRhwPRtPRDRwD +ljHBSWZvvFWvBFPppnQPwnpmzR +MSHSjbBclBSjccLJgqgnLVqTbsTT +zncfVgRzVJgnTfVqNHvZJZNJNMpHbdvH +PCBpsLjPPmMGdHNdHBHZ +jSLlrhLPDWLrPrDCLPCfnpzcVRFcRTnlVncntT +ccvSgjHtRjcjSvjvSrBjzSHHwnJPbgwPPZVVVZnPpZlpwnlT +ffqNqGGsGWqLTNqZwdndPnnJJpZVJW +sNmqhsCMQsMTmjrcmrHrRj +gWWWzNVJDwDzVWVDGbGNnhTnHLsmhmhfsQTNSmHd +vtMPZvrZvqtqBHljrqSnnmTfLfdnQsjhjmhL +MMPZPBqZCrBtvZcrBlDbGbbbzHJCbbRwgwDz +hGSRhsMswhcNNGwhwncMnCqCJNrHJPJJrJtCJdqHJm +BgVTzWBdTfCmfCJH +dlbVFvvWVZhSRQDMnlhc +WfpzBZmgJlQVGvWF +wHSbrHwmccnrmrHsClGqFGbQjQjjQJQQGv +SHPwwsRcrrNtrNSsphmZLzpfzhghZPdD +DFDPRpmgbPQtmgBBQDDNJTMMBZsqsZGqGZTGCGSqWG +fVvVVLcJVzlvzhqfSTCsZsMGMHqq +zJdrrdnzcLlwczwbQmQngRDQPbtDpQ +HDZZrpFqwRrQfBqhjjlVlQ +czTgvvWPNgPGcTlsQflCVshClC +PgNvtSJNvGVMMzNzgGvPGGLHFDdFdmZSZRdDdRrmpFwL +SVHNVFVPBHJqHhgFCgzLmCwppm +DvDdsGZljDlfdZnjnnZGMzLpRgLfMCLmzfPLhmgp +jZDZlrvrZTrTrTQrDsjslHNJqtWbWHbqbPBWNVQWBJ +NmGGBdWWJDJTTZHm +hFVhcqFjncpcppSjqfppqDvzDDDbbDZvDZZbHfJgvJ +jrPqnnHnqSPwPGWPdWst +BfhbwMwbbPbHPPPlrdJjrlMJLrJVTd +pnQnGnWDjnJdlJCh +qshsWvpttzNNQDtzRRPvwfcPHBBBHwbw +SHzGRQjhwwhGzjjwRjfBqpqbNCqNnnqqQqPlQC +TZtgLmZgVmgdFgmZtdrbNqnqlNlpblnlrnBd +DvgmvvZgmWJJjwHHhJSzps +JjlrlJjPJgDjJjJnDRDjNwGGqMvSddvPvwQddqSVvq +SLpphFLhFZhWLzvswwWqsqVVQWdv +FSHtTLZpfzRDDrJgRNjT +wjCMvrMlqqWHvWqddrHqgnBNhcffthhVLtpgLBnw +GbQFZzZZphnpgNZV +FhFzRTDRPzsRQGQGTFlllrJHjdsJlHMqjjHr +LqDcTbmJcqSJSTmnrTcmJrfffplfjZsGZfGGZfQLdplj +hWddgBvzWFZfPsQlGh +RBWBRCdHtgHttVVzHBVNNNDwSTDcSSSbScDDwbwbnmRS +FFPzwlZVVrzFFlFLVlllZdHCHPQMnJQQbhhChdhCbb +BRRqGBgRfqvgvBDDDTRgghNCMMTQNNbVJMNJJdbbdT +DfpgjGfsRWrFVzwLcs +PMTSdSmFjhFpNTqvppvRBrRBrDqB +HnZZznJbzGZGlZtZWHlJGcGcwMvQBsrwRDQvcDgrgDgrqRvq +HGlGfnJZfMMCfNhm +nRssqlqVRppVwdMMQwFgtRFz +smTvLLTvvNLtwMMQNg +CmPGBvZGWvBSGGDmTZjZlhpJcpHDJsbDnlrrprpl +djcQGNQqdGdGqMCgndwgCLDMgW +nvBvHpBppnvPPnJTBWLJVMwVfWJfCbfWgW +hsHHpBsvRTHpsPszTBTTsRTslGqGqlcqlScnqmhZmmZSZSjl +DddBHCmfWCBTDBHTHfMpzhzpJJMJsFrGrz +tPVPmbnttjPnZvSvSbnmZPZPNpNGMpJNzzNrGJpvhsshMpFs +mwnZcbmmStbVtVjbZVlcLTBlcLCRHRDWCWWW \ No newline at end of file diff --git a/src/Days/D03.hs b/src/Days/D03.hs new file mode 100644 index 0000000..8b5df73 --- /dev/null +++ b/src/Days/D03.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE ImportQualifiedPost #-} + +module Days.D03 where + +import Data.Char (ord) +import Data.List (intersect) +import Data.List.Extra (chunksOf) +import Lib (Day (StringDay), definitive) + +type Intermediate = [String] + +halves :: [a] -> ([a], [a]) +halves l = splitAt (length l `div` 2) l + +priority :: Char -> Int +priority c = + let o = ord c + in if o < ord 'a' + then o - ord 'A' + 26 + 1 + else o - ord 'a' + 1 + +part1 :: [String] -> Int +part1 = sum . map (priority . head . uncurry intersect . halves) + +part2 :: [String] -> Int +part2 = sum . map (priority . head . foldl1 intersect) . chunksOf 3 + +day :: Day +day = + StringDay + ( \s -> + let l = lines s + in Right (definitive $ part1 l, definitive $ part2 l) + ) diff --git a/src/Lib.hs b/src/Lib.hs index dd69a4b..daf8a09 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -4,13 +4,13 @@ module Lib where -import Util (both, dupe) +import Util (both) import Data.Function ((&)) import Data.Text qualified as T import Data.Text.IO qualified as T import Data.Void (Void) -import Text.Megaparsec qualified as M (Parsec, eof, errorBundlePretty, parse, sepEndBy1) +import Text.Megaparsec qualified as M (Parsec, eof, errorBundlePretty, parse) data Answer where Answer :: (Show a) => a -> Answer diff --git a/src/Print.hs b/src/Print.hs index 23e1831..c0e30c0 100644 --- a/src/Print.hs +++ b/src/Print.hs @@ -1,7 +1,6 @@ module Print where -import Data.Maybe (fromMaybe) -import Lib (DayResult, PuzzleError (..)) +import Lib (DayResult) import Text.Printf (printf) printDR :: Int -> DayResult -> IO () diff --git a/src/Util.hs b/src/Util.hs index ca8eeac..60bf524 100644 --- a/src/Util.hs +++ b/src/Util.hs @@ -5,6 +5,3 @@ dupe a = (a, a) both :: (a -> b) -> (a, a) -> (b, b) both f ~(x, y) = (f x, f y) - -mapSnd :: (b -> c) -> (a, b) -> (a, c) -mapSnd f (a, b) = (a, f b) \ No newline at end of file