6YQWUCPSTE6VUORJBASWKRROOFY3WP37QTXYQNAIDYDTA43FJUKAC
$ cd /
$ ls
dir lhrfs
193233 mvsjmrtn
dir nwh
dir pjsd
dir qfrrtb
31987 zzdfcs
$ cd lhrfs
$ ls
197903 hzl.jdj
42249 wsbpzmbq.hws
$ cd ..
$ cd nwh
$ ls
63077 bgrccm.tqh
69961 dznccwl.bnw
dir pmdj
187013 rsbvj.jtd
$ cd pmdj
$ ls
292527 rlgfd.rrd
68737 tbj.grn
153072 wsbpzmbq.hws
$ cd ..
$ cd ..
$ cd pjsd
$ ls
dir czzcslm
dir dgwpl
dir fqg
dir lszhdjr
dir mmpf
dir wtwhzzwz
149748 zzdfcs
$ cd czzcslm
$ ls
249237 bvrnzhd.vzp
16960 ssvqllt.ccv
$ cd ..
$ cd dgwpl
$ ls
23547 brsbfqbm.hls
dir ljzrwpv
$ cd ljzrwpv
$ ls
dir btnzjtlr
dir czr
$ cd btnzjtlr
$ ls
191998 tbj.mwg
$ cd ..
$ cd czr
$ ls
dir fqg
$ cd fqg
$ ls
276766 llhzr.pjh
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd fqg
$ ls
275942 bhcg
dir fqg
dir gghdbzz
dir hswgvpt
75273 hzl
dir lfpblmwt
dir sdcwn
dir wmrwd
$ cd fqg
$ ls
dir bpbtnq
267620 btnzjtlr.mgr
174395 fqg.vpw
dir tfbfgzw
dir twhvbbr
$ cd bpbtnq
$ ls
194542 mtztnd.hdb
$ cd ..
$ cd tfbfgzw
$ ls
dir cgdlflbt
10814 fqg.cqp
40235 fztb.jzr
dir hzl
$ cd cgdlflbt
$ ls
176005 wsbpzmbq.hws
$ cd ..
$ cd hzl
$ ls
dir ccpdp
dir hgwpjvn
dir hzl
203730 pbn.rzl
88179 tbj
295466 zdbmfmzs.jjh
$ cd ccpdp
$ ls
172836 btnzjtlr
$ cd ..
$ cd hgwpjvn
$ ls
122725 hnsrdnl.ctv
261470 tmgpjbj
$ cd ..
$ cd hzl
$ ls
59843 lffmd.fwr
$ cd ..
$ cd ..
$ cd ..
$ cd twhvbbr
$ ls
134874 hnsrdnl.ctv
$ cd ..
$ cd ..
$ cd gghdbzz
$ ls
dir fqg
$ cd fqg
$ ls
233336 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd hswgvpt
$ ls
dir fwfhnbc
dir hcp
221595 hnsrdnl.ctv
230875 hzl
257695 jbfnlc.qqn
126050 tbj.qlc
dir wdlh
$ cd fwfhnbc
$ ls
293848 zhz.mff
$ cd ..
$ cd hcp
$ ls
288118 gdndr.gwn
$ cd ..
$ cd wdlh
$ ls
227328 btnzjtlr.msq
dir hzl
94325 hzl.wjp
272466 zzdfcs
$ cd hzl
$ ls
184779 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd ..
$ cd lfpblmwt
$ ls
151071 ssvqllt.ccv
$ cd ..
$ cd sdcwn
$ ls
61632 hzl.mvp
dir tbj
dir tdwc
dir tnjcf
dir tstqdt
$ cd tbj
$ ls
dir btnzjtlr
dir cwsv
1318 tbj
293645 wnv
$ cd btnzjtlr
$ ls
2441 hnsrdnl.ctv
$ cd ..
$ cd cwsv
$ ls
238930 gwr
236116 tlzqtch
$ cd ..
$ cd ..
$ cd tdwc
$ ls
dir btnzjtlr
dir fqg
dir zgjpfj
$ cd btnzjtlr
$ ls
177427 tbj.hgf
$ cd ..
$ cd fqg
$ ls
241003 dbnwzbn.flv
$ cd ..
$ cd zgjpfj
$ ls
249565 fqg
238012 tbj.csq
$ cd ..
$ cd ..
$ cd tnjcf
$ ls
188504 lljwfglp.wnb
35384 wsbpzmbq.hws
$ cd ..
$ cd tstqdt
$ ls
dir lszhdjr
$ cd lszhdjr
$ ls
252181 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd ..
$ cd wmrwd
$ ls
117914 btnzjtlr
224916 hnsrdnl.ctv
dir lszhdjr
112511 trjm.mrw
20365 trn
$ cd lszhdjr
$ ls
183834 sdnlhh.ntt
$ cd ..
$ cd ..
$ cd ..
$ cd lszhdjr
$ ls
dir gjlms
dir hrwjmrwf
dir vblznslv
$ cd gjlms
$ ls
301712 bbs.fhq
dir btnzjtlr
148329 cnvlrpbs.tqv
dir hzl
107466 hzl.zps
dir jgflpb
9865 trjm.mrw
$ cd btnzjtlr
$ ls
60204 nhmc
$ cd ..
$ cd hzl
$ ls
99518 lszhdjr.stz
$ cd ..
$ cd jgflpb
$ ls
251545 hzl.ncm
$ cd ..
$ cd ..
$ cd hrwjmrwf
$ ls
65264 btnzjtlr.qgg
123207 pqsn
30133 zzdfcs
$ cd ..
$ cd vblznslv
$ ls
19460 hzl
$ cd ..
$ cd ..
$ cd mmpf
$ ls
200340 dnsq
109756 snl
$ cd ..
$ cd wtwhzzwz
$ ls
dir bpwjhpgr
dir btnzjtlr
dir dgqljsbq
dir fqg
dir mbbtzgmf
dir vvmzhhtv
dir wglhbp
dir zcwmf
$ cd bpwjhpgr
$ ls
1514 mjczjz
$ cd ..
$ cd btnzjtlr
$ ls
209165 lszhdjr
$ cd ..
$ cd dgqljsbq
$ ls
160750 btnzjtlr
dir fqg
dir hrncl
5964 hzvr.ftp
dir jldnlddj
267082 qdc.grf
205213 sjpdjt.ngt
dir vws
175214 wzwwqq.stp
$ cd fqg
$ ls
dir ghsdjhj
$ cd ghsdjhj
$ ls
166720 jqcjngn.fmf
298171 zzdfcs
$ cd ..
$ cd ..
$ cd hrncl
$ ls
dir hzl
82355 trjm.mrw
dir vrqbf
261260 wsbpzmbq.hws
18593 wtmlmprg.whh
$ cd hzl
$ ls
344 drndgmgz.flz
241877 zzdfcs
$ cd ..
$ cd vrqbf
$ ls
dir blf
dir pzrfw
dir tbj
$ cd blf
$ ls
68629 wdhfbtj.ncc
$ cd ..
$ cd pzrfw
$ ls
dir hzl
dir mdh
dir tbj
$ cd hzl
$ ls
12677 gvdh.ltp
$ cd ..
$ cd mdh
$ ls
222003 qbvfdv
$ cd ..
$ cd tbj
$ ls
dir wtmcqwgp
$ cd wtmcqwgp
$ ls
dir stcgrs
$ cd stcgrs
$ ls
285843 tbj
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd tbj
$ ls
173380 mcgzmthd.mdg
$ cd ..
$ cd ..
$ cd ..
$ cd jldnlddj
$ ls
57836 brdtwc.pws
dir fqg
dir hzl
140902 lbn
dir qhrcm
dir ssrc
169907 wsbpzmbq.hws
$ cd fqg
$ ls
273621 pwjr.gwt
$ cd ..
$ cd hzl
$ ls
dir fqg
dir tbj
$ cd fqg
$ ls
290882 hcf.sqw
62759 hlntl.zqg
115593 ntgm.wjn
64481 qwtv
$ cd ..
$ cd tbj
$ ls
199421 gsvpcdm
200467 hnsrdnl.ctv
9980 lgqgdvwz.zdp
dir lqlml
19593 pgn
51598 tqqbwd
$ cd lqlml
$ ls
92416 fdwgg.rdp
279285 zzdfcs
$ cd ..
$ cd ..
$ cd ..
$ cd qhrcm
$ ls
278543 trjm.mrw
279502 zzdfcs
$ cd ..
$ cd ssrc
$ ls
238789 zfvwwnhl
$ cd ..
$ cd ..
$ cd vws
$ ls
249170 bgfrh
dir ndtnt
$ cd ndtnt
$ ls
5224 qwdnzdq.rfz
$ cd ..
$ cd ..
$ cd ..
$ cd fqg
$ ls
171994 trjm.mrw
$ cd ..
$ cd mbbtzgmf
$ ls
dir cfqzlgm
57211 ssvqllt.ccv
dir tbj
$ cd cfqzlgm
$ ls
dir tlbgq
$ cd tlbgq
$ ls
232962 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd tbj
$ ls
23083 lszhdjr.lzt
$ cd ..
$ cd ..
$ cd vvmzhhtv
$ ls
150567 fcpv.vws
$ cd ..
$ cd wglhbp
$ ls
dir cjm
dir gjhzw
dir lmzzlp
123986 lszhdjr.hcj
275863 lwbz
121332 snnhqgp.tdj
dir stngv
dir wdzvcfm
dir wjqztbj
dir wzhsq
$ cd cjm
$ ls
300643 jhtjsn.hzm
$ cd ..
$ cd gjhzw
$ ls
dir hwlj
dir tbj
$ cd hwlj
$ ls
280279 ssvqllt.ccv
$ cd ..
$ cd tbj
$ ls
88746 ssvqllt.ccv
139206 tbj
$ cd ..
$ cd ..
$ cd lmzzlp
$ ls
9261 btnzjtlr
dir fqg
128118 fqg.fsf
165323 hnsrdnl.ctv
dir prvmm
$ cd fqg
$ ls
35303 dcglqd.zrj
71812 mvzh
32361 ssvqllt.ccv
69305 zzdfcs
$ cd ..
$ cd prvmm
$ ls
296946 zzdfcs
$ cd ..
$ cd ..
$ cd stngv
$ ls
dir hgj
46259 vlb.ztz
25946 zstwl.wgs
106712 zzdfcs
$ cd hgj
$ ls
289819 dhwr.mvc
85418 dvpvhhgj.fmw
108543 fqg.frj
229544 pwhwmctv
$ cd ..
$ cd ..
$ cd wdzvcfm
$ ls
dir sdphr
$ cd sdphr
$ ls
84638 hnsrdnl.ctv
$ cd ..
$ cd ..
$ cd wjqztbj
$ ls
240174 btnzjtlr.ldw
125567 lszhdjr
265718 lszhdjr.mmz
242407 wzjcc
$ cd ..
$ cd wzhsq
$ ls
dir hzl
22176 hzl.cpv
122990 ldtwhvc.vcv
$ cd hzl
$ ls
309519 plnn.pdn
$ cd ..
$ cd ..
$ cd ..
$ cd zcwmf
$ ls
dir hwq
268508 mztd
$ cd hwq
$ ls
189618 trjm.mrw
120145 wsbpzmbq.hws
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd qfrrtb
$ ls
dir dmntr
dir fqg
dir gpcvsbpl
dir hzl
dir mqbhs
dir pgvngj
dir pnrdwlqn
dir qlnwhq
$ cd dmntr
$ ls
dir btnzjtlr
141598 fqg.wcw
223036 hnsrdnl.ctv
96925 qhwmj
257697 ssvqllt.ccv
184839 vmbfhldv.zgm
$ cd btnzjtlr
$ ls
153689 jnbthqwp
dir tcp
$ cd tcp
$ ls
90378 mczzfwsz.hwf
$ cd ..
$ cd ..
$ cd ..
$ cd fqg
$ ls
dir btq
51590 fqg
176455 gnqsnpj.vsh
dir mthwtst
dir trhz
dir zbpjvb
$ cd btq
$ ls
dir bdnc
dir ttpj
dir vftshfd
$ cd bdnc
$ ls
263358 trjm.mrw
$ cd ..
$ cd ttpj
$ ls
185501 fqg.dvq
151107 ltmmsr.lqd
dir mbtqmqh
231236 sdzp.qhb
16601 vfflgw.vrr
75487 zbvllh.gqb
$ cd mbtqmqh
$ ls
dir lszhdjr
184660 pmwswf.lrm
dir tbj
dir zqbss
262042 zzdfcs
$ cd lszhdjr
$ ls
dir dmc
$ cd dmc
$ ls
173189 mzmr.nrj
$ cd ..
$ cd ..
$ cd tbj
$ ls
59531 fjqfbq
$ cd ..
$ cd zqbss
$ ls
dir btnzjtlr
dir lszhdjr
14365 sqdj
$ cd btnzjtlr
$ ls
113619 trjm.mrw
$ cd ..
$ cd lszhdjr
$ ls
87142 hnsrdnl.ctv
dir lszhdjr
$ cd lszhdjr
$ ls
dir jsdrvbhc
$ cd jsdrvbhc
$ ls
210295 hzl
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd vftshfd
$ ls
dir jjws
dir mvdcjgp
dir qflcrlrm
$ cd jjws
$ ls
82848 trjm.mrw
$ cd ..
$ cd mvdcjgp
$ ls
231865 lzzl
$ cd ..
$ cd qflcrlrm
$ ls
150667 btnzjtlr
$ cd ..
$ cd ..
$ cd ..
$ cd mthwtst
$ ls
26308 lszhdjr.dbb
$ cd ..
$ cd trhz
$ ls
16138 swtdz.hdt
$ cd ..
$ cd zbpjvb
$ ls
69598 hnsrdnl.ctv
96314 tbj.gpj
$ cd ..
$ cd ..
$ cd gpcvsbpl
$ ls
dir dbssfzqt
dir pgn
dir zfgvldv
$ cd dbssfzqt
$ ls
156599 jcv
68192 zzdfcs
$ cd ..
$ cd pgn
$ ls
124613 fqg
139219 gmnqvlbb.nnf
177527 hnsrdnl.ctv
116238 hzl.qwm
dir tbj
69576 zzdfcs
$ cd tbj
$ ls
78863 hnsrdnl.ctv
dir lszhdjr
$ cd lszhdjr
$ ls
76043 qjwjw.dbn
$ cd ..
$ cd ..
$ cd ..
$ cd zfgvldv
$ ls
dir tbj
$ cd tbj
$ ls
308796 gqcw.fsm
$ cd ..
$ cd ..
$ cd ..
$ cd hzl
$ ls
50784 btnzjtlr
19755 gjbcgphh.rbw
169847 lncnj.bct
46359 mbrtgl
dir nlnt
269695 wfg.cdn
$ cd nlnt
$ ls
dir cqfzqwr
dir dghdql
dir fnd
159573 hnsrdnl.ctv
dir lszhdjr
16814 tsm
59202 wsbpzmbq.hws
22244 zlbj
$ cd cqfzqwr
$ ls
213009 trjm.mrw
$ cd ..
$ cd dghdql
$ ls
61202 hnsrdnl.ctv
$ cd ..
$ cd fnd
$ ls
237330 hnsrdnl.ctv
$ cd ..
$ cd lszhdjr
$ ls
222813 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd ..
$ cd mqbhs
$ ls
dir fqg
$ cd fqg
$ ls
121590 lcwsbvw.jlj
13769 zzdfcs
$ cd ..
$ cd ..
$ cd pgvngj
$ ls
29079 lnfsw.mvd
dir tbj
$ cd tbj
$ ls
303514 ssvqllt.ccv
81789 wsbpzmbq.hws
$ cd ..
$ cd ..
$ cd pnrdwlqn
$ ls
145498 btnzjtlr.hdq
209811 fqg
dir gscsq
39287 jbln.grc
dir lszhdjr
dir zcj
$ cd gscsq
$ ls
dir btnzjtlr
257666 cmflqncq.csp
146453 lszhdjr.jvl
21252 ssvqllt.ccv
dir vjpgs
29627 zjgswm.zmw
$ cd btnzjtlr
$ ls
52870 fqg.bcq
131279 hnsrdnl.ctv
dir hts
180154 plgqz.lfz
118677 ssvqllt.ccv
143055 zzdfcs
$ cd hts
$ ls
295829 hnsrdnl.ctv
$ cd ..
$ cd ..
$ cd vjpgs
$ ls
247444 fqg.rjw
dir hzl
113248 tbj
$ cd hzl
$ ls
91966 ppff.qhn
$ cd ..
$ cd ..
$ cd ..
$ cd lszhdjr
$ ls
290399 grzs.btl
11125 gswg
110268 mhdfszz.pdh
dir mwbjshb
dir ndtllttm
126485 wsbpzmbq.hws
152691 zzdfcs
$ cd mwbjshb
$ ls
119607 rpgml
$ cd ..
$ cd ndtllttm
$ ls
5107 qsqqfpc.mzf
$ cd ..
$ cd ..
$ cd zcj
$ ls
dir gftzs
131397 ssvqllt.ccv
dir vpqvpmv
dir wdqw
34540 wsbpzmbq.hws
$ cd gftzs
$ ls
115531 fbjj.vrn
$ cd ..
$ cd vpqvpmv
$ ls
dir bfqpwgdc
67619 ffbllv
dir tzr
$ cd bfqpwgdc
$ ls
144904 fqg.djq
dir gbn
dir jzz
dir vtp
$ cd gbn
$ ls
dir btnzjtlr
$ cd btnzjtlr
$ ls
dir dzsbcqjd
253792 fqg.fcw
209245 fqtqsdrt.pqd
303280 nqvqm
271246 vchvvq.cft
$ cd dzsbcqjd
$ ls
13953 tbj
$ cd ..
$ cd ..
$ cd ..
$ cd jzz
$ ls
234810 ssvqllt.ccv
$ cd ..
$ cd vtp
$ ls
287225 rzqfq.pvj
$ cd ..
$ cd ..
$ cd tzr
$ ls
135596 bbzlnjtc.fft
dir bqfz
dir dztgr
306047 hnsrdnl.ctv
248180 jzdzf
dir lszhdjr
dir mds
dir nmdc
dir qpmt
126445 wsbpzmbq.hws
191907 zzdfcs
$ cd bqfz
$ ls
137988 fqg
122217 lszhdjr.bwc
232293 ssvqllt.ccv
168937 twrtmwh.ddc
$ cd ..
$ cd dztgr
$ ls
23653 qhrp.ljh
$ cd ..
$ cd lszhdjr
$ ls
dir ghqlj
dir qjjvfv
dir qsjrnq
$ cd ghqlj
$ ls
184316 ghshmzt.srl
258282 nbqndwj
dir ndd
dir tqqlnw
68843 trjm.mrw
92593 wllcqzfr.mbd
$ cd ndd
$ ls
152924 gvclc
77856 llztchwp.jjd
$ cd ..
$ cd tqqlnw
$ ls
4090 flvdsc.zsv
219378 vgwfn.zjh
$ cd ..
$ cd ..
$ cd qjjvfv
$ ls
230606 trjm.mrw
$ cd ..
$ cd qsjrnq
$ ls
252853 fnnbmt.dtm
279660 lszhdjr.rjc
$ cd ..
$ cd ..
$ cd mds
$ ls
10903 jzwjv
$ cd ..
$ cd nmdc
$ ls
114234 hnsrdnl.ctv
$ cd ..
$ cd qpmt
$ ls
171542 bvrzgp
129238 hnsrdnl.ctv
137570 tbj
54929 vtcfq.npn
44117 zzdfcs
$ cd ..
$ cd ..
$ cd ..
$ cd wdqw
$ ls
dir jmvsdlv
dir mjgpdcbl
$ cd jmvsdlv
$ ls
dir flnnqz
$ cd flnnqz
$ ls
224693 flqpwqp.fwn
$ cd ..
$ cd ..
$ cd mjgpdcbl
$ ls
140928 btnzjtlr.prd
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd qlnwhq
$ ls
dir btnzjtlr
dir cbhr
dir cnbssw
dir dwvv
dir lszhdjr
dir rnhnbs
dir sdhqp
$ cd btnzjtlr
$ ls
225671 ssrcp.chb
268250 tbj.cfd
$ cd ..
$ cd cbhr
$ ls
68468 qdqlml.qrj
$ cd ..
$ cd cnbssw
$ ls
dir tbj
187921 zscs
$ cd tbj
$ ls
307230 hzl
dir jbcnnvq
228268 lssvr.gfn
$ cd jbcnnvq
$ ls
277047 nztsr
$ cd ..
$ cd ..
$ cd ..
$ cd dwvv
$ ls
267743 btnzjtlr
dir fqg
68364 qznpsjp
dir wdr
230595 wsbpzmbq.hws
206 wtwwd.jnb
$ cd fqg
$ ls
260003 btnzjtlr.hjn
103775 btnzjtlr.ndh
200945 trjm.mrw
dir twpplmhh
$ cd twpplmhh
$ ls
dir tvrq
$ cd tvrq
$ ls
298383 ssvqllt.ccv
$ cd ..
$ cd ..
$ cd ..
$ cd wdr
$ ls
248357 tbj
$ cd ..
$ cd ..
$ cd lszhdjr
$ ls
259605 lszhdjr.mvw
$ cd ..
$ cd rnhnbs
$ ls
297597 hnsrdnl.ctv
$ cd ..
$ cd sdhqp
$ ls
95362 wsbpzmbq.hws
$ 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
module Main where
import Data.Bifunctor (bimap, first, second)
import Data.Function
import Data.List
import Data.Char
import Data.Maybe
import Data.Functor.Identity
import qualified Data.Map as M
import Control.Monad.State
import Control.Applicative ((<|>))
import Text.ParserCombinators.ReadP hiding (get)
import Aoc
main :: IO ()
main = do
content <- input 7
let run = Aoc.run content
run 1243729 strategy
run 4443914 $ \s -> do
let fstats = filemap s
let smallestDir = used fstats >>= return . calculation >>= return . (\x -> M.filter(>=x) fstats) >>= return . snd . minimumBy (compare `on` snd) . M.toAscList
fromJust smallestDir
where
needed = 30000000
total = 70000000
calculation x = needed - (total - x)
used = M.lookup "/"
strategy = sum . map snd . M.toAscList . M.filter (<= 100000) . filemap
filemap = snd . snd . runIdentity . state
state = flip runStateT ([], M.empty) . commands
commands = sequence_ . concatMap (map fst) . parse
parse = map (readP_to_S mainParse) . lines
data Dir = Dir String [Dir] | File String
data Direction = Root | Parent | Path String
deriving Show
type CurrentPath = [String]
type WorkingDirState a = StateT (CurrentPath, M.Map String Int) Identity a
goDir :: Direction -> WorkingDirState ()
goDir Root = do
(_, map) <- get
put (["/"], map)
goDir Parent = do
(cwd, map) <- get
put (drop 1 cwd, map)
goDir (Path s) = do
(cwd, map) <- get
put (s:cwd, map)
fStat :: Int -> String -> WorkingDirState ()
fStat a _ = do
(cwd, map) <- get
let dirs = scanr1 (flip pathJoin) cwd
let new = foldl' (\m k -> M.alter (f a) k m) map dirs
-- let new' = M.alter (f a) (head dirs) new
put (cwd, new)
where
f x Nothing = Just x
f x (Just old) = Just $ x + old
test :: Int -> Maybe Int -> Maybe Int
test a Nothing = Just a
test a (Just old) = Just $ old + a
getCwd :: WorkingDirState String
getCwd = do
(cwd, map) <- get
pure . drop 1 . intercalate "/" . reverse $ cwd
-- maximumBy (compare `on` snd) . M.toAscList . M.filter (< 100000) . snd . snd . runIdentity . flip runStateT ([], M.empty) . sequence_ . concatMap (map fst)
pathJoin :: String -> String -> String
pathJoin xs ys'@(y:ys)
| last xs == '/' || y == '/' = xs ++ ys'
| otherwise = xs ++ "/" ++ ys'
-- Parsers
fileName :: Char -> Bool
fileName x = isAlpha x || x == '.'
dirName :: Char -> Bool
dirName x = isAlpha x || x `elem` "./"
parseCd :: ReadP (WorkingDirState ())
parseCd = do
string "$ cd "
dir <- munch1 dirName
case dir of
"/" -> pure $ goDir Root
".." -> pure $ goDir Parent
s -> pure $ goDir (Path s)
parseEntry :: ReadP (WorkingDirState ())
parseEntry = do
size <- read <$> munch1 isDigit
skipSpaces
name <- munch1 fileName
pure $ fStat size name
mainParse :: ReadP (WorkingDirState ())
mainParse = parseCd <|> parseEntry