Tidying
authorNeil Smith <NeilNjae@users.noreply.github.com>
Wed, 7 Dec 2022 18:23:28 +0000 (18:23 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Wed, 7 Dec 2022 18:23:28 +0000 (18:23 +0000)
advent-of-code22.cabal
advent07/Main.hs [new file with mode: 0644]
data/advent07.txt [new file with mode: 0644]
data/advent07a.txt [new file with mode: 0644]
data/advent07b.txt [new file with mode: 0644]
problems/day07.html [new file with mode: 0644]

index c7012e989e349c8a92ec5158ef4d0baac229d1bc..4ad8da096ca144d415ff075536892ed85d5103bd 100644 (file)
@@ -131,4 +131,8 @@ executable advent05
 executable advent06
   import: common-extensions, build-directives
   main-is: advent06/Main.hs
-  
\ No newline at end of file
+executable advent07
+  import: common-extensions, build-directives
+  main-is: advent07/Main.hs
+  build-depends: text, attoparsec, containers, path-tree, rosezipper
diff --git a/advent07/Main.hs b/advent07/Main.hs
new file mode 100644 (file)
index 0000000..dcc076c
--- /dev/null
@@ -0,0 +1,138 @@
+-- Writeup at https://work.njae.me.uk/2022/12/07/advent-of-code-2022-day-7/
+
+import AoC
+import Data.Text (Text)
+import qualified Data.Text.IO as TIO
+import Data.Attoparsec.Text hiding (take)
+import Control.Applicative
+import Data.Char
+import Data.Maybe
+import Data.Tree
+import Data.Tree.Zipper hiding (tree)
+import qualified Data.Map.Strict as M
+-- import Data.Map.Strict ((!), (!?))
+import Data.List (foldl', sort)
+
+data ParsedObject = CD String 
+                  | LS 
+                  | PDirectory String 
+                  | PFile Int String 
+                  deriving Show
+
+data Directory = Dir String (M.Map String Int)
+  deriving (Show, Eq)
+
+data ContainedSize = CSize String Integer
+  deriving (Show, Eq)
+
+type DTree = Tree Directory
+type ZDTree = TreePos Full Directory
+type STree = Tree ContainedSize
+
+reportingThreshold, spaceAvailable, spaceRequired :: Integer
+reportingThreshold =   100000
+spaceAvailable     = 70000000
+spaceRequired      = 30000000
+
+main :: IO ()
+main = 
+  do  dataFileName <- getDataFileName
+      text <- TIO.readFile dataFileName
+      let trace = successfulParse text
+      let tree = mkTree trace emptyTree
+      let sizedTree = transitiveSizes $ containingSizes tree
+      print $ part1 sizedTree
+      print $ part2 sizedTree
+
+part1, part2 :: STree -> Integer
+part1 = foldTree (\x xs -> sum (x:xs)) . fmap cancelLarge 
+
+part2 tree = spaceFreed
+  where nodes = fmap extractCSize $ flatten tree
+        spaceUsed = extractCSize $ rootLabel tree
+        spaceUnused = spaceAvailable - spaceUsed
+        spaceToFree = spaceRequired - spaceUnused
+        viableNodes = filter (>= spaceToFree) nodes
+        spaceFreed = head $ sort viableNodes
+
+emptyTree :: DTree
+emptyTree = Node {rootLabel = (Dir "/" M.empty), subForest = []}
+
+mkTree :: [ParsedObject] -> DTree -> DTree
+mkTree trace tree = toTree $ root $ makeTree trace $ fromTree tree
+
+makeTree :: [ParsedObject] -> ZDTree -> ZDTree
+makeTree trace tree = foldl' processCommand tree trace
+
+processCommand :: ZDTree -> ParsedObject -> ZDTree
+processCommand tree (CD name)
+  | name == "/" = root tree
+  | name == ".." = fromJust $ parent tree
+  | otherwise = fromJust $ childWithName name tree
+processCommand tree LS = tree
+processCommand tree (PFile size name) = 
+  modifyLabel (\ (Dir n fs) -> Dir n (M.insert name size fs)) tree
+processCommand tree (PDirectory name) = 
+  if (isJust $ childWithName name tree)
+  then tree
+  else fromJust $ parent $ insert (Node { rootLabel = (Dir name M.empty)
+                                        , subForest = []
+                                        }) $ children tree
+
+
+childWithName :: String -> ZDTree -> Maybe ZDTree
+childWithName name tree = searchForChild name (firstChild tree)
+
+searchForChild :: String -> Maybe ZDTree -> Maybe ZDTree
+searchForChild _name Nothing = Nothing
+searchForChild name (Just tree)
+  | name == labelName = Just tree
+  | otherwise = searchForChild name (next tree)
+  where (Dir labelName _) = label tree
+
+containingSizes :: DTree -> STree
+containingSizes (Node {rootLabel = (Dir name files), subForest = sf}) = 
+  (Node {rootLabel = (CSize name sizeHere), subForest = sizedTrees})
+  where sizeHere = M.foldl (+) 0 $ M.map fromIntegral files
+        sizedTrees = fmap containingSizes sf
+
+transitiveSizes :: STree -> STree
+transitiveSizes (Node {rootLabel = (CSize name sizeHere), subForest = sf}) =
+  (Node {rootLabel = (CSize name (sizeHere + subSizes)), subForest = sizedTrees })
+  where sizedTrees = fmap transitiveSizes sf
+        subSizes = sum $ fmap (extractCSize . rootLabel) sizedTrees
+
+extractCSize, cancelLarge :: ContainedSize -> Integer
+extractCSize (CSize _ s) = s
+
+cancelLarge (CSize _ s) 
+  | s <= reportingThreshold = s
+  | otherwise = 0
+
+-- Parse the input file
+
+traceP :: Parser [ParsedObject]
+lineP :: Parser ParsedObject
+cdP :: Parser ParsedObject
+lsP :: Parser ParsedObject
+fileP :: Parser ParsedObject
+directoryP :: Parser ParsedObject
+letterP :: Parser Char
+nameP :: Parser String
+
+traceP = lineP `sepBy` endOfLine
+
+lineP = cdP <|> lsP <|> directoryP <|> fileP
+cdP = CD <$> ("$ cd " *> nameP)
+lsP = LS <$ "$ ls"
+fileP = PFile <$> (decimal <* " ") <*> nameP
+directoryP = PDirectory <$> ("dir " *> nameP)
+
+nameP = many1 letterP
+letterP = satisfy (not . isSpace)
+
+successfulParse :: Text -> [ParsedObject]
+successfulParse input = 
+  case parseOnly traceP input of
+    Left  _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err
+    Right commands -> commands
diff --git a/data/advent07.txt b/data/advent07.txt
new file mode 100644 (file)
index 0000000..c371fe1
--- /dev/null
@@ -0,0 +1,1101 @@
+$ cd /
+$ ls
+dir grdd
+270251 hjlvwtph.jzv
+230026 jzmgcj.gmd
+dir nns
+dir rrfflbql
+$ cd grdd
+$ ls
+233044 mqbz.fcp
+dir nnch
+82939 rgtvsqsh.psq
+150253 srvg.dth
+$ cd nnch
+$ ls
+4014 mqbz.fcp
+$ cd ..
+$ cd ..
+$ cd nns
+$ ls
+dir cgbdghtd
+dir dnh
+dir gjhp
+dir jwjm
+dir mrpfzd
+dir ncvv
+dir pfnglqgw
+dir tlh
+dir vnrhpc
+$ cd cgbdghtd
+$ ls
+276941 jrrcdgz.szm
+$ cd ..
+$ cd dnh
+$ ls
+269539 nnch
+220637 sjzmpwwb
+$ cd ..
+$ cd gjhp
+$ ls
+dir czclvmwc
+dir jgtzfsm
+$ cd czclvmwc
+$ ls
+179729 fzqvvlg
+67916 pmsdthr.prv
+$ cd ..
+$ cd jgtzfsm
+$ ls
+151591 rcggj.nwm
+$ cd ..
+$ cd ..
+$ cd jwjm
+$ ls
+203559 nnch
+$ cd ..
+$ cd mrpfzd
+$ ls
+dir pfnglqgw
+204978 qscs.vpq
+16184 tbfwpmp.hvl
+$ cd pfnglqgw
+$ ls
+dir wvzw
+dir ztl
+$ cd wvzw
+$ ls
+195912 jpn.ndh
+143238 nnch.djz
+2239 pmsdthr.prv
+dir sfqq
+$ cd sfqq
+$ ls
+134913 pthmqd
+dir vcdhz
+$ cd vcdhz
+$ ls
+13800 ffhv.jnq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ztl
+$ ls
+181007 mqbz.fcp
+266517 zbpjz.gbr
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ncvv
+$ ls
+296494 ccmvjm.bjb
+20801 hjr
+32494 mqbz.fcp
+dir nnch
+dir pfnglqgw
+dir qpq
+dir rftzzmq
+dir wgblcl
+294511 wrdmgdb.fmh
+$ cd nnch
+$ ls
+dir hjzpfvm
+dir ncvv
+dir pffr
+dir pfnglqgw
+dir ssdffgsq
+$ cd hjzpfvm
+$ ls
+304078 mqbz.fcp
+dir nnch
+146425 nnch.lrw
+dir vcfglm
+dir zhscvh
+$ cd nnch
+$ ls
+311625 gqmpvplj.vjg
+248744 ndfcj
+$ cd ..
+$ cd vcfglm
+$ ls
+dir btptvs
+dir ghpvzvzp
+146354 nnch
+$ cd btptvs
+$ ls
+127157 nqnnwq.rtz
+16115 pmsdthr.prv
+$ cd ..
+$ cd ghpvzvzp
+$ ls
+dir ncvv
+$ cd ncvv
+$ ls
+236869 pmsdthr.prv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd zhscvh
+$ ls
+225337 glpz
+$ cd ..
+$ cd ..
+$ cd ncvv
+$ ls
+dir nljtcssr
+dir svjhsvjh
+$ cd nljtcssr
+$ ls
+258085 gqmpvplj.vjg
+dir ncvv
+dir qmzfgcr
+249049 wznr.gbs
+dir zvvpqlmq
+$ cd ncvv
+$ ls
+147686 ndfcj.sfr
+$ cd ..
+$ cd qmzfgcr
+$ ls
+162245 ndfcj.nlj
+$ cd ..
+$ cd zvvpqlmq
+$ ls
+160481 ggnc
+$ cd ..
+$ cd ..
+$ cd svjhsvjh
+$ ls
+dir bjqbmt
+58138 gqmpvplj.vjg
+dir nsvf
+154398 rrhjs.gch
+dir wmvhmlr
+$ cd bjqbmt
+$ ls
+252614 ndfcj.wzg
+153886 nnch
+214625 zhmdvb
+$ cd ..
+$ cd nsvf
+$ ls
+274932 nnch.jfg
+$ cd ..
+$ cd wmvhmlr
+$ ls
+137205 nnch
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pffr
+$ ls
+89895 cwpnzngf.swg
+197833 jgv
+184768 jjhzddp.fbb
+31033 tpngfdsg.brv
+$ cd ..
+$ cd pfnglqgw
+$ ls
+228015 ccmvjm.bjb
+$ cd ..
+$ cd ssdffgsq
+$ ls
+165887 gqmpvplj.vjg
+dir lfq
+dir nnch
+170828 qjb.mnp
+dir ttj
+$ cd lfq
+$ ls
+257411 gqmpvplj.vjg
+137375 jzmgcj.gmd
+267329 nsbsgd.zvq
+$ cd ..
+$ cd nnch
+$ ls
+dir mrfwfq
+171186 ndhqthf.jlp
+$ cd mrfwfq
+$ ls
+100447 lsfsh.mvr
+$ cd ..
+$ cd ..
+$ cd ttj
+$ ls
+49634 ndfcj
+dir tqvld
+$ cd tqvld
+$ ls
+dir ndfcj
+$ cd ndfcj
+$ ls
+dir gnzj
+80690 pmlnbvj
+12843 zbrfmfgj.lzr
+$ cd gnzj
+$ ls
+dir wtpzrpn
+$ cd wtpzrpn
+$ ls
+33840 gqmpvplj.vjg
+18122 rrfflbql.vws
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+289092 fdjfvb
+$ cd ..
+$ cd qpq
+$ ls
+126281 ccmvjm.bjb
+dir crtzrd
+231988 jzmgcj.gmd
+203061 mgmmp
+272098 mqbz.fcp
+dir pfnglqgw
+dir qzvcsn
+105003 rrfflbql.mcm
+$ cd crtzrd
+$ ls
+162336 fsps
+100215 mctd.wsz
+67983 mqbz.fcp
+281538 mqq.cgz
+dir ndfcj
+dir rrfflbql
+dir wbmtvr
+$ cd ndfcj
+$ ls
+290647 pfjczr.wjc
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir mpr
+dir ncvv
+dir rrfflbql
+301818 zml.qfj
+$ cd mpr
+$ ls
+237300 gqmpvplj.vjg
+dir pfnglqgw
+$ cd pfnglqgw
+$ ls
+dir brnwdjtg
+dir dvqlmzw
+248787 pmsdthr.prv
+$ cd brnwdjtg
+$ ls
+256129 ncvv
+dir ptztp
+$ cd ptztp
+$ ls
+104775 nnch.wlc
+$ cd ..
+$ cd ..
+$ cd dvqlmzw
+$ ls
+25407 twgqbrtl
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ncvv
+$ ls
+dir jvwvsm
+62293 jzmgcj.gmd
+261836 mqbz.fcp
+dir vvvrf
+$ cd jvwvsm
+$ ls
+222978 ccmvjm.bjb
+207799 jzmgcj.gmd
+dir pcvsvcn
+248569 pmsdthr.prv
+dir wmd
+$ cd pcvsvcn
+$ ls
+39803 pmsdthr.prv
+$ cd ..
+$ cd wmd
+$ ls
+9516 rfstbvj.nhz
+$ cd ..
+$ cd ..
+$ cd vvvrf
+$ ls
+dir ncvv
+dir znwc
+$ cd ncvv
+$ ls
+110667 jzmgcj.gmd
+$ cd ..
+$ cd znwc
+$ ls
+182248 ndfcj.crv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rrfflbql
+$ ls
+231013 ccmvjm.bjb
+dir jlc
+dir rrfflbql
+79210 ttm.zmw
+$ cd jlc
+$ ls
+28096 ccmvjm.bjb
+113156 pmsdthr.prv
+$ cd ..
+$ cd rrfflbql
+$ ls
+234558 lbg.bpn
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd wbmtvr
+$ ls
+285832 fqhs
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+110965 nnch
+195414 pmsdthr.prv
+243812 thcpw.jfw
+$ cd ..
+$ cd qzvcsn
+$ ls
+279179 gqmpvplj.vjg
+191705 mhmlfc.czv
+146298 pfnglqgw.ppm
+2775 pmsdthr.prv
+$ cd ..
+$ cd ..
+$ cd rftzzmq
+$ ls
+310418 bddhlvs.rwm
+152681 cdznrjl
+278447 rrfflbql
+dir tmcltf
+$ cd tmcltf
+$ ls
+dir mzr
+$ cd mzr
+$ ls
+24154 ccmvjm.bjb
+dir nnch
+dir rqsbw
+$ cd nnch
+$ ls
+100523 mqbz.fcp
+$ cd ..
+$ cd rqsbw
+$ ls
+64033 czzqg.pcz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd wgblcl
+$ ls
+235768 dvdzbgv.vwl
+186757 jzmgcj.gmd
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+129407 zfphqcsf.cfn
+$ cd ..
+$ cd tlh
+$ ls
+89310 jzmgcj.gmd
+21486 nwnbbmr.lsq
+40023 rdmtp.zsf
+$ cd ..
+$ cd vnrhpc
+$ ls
+104731 gqmpvplj.vjg
+176015 grn
+3646 jzmgcj.gmd
+dir ncvv
+45414 nfrj.lvq
+233767 pfnglqgw.bvf
+$ cd ncvv
+$ ls
+252691 ccmvjm.bjb
+dir ncvv
+dir vwv
+dir wwmwfbf
+$ cd ncvv
+$ ls
+306441 qfhhnmqz.snc
+$ cd ..
+$ cd vwv
+$ ls
+56033 rrfflbql
+$ cd ..
+$ cd wwmwfbf
+$ ls
+45964 gqmpvplj.vjg
+118391 mvwl
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rrfflbql
+$ ls
+175540 bcw.sqp
+154750 ggncvs.nvn
+dir jqzm
+dir mgbglnr
+192820 ndfcj
+dir pfnglqgw
+217147 qjng.svz
+dir rrfflbql
+$ cd jqzm
+$ ls
+dir ncvv
+dir nfcvcddz
+242934 rjwlgm
+dir wzj
+$ cd ncvv
+$ ls
+298067 pfnglqgw.jdv
+$ cd ..
+$ cd nfcvcddz
+$ ls
+261264 gqmpvplj.vjg
+19464 mqbz.fcp
+121507 ncqhrf
+dir ndfcj
+58485 ndfcj.vhh
+dir rcrzjm
+228359 wnftnshq
+$ cd ndfcj
+$ ls
+309008 bwn
+$ cd ..
+$ cd rcrzjm
+$ ls
+48178 fgzpwhvt
+129342 qns.lnj
+$ cd ..
+$ cd ..
+$ cd wzj
+$ ls
+91384 gqmpvplj.vjg
+dir nnch
+dir rzm
+$ cd nnch
+$ ls
+dir sgbwrl
+$ cd sgbwrl
+$ ls
+dir ndfcj
+$ cd ndfcj
+$ ls
+295624 cbmdr
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rzm
+$ ls
+dir cprj
+86746 dfwsj.hqq
+dir dljnvq
+dir ndfcj
+159465 nsglq
+202670 pfnglqgw.wbh
+29700 rrfflbql.wln
+dir vgtftq
+$ cd cprj
+$ ls
+148192 gqmpvplj.vjg
+165473 hwp.ltc
+$ cd ..
+$ cd dljnvq
+$ ls
+91675 pmsdthr.prv
+$ cd ..
+$ cd ndfcj
+$ ls
+83124 rrfflbql.ghs
+$ cd ..
+$ cd vgtftq
+$ ls
+186744 mqbz.fcp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mgbglnr
+$ ls
+dir ddtcz
+dir ncvv
+dir nhpwf
+dir rrfflbql
+203683 ttbc
+dir tvbjgv
+dir wvzcq
+$ cd ddtcz
+$ ls
+61553 wfzj
+$ cd ..
+$ cd ncvv
+$ ls
+37589 ccmvjm.bjb
+87987 dnct
+196537 ndfcj.cqg
+40448 pmsdthr.prv
+$ cd ..
+$ cd nhpwf
+$ ls
+243345 gqmpvplj.vjg
+53165 nnch.gfc
+dir pfnglqgw
+dir vdnnf
+$ cd pfnglqgw
+$ ls
+131411 mhvzv.scz
+142119 nnch.gnt
+$ cd ..
+$ cd vdnnf
+$ ls
+83904 ccmvjm.bjb
+dir czfqdtd
+dir dgblftbz
+dir jnftbbtm
+dir pfbnl
+dir pfnglqgw
+$ cd czfqdtd
+$ ls
+dir nnch
+$ cd nnch
+$ ls
+255744 ndfcj.ldv
+$ cd ..
+$ cd ..
+$ cd dgblftbz
+$ ls
+278883 ncvv.zph
+dir pfnglqgw
+133315 phns.cmq
+130316 sftj
+$ cd pfnglqgw
+$ ls
+174155 vnwtv
+$ cd ..
+$ cd ..
+$ cd jnftbbtm
+$ ls
+255828 nmln
+30605 pfnglqgw
+$ cd ..
+$ cd pfbnl
+$ ls
+8603 ndfcj
+$ cd ..
+$ cd pfnglqgw
+$ ls
+235364 pmsdthr.prv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir gfgbj
+$ cd gfgbj
+$ ls
+215226 jzmgcj.gmd
+$ cd ..
+$ cd ..
+$ cd tvbjgv
+$ ls
+dir nnch
+$ cd nnch
+$ ls
+dir gmsb
+$ cd gmsb
+$ ls
+dir tlqdvpr
+$ cd tlqdvpr
+$ ls
+130013 hzrq.zrg
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd wvzcq
+$ ls
+dir ncvv
+$ cd ncvv
+$ ls
+103168 ccmvjm.bjb
+18537 ncvv
+dir nnch
+dir rrfflbql
+$ cd nnch
+$ ls
+20928 ndfcj.lln
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir lgfwf
+$ cd lgfwf
+$ ls
+dir fmzqt
+dir rrfflbql
+$ cd fmzqt
+$ ls
+301419 gqmpvplj.vjg
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir nbvqch
+$ cd nbvqch
+$ ls
+298966 csqvdql.cwr
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+dir bhmndjpq
+203077 fssbcjcm.hvt
+dir lfslp
+dir ncvv
+dir nftdcrl
+dir nnch
+dir pfnglqgw
+dir qfbbnr
+dir wttc
+$ cd bhmndjpq
+$ ls
+299744 cmgwwccb.tvv
+173562 fpwv
+dir hmnbfdtr
+dir jqpcs
+73425 mqbz.fcp
+dir ncvv
+dir ndfcj
+95707 pmsdthr.prv
+dir ptzdv
+dir qzhrsnqh
+dir sbqg
+$ cd hmnbfdtr
+$ ls
+dir pfnglqgw
+dir qmpplbtv
+77228 tvpdstcn.zbb
+$ cd pfnglqgw
+$ ls
+dir dwr
+dir jmgp
+102634 mqbz.fcp
+148654 ncvv
+257637 ncvv.nzn
+286938 rrfflbql
+$ cd dwr
+$ ls
+141669 ndfcj
+9012 ptrlq.stq
+$ cd ..
+$ cd jmgp
+$ ls
+78473 pfnglqgw
+$ cd ..
+$ cd ..
+$ cd qmpplbtv
+$ ls
+202948 wjp.rgt
+$ cd ..
+$ cd ..
+$ cd jqpcs
+$ ls
+290654 fmmcph
+8123 zrr.vqm
+$ cd ..
+$ cd ncvv
+$ ls
+dir hbrttp
+$ cd hbrttp
+$ ls
+128004 nffzj
+$ cd ..
+$ cd ..
+$ cd ndfcj
+$ ls
+dir vscwfsl
+$ cd vscwfsl
+$ ls
+251706 snww.dzb
+$ cd ..
+$ cd ..
+$ cd ptzdv
+$ ls
+113702 nnch
+$ cd ..
+$ cd qzhrsnqh
+$ ls
+118758 gqmpvplj.vjg
+75504 vcnn.stz
+102737 zvv
+$ cd ..
+$ cd sbqg
+$ ls
+287663 bhcpslm.wwt
+dir bqr
+dir czhfphh
+39170 fqn
+dir gqnts
+267314 hlv.ljc
+8701 jqpdpg.prz
+dir ncvv
+211749 psln.pdq
+$ cd bqr
+$ ls
+dir chjfw
+dir dgccfvtl
+219440 fvfsfz
+262276 jzmgcj.gmd
+dir ndfcj
+294287 pfnglqgw.lwh
+163881 rrfflbql
+278231 vgjm.rrh
+$ cd chjfw
+$ ls
+134800 hvmvqbz.bqj
+$ cd ..
+$ cd dgccfvtl
+$ ls
+155579 lwmqrd.wvp
+$ cd ..
+$ cd ndfcj
+$ ls
+144255 ncvv.hrn
+236730 ndfcj
+dir pfz
+$ cd pfz
+$ ls
+297448 rrfflbql.fdt
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd czhfphh
+$ ls
+dir wmws
+$ cd wmws
+$ ls
+14499 ncvv
+$ cd ..
+$ cd ..
+$ cd gqnts
+$ ls
+165940 ccmvjm.bjb
+dir gjcm
+dir hldzdlrl
+dir jtnpgg
+dir nnch
+287896 pmsdthr.prv
+$ cd gjcm
+$ ls
+125716 gqmpvplj.vjg
+dir mhjm
+197155 msspbg
+176407 trtdggnf
+$ cd mhjm
+$ ls
+18749 jzmgcj.gmd
+252999 nnch
+76392 rrfflbql.mzh
+$ cd ..
+$ cd ..
+$ cd hldzdlrl
+$ ls
+dir gzpcgj
+dir rvvgn
+$ cd gzpcgj
+$ ls
+dir vfz
+$ cd vfz
+$ ls
+183852 pmsdthr.prv
+$ cd ..
+$ cd ..
+$ cd rvvgn
+$ ls
+143443 ndfcj
+$ cd ..
+$ cd ..
+$ cd jtnpgg
+$ ls
+dir dhvd
+dir hlmgslbs
+dir rrfflbql
+dir vmqpcm
+$ cd dhvd
+$ ls
+131598 ltr.rph
+$ cd ..
+$ cd hlmgslbs
+$ ls
+173562 rrfflbql
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir ghvmc
+$ cd ghvmc
+$ ls
+311611 jzmgcj.gmd
+$ cd ..
+$ cd ..
+$ cd vmqpcm
+$ ls
+192032 mqbz.fcp
+$ cd ..
+$ cd ..
+$ cd nnch
+$ ls
+112995 ccmvjm.bjb
+$ cd ..
+$ cd ..
+$ cd ncvv
+$ ls
+106711 dswpw.wgr
+46614 jzmgcj.gmd
+115391 mqbz.fcp
+dir nnch
+61970 pmsdthr.prv
+dir rrfflbql
+$ cd nnch
+$ ls
+50060 gqjtv.gcs
+dir lnmmd
+73078 ncvv
+49129 tfb
+dir vgwpcjrl
+dir wnqlrqlf
+$ cd lnmmd
+$ ls
+71780 gqmpvplj.vjg
+$ cd ..
+$ cd vgwpcjrl
+$ ls
+8269 zcspgw
+$ cd ..
+$ cd wnqlrqlf
+$ ls
+dir wzsvhssb
+$ cd wzsvhssb
+$ ls
+187249 jzmgcj.gmd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rrfflbql
+$ ls
+dir bpzmvds
+24889 hfnbzcn
+dir lqffwfr
+274793 nnch.svh
+dir rhwm
+$ cd bpzmvds
+$ ls
+298048 tfnqwpj
+$ cd ..
+$ cd lqffwfr
+$ ls
+dir mzfpbjtl
+$ cd mzfpbjtl
+$ ls
+217469 jzmgcj.gmd
+$ cd ..
+$ cd ..
+$ cd rhwm
+$ ls
+54198 gqmpvplj.vjg
+dir tlnmwhdt
+$ cd tlnmwhdt
+$ ls
+94380 ndfcj.bvv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lfslp
+$ ls
+dir cmrwvp
+dir cnh
+311549 jgmf.fbs
+dir jtgrbqvj
+166298 pbwsqpcg.whf
+151437 pfnglqgw.mcj
+dir sqlwn
+$ cd cmrwvp
+$ ls
+217666 pmsdthr.prv
+172469 vzw.rqw
+$ cd ..
+$ cd cnh
+$ ls
+84011 jfb.mpt
+$ cd ..
+$ cd jtgrbqvj
+$ ls
+dir dcfpfq
+dir ghhs
+dir ntbmh
+dir pfnglqgw
+$ cd dcfpfq
+$ ls
+159731 pfnglqgw
+$ cd ..
+$ cd ghhs
+$ ls
+104713 blwnhcn
+$ cd ..
+$ cd ntbmh
+$ ls
+174007 jzmgcj.gmd
+dir pfnglqgw
+60549 rrfflbql.scj
+dir zwcdggd
+$ cd pfnglqgw
+$ ls
+49844 rfdw.pqh
+$ cd ..
+$ cd zwcdggd
+$ ls
+135925 ccmvjm.bjb
+1135 gqmpvplj.vjg
+120968 hmgpcj.nbb
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+184937 ccmvjm.bjb
+128621 llsjsmg.vtv
+dir lsbf
+42834 ndfcj.fwq
+85391 trrchml.sgp
+$ cd lsbf
+$ ls
+192593 cfdtsfq.sln
+289191 nnch.qzj
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sqlwn
+$ ls
+77962 ccmvjm.bjb
+114288 ndfcj
+$ cd ..
+$ cd ..
+$ cd ncvv
+$ ls
+dir gsd
+$ cd gsd
+$ ls
+14949 jwcp.lmq
+$ cd ..
+$ cd ..
+$ cd nftdcrl
+$ ls
+185409 jzmgcj.gmd
+$ cd ..
+$ cd nnch
+$ ls
+280827 djftt
+dir ljt
+dir ncvv
+dir ndfcj
+33396 qvhndl.pwn
+136204 qvlc.cbr
+14063 rrfflbql.mrq
+130666 vscjncbm.sls
+$ cd ljt
+$ ls
+166514 cgrgbpvw
+55138 jzmgcj.gmd
+$ cd ..
+$ cd ncvv
+$ ls
+dir fhnw
+56003 gqtcgszl.vnf
+145831 jzmgcj.gmd
+dir mwcbd
+dir rclnhb
+$ cd fhnw
+$ ls
+28050 gqmpvplj.vjg
+$ cd ..
+$ cd mwcbd
+$ ls
+288468 ncvv
+$ cd ..
+$ cd rclnhb
+$ ls
+190004 ndjmjbp
+$ cd ..
+$ cd ..
+$ cd ndfcj
+$ ls
+287125 gqmpvplj.vjg
+dir ndfcj
+247237 nnch
+138902 pfnglqgw
+$ cd ndfcj
+$ ls
+143400 ssvsvffz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pfnglqgw
+$ ls
+dir cwwb
+dir dtf
+97867 mqbz.fcp
+$ cd cwwb
+$ ls
+dir wtz
+$ cd wtz
+$ ls
+300949 zcq
+$ cd ..
+$ cd ..
+$ cd dtf
+$ ls
+28018 gqmpvplj.vjg
+$ cd ..
+$ cd ..
+$ cd qfbbnr
+$ ls
+dir bqmdfjp
+89207 gjfzv
+176709 pmsdthr.prv
+246390 rrfflbql.vdl
+$ cd bqmdfjp
+$ ls
+137504 cwz.jdg
+9191 ncvv
+$ cd ..
+$ cd ..
+$ cd wttc
+$ ls
+279516 ccmvjm.bjb
+115478 lwnpwdqt.jpj
+$ cd ..
+$ cd ..
+$ cd rrfflbql
+$ ls
+162371 nnch.pnm
\ No newline at end of file
diff --git a/data/advent07a.txt b/data/advent07a.txt
new file mode 100644 (file)
index 0000000..bcbb513
--- /dev/null
@@ -0,0 +1,23 @@
+$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k
\ No newline at end of file
diff --git a/data/advent07b.txt b/data/advent07b.txt
new file mode 100644 (file)
index 0000000..0884298
--- /dev/null
@@ -0,0 +1,19 @@
+$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k
\ No newline at end of file
diff --git a/problems/day07.html b/problems/day07.html
new file mode 100644 (file)
index 0000000..e85565d
--- /dev/null
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+<meta charset="utf-8"/>
+<title>Day 7 - Advent of Code 2022</title>
+<!--[if lt IE 9]><script src="/static/html5.js"></script><![endif]-->
+<link href='//fonts.googleapis.com/css?family=Source+Code+Pro:300&subset=latin,latin-ext' rel='stylesheet' type='text/css'/>
+<link rel="stylesheet" type="text/css" href="/static/style.css?30"/>
+<link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
+<link rel="shortcut icon" href="/favicon.png"/>
+<script>window.addEventListener('click', function(e,s,r){if(e.target.nodeName==='CODE'&&e.detail===3){s=window.getSelection();s.removeAllRanges();r=document.createRange();r.selectNodeContents(e.target);s.addRange(r);}});</script>
+</head><!--
+
+
+
+
+Oh, hello!  Funny seeing you here.
+
+I appreciate your enthusiasm, but you aren't going to find much down here.
+There certainly aren't clues to any of the puzzles.  The best surprises don't
+even appear in the source until you unlock them for real.
+
+Please be careful with automated requests; I'm not a massive company, and I can
+only take so much traffic.  Please be considerate so that everyone gets to play.
+
+If you're curious about how Advent of Code works, it's running on some custom
+Perl code. Other than a few integrations (auth, analytics, social media), I
+built the whole thing myself, including the design, animations, prose, and all
+of the puzzles.
+
+The puzzles are most of the work; preparing a new calendar and a new set of
+puzzles each year takes all of my free time for 4-5 months. A lot of effort
+went into building this thing - I hope you're enjoying playing it as much as I
+enjoyed making it for you!
+
+If you'd like to hang out, I'm @ericwastl on Twitter.
+
+- Eric Wastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-->
+<body>
+<header><div><h1 class="title-global"><a href="/">Advent of Code</a></h1><nav><ul><li><a href="/2022/about">[About]</a></li><li><a href="/2022/events">[Events]</a></li><li><a href="https://teespring.com/stores/advent-of-code" target="_blank">[Shop]</a></li><li><a href="/2022/settings">[Settings]</a></li><li><a href="/2022/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2022/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">14*</span></div></div><div><h1 class="title-event">&nbsp;&nbsp;&nbsp;<span class="title-event-wrap">0xffff&amp;</span><a href="/2022">2022</a><span class="title-event-wrap"></span></h1><nav><ul><li><a href="/2022">[Calendar]</a></li><li><a href="/2022/support">[AoC++]</a></li><li><a href="/2022/sponsors">[Sponsors]</a></li><li><a href="/2022/leaderboard">[Leaderboard]</a></li><li><a href="/2022/stats">[Stats]</a></li></ul></nav></div></header>
+
+<div id="sidebar">
+<div id="sponsor"><div class="quiet">Our <a href="/2022/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://www.twilio.com/quest" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">TwilioQuest</a> - Discover your power to change the world with code with TwilioQuest, an educational RPG. Learn foundational programming skills, JavaScript and Python while you explore The Cloud alongside our community of developers.</div></div>
+</div><!--/sidebar-->
+
+<main>
+<article class="day-desc"><h2>--- Day 7: No Space Left On Device ---</h2><p>You can hear birds chirping and raindrops hitting leaves as the expedition proceeds. Occasionally, you can even hear much louder sounds in the distance; how big do the animals get out here, anyway?</p>
+<p>The device the Elves gave you has problems with more than just its communication system. You try to run a system update:</p>
+<pre><code>$ system-update --please --pretty-please-with-sugar-on-top
+<span title="E099 PROGRAMMER IS OVERLY POLITE">Error</span>: No space left on device
+</code></pre>
+<p>Perhaps you can delete some files to make space for the update?</p>
+<p>You browse around the filesystem to assess the situation and save the resulting terminal output (your puzzle input). For example:</p>
+<pre><code>$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k
+</code></pre>
+<p>The filesystem consists of a tree of files (plain data) and directories (which can contain other directories or files). The outermost directory is called <code>/</code>. You can navigate around the filesystem, moving into or out of directories and listing the contents of the directory you're currently in.</p>
+<p>Within the terminal output, lines that begin with <code>$</code> are <em>commands you executed</em>, very much like some modern computers:</p>
+<ul>
+<li><code>cd</code> means <em>change directory</em>. This changes which directory is the current directory, but the specific result depends on the argument:
+  <ul>
+  <li><code>cd x</code> moves <em>in</em> one level: it looks in the current directory for the directory named <code>x</code> and makes it the current directory.</li>
+  <li><code>cd ..</code> moves <em>out</em> one level: it finds the directory that contains the current directory, then makes that directory the current directory.</li>
+  <li><code>cd /</code> switches the current directory to the outermost directory, <code>/</code>.</li>
+  </ul>
+</li>
+<li><code>ls</code> means <em>list</em>. It prints out all of the files and directories immediately contained by the current directory:
+  <ul>
+  <li><code>123 abc</code> means that the current directory contains a file named <code>abc</code> with size <code>123</code>.</li>
+  <li><code>dir xyz</code> means that the current directory contains a directory named <code>xyz</code>.</li>
+  </ul>
+</li>
+</ul>
+<p>Given the commands and output in the example above, you can determine that the filesystem looks visually like this:</p>
+<pre><code>- / (dir)
+  - a (dir)
+    - e (dir)
+      - i (file, size=584)
+    - f (file, size=29116)
+    - g (file, size=2557)
+    - h.lst (file, size=62596)
+  - b.txt (file, size=14848514)
+  - c.dat (file, size=8504156)
+  - d (dir)
+    - j (file, size=4060174)
+    - d.log (file, size=8033020)
+    - d.ext (file, size=5626152)
+    - k (file, size=7214296)
+</code></pre>
+<p>Here, there are four directories: <code>/</code> (the outermost directory), <code>a</code> and <code>d</code> (which are in <code>/</code>), and <code>e</code> (which is in <code>a</code>). These directories also contain files of various sizes.</p>
+<p>Since the disk is full, your first step should probably be to find directories that are good candidates for deletion. To do this, you need to determine the <em>total size</em> of each directory. The total size of a directory is the sum of the sizes of the files it contains, directly or indirectly. (Directories themselves do not count as having any intrinsic size.)</p>
+<p>The total sizes of the directories above can be found as follows:</p>
+<ul>
+<li>The total size of directory <code>e</code> is <em>584</em> because it contains a single file <code>i</code> of size 584 and no other directories.</li>
+<li>The directory <code>a</code> has total size <em>94853</em> because it contains files <code>f</code> (size 29116), <code>g</code> (size 2557), and <code>h.lst</code> (size 62596), plus file <code>i</code> indirectly (<code>a</code> contains <code>e</code> which contains <code>i</code>).</li>
+<li>Directory <code>d</code> has total size <em>24933642</em>.</li>
+<li>As the outermost directory, <code>/</code> contains every file. Its total size is <em>48381165</em>, the sum of the size of every file.</li>
+</ul>
+<p>To begin, find all of the directories with a total size of <em>at most 100000</em>, then calculate the sum of their total sizes. In the example above, these directories are <code>a</code> and <code>e</code>; the sum of their total sizes is <code><em>95437</em></code> (94853 + 584). (As in this example, this process can count files more than once!)</p>
+<p>Find all of the directories with a total size of at most 100000. <em>What is the sum of the total sizes of those directories?</em></p>
+</article>
+<p>Your puzzle answer was <code>1084134</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>Now, you're ready to choose a directory to delete.</p>
+<p>The total disk space available to the filesystem is <code><em>70000000</em></code>. To run the update, you need unused space of at least <code><em>30000000</em></code>. You need to find a directory you can delete that will <em>free up enough space</em> to run the update.</p>
+<p>In the example above, the total size of the outermost directory (and thus the total amount of used space) is <code>48381165</code>; this means that the size of the <em>unused</em> space must currently be <code>21618835</code>, which isn't quite the <code>30000000</code> required by the update. Therefore, the update still requires a directory with total size of at least <code>8381165</code> to be deleted before it can run.</p>
+<p>To achieve this, you have the following options:</p>
+<ul>
+<li>Delete directory <code>e</code>, which would increase unused space by <code>584</code>.</li>
+<li>Delete directory <code>a</code>, which would increase unused space by <code>94853</code>.</li>
+<li>Delete directory <code>d</code>, which would increase unused space by <code>24933642</code>.</li>
+<li>Delete directory <code>/</code>, which would increase unused space by <code>48381165</code>.</li>
+</ul>
+<p>Directories <code>e</code> and <code>a</code> are both too small; deleting them would not free up enough space. However, directories <code>d</code> and <code>/</code> are both big enough! Between these, choose the <em>smallest</em>: <code>d</code>, increasing unused space by <code><em>24933642</em></code>.</p>
+<p>Find the smallest directory that, if deleted, would free up enough space on the filesystem to run the update. <em>What is the total size of that directory?</em></p>
+</article>
+<p>Your puzzle answer was <code>6183184</code>.</p><p class="day-success">Both parts of this puzzle are complete! They provide two gold stars: **</p>
+<p>At this point, you should <a href="/2022">return to your Advent calendar</a> and try another puzzle.</p>
+<p>If you still want to see it, you can <a href="7/input" target="_blank">get your puzzle input</a>.</p>
+<p>You can also <span class="share">[Share<span class="share-content">on
+  <a href="https://twitter.com/intent/tweet?text=I%27ve+completed+%22No+Space+Left+On+Device%22+%2D+Day+7+%2D+Advent+of+Code+2022&amp;url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F7&amp;related=ericwastl&amp;hashtags=AdventOfCode" target="_blank">Twitter</a>
+  <a href="javascript:void(0);" onclick="var mastodon_instance=prompt('Mastodon Instance / Server Name?'); if(typeof mastodon_instance==='string' && mastodon_instance.length){this.href='https://'+mastodon_instance+'/share?text=I%27ve+completed+%22No+Space+Left+On+Device%22+%2D+Day+7+%2D+Advent+of+Code+2022+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F7'}else{return false;}" target="_blank">Mastodon</a
+></span>]</span> this puzzle.</p>
+</main>
+
+<!-- ga -->
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-69522494-1', 'auto');
+ga('set', 'anonymizeIp', true);
+ga('send', 'pageview');
+</script>
+<!-- /ga -->
+</body>
+</html>
\ No newline at end of file