From 4ea7c5329c9b8fa540a226fdd43d4d9ab7961f21 Mon Sep 17 00:00:00 2001 From: ctsk <9384305+ctsk@users.noreply.github.com> Date: Thu, 31 Aug 2023 08:41:20 +0200 Subject: [PATCH] Day 7 --- Y2022.cabal | 1 + app/Main.hs | 1 + bench/Bench.hs | 1 + data/07.in | 1079 +++++++++++++++++++++++++++++++++++++++++++++++ src/Days/D07.hs | 196 +++++++++ src/Lib.hs | 2 + 6 files changed, 1280 insertions(+) create mode 100644 data/07.in create mode 100644 src/Days/D07.hs diff --git a/Y2022.cabal b/Y2022.cabal index a5dcb07..f824b48 100644 --- a/Y2022.cabal +++ b/Y2022.cabal @@ -38,6 +38,7 @@ library Days.D04 Days.D05 Days.D06 + Days.D07 build-depends: megaparsec ^>=9.4.0 , text diff --git a/app/Main.hs b/app/Main.hs index 8260445..079fe57 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -14,6 +14,7 @@ paths = , "./data/04.in" , "./data/05.in" , "./data/06.in" + , "./data/07.in" ] solutions :: [(Int, Day, FilePath)] diff --git a/bench/Bench.hs b/bench/Bench.hs index 867898a..8608951 100644 --- a/bench/Bench.hs +++ b/bench/Bench.hs @@ -13,6 +13,7 @@ paths = , "./data/04.in" , "./data/05.in" , "./data/06.in" + , "./data/07.in" ] solutions :: [(Integer, [Day], FilePath)] diff --git a/data/07.in b/data/07.in new file mode 100644 index 0000000..8f22e2f --- /dev/null +++ b/data/07.in @@ -0,0 +1,1079 @@ +$ cd / +$ ls +dir dpbwg +dir dvwfscw +dir hccpl +dir jsgbg +dir lhjmzsl +63532 mwvbpw.mmg +239480 npj +dir pngs +dir qhs +303649 shvgmwn.vhv +236905 sjrrgd.phh +dir sntcp +dir sqs +$ cd dpbwg +$ ls +dir dgh +100731 dpbwg +dir rpwnv +$ cd dgh +$ ls +197049 lhjmzsl.hzj +$ cd .. +$ cd rpwnv +$ ls +10702 qsgv.fmf +$ cd .. +$ cd .. +$ cd dvwfscw +$ ls +dir bvg +dir fbfjs +115450 gjftb.mgd +dir gsmnprgz +dir hdwdcvv +dir mhjtrlqz +75437 qsctddrw +171722 qsgv.zqz +$ cd bvg +$ ls +56335 cgtzb.szt +139481 shvgmwn.vhv +255200 wzqlgr.mhl +$ cd .. +$ cd fbfjs +$ ls +252977 hmcj +256083 mbgfn.pmh +dir qsgv +$ cd qsgv +$ ls +271506 dchsdfz.bbg +202650 hmcj +32623 lqgmfcp +57614 mgp.fbn +220895 qwzqrrq.wjf +$ cd .. +$ cd .. +$ cd gsmnprgz +$ ls +dir dzcsldzw +dir hrjmfd +dir lcwv +dir sdp +62355 zrncdmd.lmj +$ cd dzcsldzw +$ ls +dir hmcj +$ cd hmcj +$ ls +151947 hgtzldbg +$ cd .. +$ cd .. +$ cd hrjmfd +$ ls +dir drjlhbqf +65599 npj +$ cd drjlhbqf +$ ls +263623 hzfmzs.mlj +13866 npj +173713 wtnf.qps +$ cd .. +$ cd .. +$ cd lcwv +$ ls +44150 hmcj.lds +200694 mpbb +$ cd .. +$ cd sdp +$ ls +dir gcwjj +dir qzdczvwn +$ cd gcwjj +$ ls +149603 qsgv.srr +$ cd .. +$ cd qzdczvwn +$ ls +dir gnvbm +291187 hmcj.rgm +dir msdt +dir mwvbpw +dir shpr +$ cd gnvbm +$ ls +259516 dpbwg +120868 mpbb +dir vqrcd +$ cd vqrcd +$ ls +306804 fqqg +34290 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd msdt +$ ls +168438 mpbb +67435 nbqcrdjs +$ cd .. +$ cd mwvbpw +$ ls +dir btzqzvbl +308719 npj +$ cd btzqzvbl +$ ls +177311 bdnrf.jtw +122356 qwhmd.vcd +169153 vzzzccg.hlb +$ cd .. +$ cd .. +$ cd shpr +$ ls +290591 nblzc.nmp +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hdwdcvv +$ ls +96864 hmcj.tjn +$ cd .. +$ cd mhjtrlqz +$ ls +dir bzrbsfjp +238772 fpggqqj +dir hqzgs +20155 shvgmwn.vhv +$ cd bzrbsfjp +$ ls +313691 fnscbhfc +17630 llwfdzgg.bsp +dir lthr +$ cd lthr +$ ls +237053 bhbbzt.bmt +$ cd .. +$ cd .. +$ cd hqzgs +$ ls +295258 gllsgr.nnz +70743 ptpqd +dir rnmsdpmj +205022 rpqh.rpn +158287 tsm.tdq +154025 wmfwr.bcm +$ cd rnmsdpmj +$ ls +218043 dpbwg.mls +149072 mbgfn.pmh +89388 mwvbpw.qfm +57207 rszcvm.mqc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hccpl +$ ls +dir blqdjh +dir hfqw +dir qsgv +$ cd blqdjh +$ ls +dir fbpg +$ cd fbpg +$ ls +231357 dpbwg +$ cd .. +$ cd .. +$ cd hfqw +$ ls +210898 fjblghm.gtg +286252 hmcj.dgz +258768 mpbb +225743 qsgv.pqf +191717 shvgmwn.vhv +$ cd .. +$ cd qsgv +$ ls +dir bslqpr +dir dpbwg +dir lhjmzsl +210707 npj +64435 qhpnrbhq +dir rpj +301426 shvgmwn.vhv +dir stbgbrw +dir vhzmg +$ cd bslqpr +$ ls +4365 dpbwg +dir fpj +dir lhjmzsl +dir lncmt +dir mwvbpw +35725 ncbjtpcb.svf +dir njhsmb +dir rjzsddlw +41533 shvgmwn.vhv +$ cd fpj +$ ls +88146 dpbwg +$ cd .. +$ cd lhjmzsl +$ ls +57400 fzngdsh.sbn +198711 mnqz.npt +$ cd .. +$ cd lncmt +$ ls +192228 qsgv.jss +$ cd .. +$ cd mwvbpw +$ ls +65217 hmcj.drs +$ cd .. +$ cd njhsmb +$ ls +157177 dpbwg.wsl +10919 jhfs +$ cd .. +$ cd rjzsddlw +$ ls +dir cftp +dir flcfwml +dir vpdbl +$ cd cftp +$ ls +89075 dpbwg +57259 mbgfn.pmh +237771 zwglrhh +$ cd .. +$ cd flcfwml +$ ls +51498 pbbgmqn.gfg +$ cd .. +$ cd vpdbl +$ ls +98690 npj +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +dir wlmdbjh +$ cd wlmdbjh +$ ls +dir pmldd +245468 rdgldw.tzb +$ cd pmldd +$ ls +145032 mwvbpw.tpc +$ cd .. +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +233642 dpbwg.tbq +dir frsggjl +dir hmcj +dir jmhzlq +dir jvdtpzd +251765 npj +169647 shvgmwn.vhv +$ cd frsggjl +$ ls +dir dshv +dir fqvpc +dir lhjmzsl +313045 npj +dir rngqmwgr +$ cd dshv +$ ls +dir pptfqn +85609 wpgz +dir zfmqls +$ cd pptfqn +$ ls +258817 mtctcdgd.nmb +39899 npj +$ cd .. +$ cd zfmqls +$ ls +119006 hlw.mzg +295107 wstvdqn.wgw +$ cd .. +$ cd .. +$ cd fqvpc +$ ls +dir pqpf +$ cd pqpf +$ ls +312566 mpbb +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +157261 dpbwg.bgc +76700 mpbb +$ cd .. +$ cd rngqmwgr +$ ls +42626 dpbwg.dtt +78765 gjsnmzn.fzb +$ cd .. +$ cd .. +$ cd hmcj +$ ls +166183 jntzn +dir qsgv +254851 rbcgrdr.vqp +$ cd qsgv +$ ls +256449 dhj.mrm +49207 fbrhl +69922 lhjmzsl +121778 tpdvnb +$ cd .. +$ cd .. +$ cd jmhzlq +$ ls +dir bbpqsf +245813 ftw.jwq +$ cd bbpqsf +$ ls +169373 mwvbpw.tjt +$ cd .. +$ cd .. +$ cd jvdtpzd +$ ls +dir brfln +dir dpbwg +263586 fsqzfhj.bzh +85956 lhjmzsl +dir mwvbpw +dir tcgwhp +91473 vjgt.twz +200413 zlnnrrpn.qqd +$ cd brfln +$ ls +65066 fpvnm +$ cd .. +$ cd dpbwg +$ ls +dir jtqwgc +dir lrdjdqn +281885 mpbb +$ cd jtqwgc +$ ls +219022 spbqn +$ cd .. +$ cd lrdjdqn +$ ls +116830 hmcj.ptr +dir mwvbpw +$ cd mwvbpw +$ ls +251737 ccqlb +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +226329 fztjpfb +$ cd .. +$ cd tcgwhp +$ ls +dir grmsl +$ cd grmsl +$ ls +dir hmcj +197995 wzqlr.fqj +$ cd hmcj +$ ls +239775 mbgfn.pmh +dir rrvccjp +95381 shvgmwn.vhv +$ cd rrvccjp +$ ls +dir qsgv +$ cd qsgv +$ ls +192956 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rpj +$ ls +dir bwc +dir ctjwjlzc +dir dpbwg +dir lhjmzsl +249767 npj +dir wqmlz +$ cd bwc +$ ls +56181 hmcj.dhd +105111 hvw +63869 rqw.srq +8030 shvgmwn.vhv +dir stff +$ cd stff +$ ls +dir gsjsc +$ cd gsjsc +$ ls +514 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd ctjwjlzc +$ ls +39823 qjgnjm.hzn +$ cd .. +$ cd dpbwg +$ ls +dir lhqrjr +$ cd lhqrjr +$ ls +179949 tmvl.zqf +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +305735 shvgmwn.vhv +$ cd .. +$ cd wqmlz +$ ls +141757 fstftggh +$ cd .. +$ cd .. +$ cd stbgbrw +$ ls +196003 dpbwg.shs +dir gbr +104091 hmcj +232145 lhjmzsl.nnc +dir lhv +dir qqqbtpq +51208 qsgv.dbm +235090 vbpzgnr +dir vqmnsdrt +$ cd gbr +$ ls +101809 npj +121922 pcqrmmlt.ghh +125915 ptffhc +128293 wdz.nsd +$ cd .. +$ cd lhv +$ ls +75506 qtwlnvv.nbm +28413 rbwbp +$ cd .. +$ cd qqqbtpq +$ ls +96300 gdf +$ cd .. +$ cd vqmnsdrt +$ ls +146229 mwvbpw.qrc +189540 plldv.vtv +dir rtng +$ cd rtng +$ ls +42730 hrbs.zpc +$ cd .. +$ cd .. +$ cd .. +$ cd vhzmg +$ ls +dir dcmjvhtt +dir dpbwg +$ cd dcmjvhtt +$ ls +85508 hhlctr.bbs +296657 lhjmzsl.zjt +255803 mbgfn.pmh +170803 mtctcdgd.nmb +$ cd .. +$ cd dpbwg +$ ls +156142 hmcj +dir lhjmzsl +$ cd lhjmzsl +$ ls +13590 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd jsgbg +$ ls +202682 hmcj.tbl +$ cd .. +$ cd lhjmzsl +$ ls +197308 lhjmzsl +$ cd .. +$ cd pngs +$ ls +115979 hfpzqf.hjw +dir lhjmzsl +125414 mpbb +dir mwbffchr +$ cd lhjmzsl +$ ls +55108 hwhsjr +$ cd .. +$ cd mwbffchr +$ ls +249138 czv.lgd +$ cd .. +$ cd .. +$ cd qhs +$ ls +108106 ccmhjzp.ppf +197911 shvgmwn.vhv +$ cd .. +$ cd sntcp +$ ls +dir cvgtwsbw +dir dpbwg +dir dqbzfcq +dir gfvtsjmz +dir ljsmjsp +dir mwvbpw +dir phfqzwp +dir rpsnfndl +dir rrqwcbqm +dir rtv +dir vnvft +dir vqcvbncp +dir vsgjds +$ cd cvgtwsbw +$ ls +dir bprbr +dir bpw +dir dpbwg +dir jvjs +dir mwvbpw +dir nbfzn +dir pcr +dir rhgltw +$ cd bprbr +$ ls +126107 dpbwg.jqq +140931 ljhc.gsm +120326 pnjv +dir wbrb +$ cd wbrb +$ ls +28887 ccr.rvd +dir gwfpgws +77898 mwvbpw.qrc +280487 pbfbtb.qjp +$ cd gwfpgws +$ ls +205904 dgm +313203 vpgzr.jfw +$ cd .. +$ cd .. +$ cd .. +$ cd bpw +$ ls +dir lgstpgrn +173334 npj +$ cd lgstpgrn +$ ls +dir rngr +$ cd rngr +$ ls +291856 czjz.fzp +246123 mpbb +200301 qqfvpnz +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +265739 mtctcdgd.nmb +dir mwvbpw +76505 ntjn.mnp +227157 pqznms +312879 qzlmsht +$ cd mwvbpw +$ ls +144523 dpbwg.lgr +39441 mmtrnzqw.mnv +285772 mpbb +306936 rpmgcmqd.qht +$ cd .. +$ cd .. +$ cd jvjs +$ ls +51134 lsnvhd.gsj +$ cd .. +$ cd mwvbpw +$ ls +125428 hmcj.bvd +40162 npj +117658 pmzfj.crj +$ cd .. +$ cd nbfzn +$ ls +11429 mwvbpw.swl +5582 qsgv.jrm +$ cd .. +$ cd pcr +$ ls +dir dpbwg +95858 mtctcdgd.nmb +$ cd dpbwg +$ ls +dir wmsb +$ cd wmsb +$ ls +154498 npj +$ cd .. +$ cd .. +$ cd .. +$ cd rhgltw +$ ls +188447 qsgv.rzs +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +261326 cjfszwr +88528 glp.fgc +dir lhjmzsl +270470 shvgmwn.vhv +310081 vdhmgb +dir wsc +$ cd lhjmzsl +$ ls +245410 dnnfljbs +$ cd .. +$ cd wsc +$ ls +dir lhjmzsl +311302 mbs.tqc +309985 mpbb +dir qgpqzr +20812 vhcc.wpw +$ cd lhjmzsl +$ ls +dir dpbwg +$ cd dpbwg +$ ls +273340 fmvbcphl.crp +$ cd .. +$ cd .. +$ cd qgpqzr +$ ls +dir fdwgdhrf +$ cd fdwgdhrf +$ ls +275421 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dqbzfcq +$ ls +30930 njnz +$ cd .. +$ cd gfvtsjmz +$ ls +290134 mbgfn.pmh +154689 vql +$ cd .. +$ cd ljsmjsp +$ ls +59894 hwggw.rpd +26336 mbgfn.pmh +dir mvzchpq +dir mwvbpw +122061 zlcr.jsw +$ cd mvzchpq +$ ls +294618 lhjmzsl.bqm +dir mwvbpw +204294 nljhbh.cfc +79337 ntvt.dbw +$ cd mwvbpw +$ ls +dir njwcqcjh +309971 nqdv.vmp +$ cd njwcqcjh +$ ls +155159 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +43451 lhjmzsl.vjt +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +3144 phvjzs.prf +$ cd .. +$ cd phfqzwp +$ ls +dir hmcj +dir hnnrw +196279 lhjmzsl +90948 mwvbpw.hvm +275082 shvgmwn.vhv +$ cd hmcj +$ ls +4346 mtctcdgd.nmb +$ cd .. +$ cd hnnrw +$ ls +dir lhjmzsl +103070 qsbrf.tpv +dir rdf +$ cd lhjmzsl +$ ls +158692 dpbwg.bvl +$ cd .. +$ cd rdf +$ ls +dir gpj +dir lbgpm +$ cd gpj +$ ls +136508 shvgmwn.vhv +$ cd .. +$ cd lbgpm +$ ls +154457 ccpvr +232065 lhjmzsl +43787 npj +189920 rpgmvv +96362 tlmvpc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rpsnfndl +$ ls +dir pcbtmcwf +$ cd pcbtmcwf +$ ls +dir qsgv +$ cd qsgv +$ ls +45662 npj +$ cd .. +$ cd .. +$ cd .. +$ cd rrqwcbqm +$ ls +dir vjm +$ cd vjm +$ ls +263137 npj +$ cd .. +$ cd .. +$ cd rtv +$ ls +dir lhjmzsl +dir pcwsn +dir qsgv +dir vvzbsg +$ cd lhjmzsl +$ ls +dir qzsjhsfn +$ cd qzsjhsfn +$ ls +26909 mbgfn.pmh +$ cd .. +$ cd .. +$ cd pcwsn +$ ls +160033 ftz.nbg +145165 wgdjsgsb.hhm +$ cd .. +$ cd qsgv +$ ls +dir jqm +136209 mbgfn.pmh +79664 mghdlnh.chv +$ cd jqm +$ ls +222831 npj +$ cd .. +$ cd .. +$ cd vvzbsg +$ ls +84246 dpbwg.tsq +$ cd .. +$ cd .. +$ cd vnvft +$ ls +dir crqrl +dir scdvzsd +$ cd crqrl +$ ls +13185 dpbwg.twz +109021 qcdqnhg.jjj +$ cd .. +$ cd scdvzsd +$ ls +dir hmcj +$ cd hmcj +$ ls +252155 npj +$ cd .. +$ cd .. +$ cd .. +$ cd vqcvbncp +$ ls +72128 crnhb +dir ddz +dir dvhzvdn +dir ffsbcmg +dir gfs +dir jghlb +dir llq +dir pvn +dir rvqmmjgr +$ cd ddz +$ ls +232302 gdfqpnj.nhf +274940 lhjmzsl.mzv +286217 mpbb +$ cd .. +$ cd dvhzvdn +$ ls +273183 cfnqn.qpz +$ cd .. +$ cd ffsbcmg +$ ls +6544 mtctcdgd.nmb +52511 wndzt.lqb +$ cd .. +$ cd gfs +$ ls +228312 mwvbpw.tdj +dir rqjrfzgt +62100 shc.rtj +313984 szsplzq.dpd +dir tqtnp +$ cd rqjrfzgt +$ ls +296460 bvp +272324 mbgfn.pmh +221044 npj +110232 qvcszzv +$ cd .. +$ cd tqtnp +$ ls +98376 tzwh +212247 wzjj.scp +$ cd .. +$ cd .. +$ cd jghlb +$ ls +dir ddrmsv +$ cd ddrmsv +$ ls +252143 mbgfn.pmh +$ cd .. +$ cd .. +$ cd llq +$ ls +dir lhjmzsl +67341 mbgfn.pmh +155159 npj +dir qsgv +dir vcvnzc +$ cd lhjmzsl +$ ls +151930 ssldrsf.mzm +$ cd .. +$ cd qsgv +$ ls +233702 ztdmtqb.mhf +$ cd .. +$ cd vcvnzc +$ ls +168179 lhjmzsl.cwf +$ cd .. +$ cd .. +$ cd pvn +$ ls +240160 lbd.slf +$ cd .. +$ cd rvqmmjgr +$ ls +24809 gwgcrzp.zhj +dir hmcj +dir lhjmzsl +dir mwvbpw +121997 nbmf +77886 ntp +dir qcqrgdm +$ cd hmcj +$ ls +126073 dpbwg.lhh +dir jchccghv +dir lhjmzsl +144075 qsgv.lbw +288076 swrngbsq.qzw +$ cd jchccghv +$ ls +310277 mpbb +$ cd .. +$ cd lhjmzsl +$ ls +193576 bwsz.crv +16002 mbgfn.pmh +57961 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +dir bsfwmcz +dir dpbwg +121640 mwvbpw +dir pmrfvzw +dir qsgv +$ cd bsfwmcz +$ ls +dir fjqqblz +51952 gqbj.fwd +dir hmcj +dir lctt +81316 lhjmzsl.qqr +6372 mbgfn.pmh +22669 shvgmwn.vhv +130990 zgq.fpv +$ cd fjqqblz +$ ls +26064 zrqrnb.nwf +$ cd .. +$ cd hmcj +$ ls +14385 mwvbpw.vzq +$ cd .. +$ cd lctt +$ ls +137397 fbgbs.fjf +dir jgbzqzq +dir qrr +272639 qsgv.vwm +$ cd jgbzqzq +$ ls +135320 mpbb +$ cd .. +$ cd qrr +$ ls +dir dpbwg +dir mwvbpw +54143 pnsl.bbm +dir wbpzpg +$ cd dpbwg +$ ls +250653 shvgmwn.vhv +$ cd .. +$ cd mwvbpw +$ ls +2682 fhdh.hmt +$ cd .. +$ cd wbpzpg +$ ls +dir bqshqpvm +141398 mtctcdgd.nmb +130729 vtnfmjqm.mgp +$ cd bqshqpvm +$ ls +252449 shvgmwn.vhv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +82216 gwjwmcbf.gwl +$ cd .. +$ cd pmrfvzw +$ ls +dir mwvbpw +dir wtzgjspz +dir zmb +$ cd mwvbpw +$ ls +16736 wbzjzz.mqq +$ cd .. +$ cd wtzgjspz +$ ls +dir vjb +$ cd vjb +$ ls +301763 drchphtm +$ cd .. +$ cd .. +$ cd zmb +$ ls +201978 mdj +dir qgnffw +147889 qzbmwpnm.gjp +$ cd qgnffw +$ ls +17740 cwz.dhs +222345 mbgfn.pmh +81554 npj +206597 tsnlnzh +$ cd .. +$ cd .. +$ cd .. +$ cd qsgv +$ ls +dir mmsnzr +$ cd mmsnzr +$ ls +160502 tgrztm +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +40049 qmmdv +313418 qsgv.srp +$ cd .. +$ cd qcqrgdm +$ ls +202848 wtl.qbj +$ cd .. +$ cd .. +$ cd .. +$ cd vsgjds +$ ls +138690 npj +22984 tpfbnz.sgj +$ cd .. +$ cd .. +$ cd sqs +$ ls +dir zms +$ cd zms +$ ls +152096 cvtqph.wwp +dir mmwzg +$ cd mmwzg +$ ls +100870 qsgv diff --git a/src/Days/D07.hs b/src/Days/D07.hs new file mode 100644 index 0000000..10ceac2 --- /dev/null +++ b/src/Days/D07.hs @@ -0,0 +1,196 @@ +{- + + Adapted from: https://notes.abhinavsarkar.net/2022/aoc-7 + +-} +{-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} + +module Days.D07 (day) where + +import Data.Map (Map) +import Data.Map qualified as M + +import Numeric (showInt) + +import Common +import Parse +import Text.Megaparsec (anySingleBut, some, (<|>)) +import Text.Megaparsec.Char (char, space, string) + +type Size = Int +type Name = String + +newtype File = F Size deriving (Show) +data Dir = D + { subdirs :: Map Name Dir + , files :: Map Name File + } + deriving (Show) + +newtype Fs = Root Dir + +emptyDir :: Dir +emptyDir = D{subdirs = M.empty, files = M.empty} + +emptyFs :: Fs +emptyFs = Root emptyDir + +instance Show Fs where + show (Root rootDir) = showDir 0 ("/", rootDir) "" + where + indent :: Int -> ShowS + indent n = showString (replicate (2 * n) ' ') + + showDirs :: Int -> [(Name, Dir)] -> ShowS + showDirs d = foldr ((.) . showDir d) id + + showDir :: Int -> (Name, Dir) -> ShowS + showDir depth (name, dir) = + indent depth + . showString "- " + . showString name + . showDirs depth (M.toList $ subdirs dir) + . showFiles depth (M.toList $ files dir) + + showFiles :: Int -> [(Name, File)] -> ShowS + showFiles d = foldr ((.) . showFile d) id + + showFile :: Int -> (Name, File) -> ShowS + showFile d (name, F size) = + indent d + . showString "- " + . showString name + . showString "(file, size=" + . showInt size + . showString ")\n" + +insertFile :: Name -> File -> Dir -> Dir +insertFile k v d = d{files = M.insert k v (files d)} + +insertDir :: Name -> Dir -> Dir -> Dir +insertDir k v d = d{subdirs = M.insert k v (subdirs d)} + +findDir :: Name -> Dir -> Maybe Dir +findDir k d = M.lookup k (subdirs d) + +data FsZipper = FsZipper + { path :: [(Name, Dir)] + , current :: Dir + , name :: Name + } + deriving (Show) + +moveUp :: FsZipper -> FsZipper +moveUp (FsZipper [] _ _) = error "Can't ascend beyond the root" +moveUp (FsZipper ((pName, pDir) : ds) current name) = + FsZipper ds (insertDir name current pDir) pName + +moveDown :: String -> FsZipper -> FsZipper +moveDown targetName (FsZipper path current name) = + case findDir targetName current of + Nothing -> error "Can not descend into non-dir" + Just targetDir -> FsZipper ((name, current) : path) targetDir targetName + +moveToRoot :: FsZipper -> FsZipper +moveToRoot zipper = case zipper of + FsZipper [] _ _ -> zipper + _ -> moveToRoot (moveUp zipper) + +mkdir :: Name -> FsZipper -> FsZipper +mkdir dirName (FsZipper{..}) = + FsZipper path (insertDir dirName emptyDir current) name + +mkfile :: Name -> Size -> FsZipper -> FsZipper +mkfile fname fsize (FsZipper{..}) = + FsZipper path (insertFile fname (F fsize) current) name + +toZipper :: Fs -> FsZipper +toZipper (Root d) = FsZipper [] d "/" + +fromZipper :: FsZipper -> Fs +fromZipper = Root . current . moveToRoot + +data CdArg = CdDown String | CdUp | CdRoot deriving (Show) +data Command = Cd CdArg | Ls deriving (Show) +data Output = OutputFile Int String | OutputDir String deriving (Show) +data Line = LCommand Command | LOutput Output deriving (Show) + +parser :: Parser Fs +parser = buildFs <$> someLines ((LCommand <$> commandParser) <|> (LOutput <$> outputParser)) + where + nameParser :: Parser String + nameParser = some $ anySingleBut '\n' + + cdParser :: Parser CdArg + cdParser = + string "cd" + *> space + *> ( CdUp + <$ string ".." + <|> CdRoot + <$ char '/' + <|> CdDown + <$> nameParser + ) + + commandParser :: Parser Command + commandParser = + char '$' + *> space + *> (Cd <$> cdParser <|> Ls <$ string "ls") + + outputParser :: Parser Output + outputParser = + ( OutputDir + <$ string "dir" + <* space + <*> nameParser + ) + <|> ( OutputFile + <$> number + <* space + <*> nameParser + ) + +apply :: Line -> FsZipper -> FsZipper +apply = \case + LCommand (Cd CdUp) -> moveUp + LCommand (Cd CdRoot) -> moveToRoot + LCommand (Cd (CdDown name)) -> moveDown name + LCommand Ls -> id + LOutput (OutputFile size name) -> mkfile name size + LOutput (OutputDir name) -> mkdir name + +buildFs :: [Line] -> Fs +buildFs = fromZipper . foldl (flip apply) (toZipper emptyFs) + +dirSizes :: Dir -> (Int, [Int]) +dirSizes = go + where + go :: Dir -> (Int, [Int]) + go dir = + let subdirGo = map go . M.elems $ subdirs dir + subdirNested = concatMap snd subdirGo + subdirSizes = sum $ map fst subdirGo + dirSize = subdirSizes + filesSize dir + in ( dirSize + , dirSize : subdirNested + ) + + filesSize :: Dir -> Int + filesSize = sum . map (\(F size) -> size) . M.elems . files + +part1 :: Fs -> Int +part1 (Root dir) = sum . filter (< 100000) . snd $ dirSizes dir + +part2 :: Fs -> Int +part2 (Root dir) = + let (total, ds) = dirSizes dir + requiredSpace = total - (70000000 - 30000000) + in minimum $ filter (> requiredSpace) ds + +day :: Day +day = parsecDay parser (definitive . part1, definitive . part2) \ No newline at end of file diff --git a/src/Lib.hs b/src/Lib.hs index 87be996..62b9281 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -17,6 +17,7 @@ import Days.D03 qualified as D03 import Days.D04 qualified as D04 import Days.D05 qualified as D05 import Days.D06 qualified as D06 +import Days.D07 qualified as D07 import Data.Text.IO qualified as T @@ -33,4 +34,5 @@ days = , [D04.day] , [D05.day] , [D06.day] + , [D07.day] ]