summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2022-12-07 11:15:57 +0200
committerJustin Wernick <justin@worthe-it.co.za>2022-12-07 11:15:57 +0200
commit8ae0f0d1dac84303fc7f252c972fee9a3a0c6792 (patch)
treeddc0fa1d4d2a43fe1fa3807320d4efb5f51f40ca
parent6e2aa5f56f443ae5282c169cfc265c63f81edbcd (diff)
Day 7
-rw-r--r--2022/inputs/day_7.txt942
-rw-r--r--2022/src/bin/day_7.rs227
2 files changed, 1169 insertions, 0 deletions
diff --git a/2022/inputs/day_7.txt b/2022/inputs/day_7.txt
new file mode 100644
index 0000000..d083766
--- /dev/null
+++ b/2022/inputs/day_7.txt
@@ -0,0 +1,942 @@
+$ cd /
+$ ls
+dir gts
+68377 jvdqjhr.jvp
+dir lwhbw
+228884 nqth.gcn
+dir pcqjnl
+94844 ppwv.zsh
+97889 rqpw
+dir sqhw
+dir vllgn
+dir wdtm
+dir ztfdwp
+$ cd gts
+$ ls
+846 grwwbrgz.wft
+72000 mrnhn.psz
+155241 qvnbd.dqs
+6655 tndtmwfv
+$ cd ..
+$ cd lwhbw
+$ ls
+99946 lrrl.lth
+$ cd ..
+$ cd pcqjnl
+$ ls
+76420 gdg.lvr
+dir gljcvm
+161390 hlnrq.mjj
+dir lqwntmdg
+dir lrrl
+dir qgpr
+222006 tndtmwfv
+$ cd gljcvm
+$ ls
+264381 tmwzlzn
+$ cd ..
+$ cd lqwntmdg
+$ ls
+dir jjfwr
+dir rfqbmb
+$ cd jjfwr
+$ ls
+dir cfhjvmh
+$ cd cfhjvmh
+$ ls
+dir gzfgc
+$ cd gzfgc
+$ ls
+134989 cfhjvmh.wwh
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rfqbmb
+$ ls
+dir cbrvhz
+dir flcw
+dir mnd
+$ cd cbrvhz
+$ ls
+131072 wdtm.rjr
+$ cd ..
+$ cd flcw
+$ ls
+216675 wlfwpb.wpg
+$ cd ..
+$ cd mnd
+$ ls
+28976 hzzzzvmr.lsz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+dir cpmvnf
+dir dcfmtw
+dir ggnwqcj
+7864 lgsc.smg
+42042 mjfdjrgt
+dir mrnhn
+258288 nqth.gcn
+dir nwjggvr
+249578 qfnnncr.ftw
+dir sqpgr
+dir wgpqg
+3196 wtpmdqhd.snd
+$ cd cpmvnf
+$ ls
+dir srtqvcv
+$ cd srtqvcv
+$ ls
+dir mrnhn
+$ cd mrnhn
+$ ls
+dir fbrwd
+$ cd fbrwd
+$ ls
+163166 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd dcfmtw
+$ ls
+31712 mrnhn.tgg
+dir nzpdtfr
+dir sntcbctt
+dir vzhvjp
+dir wdtm
+$ cd nzpdtfr
+$ ls
+dir qwtwps
+130527 rhhlfg.tcj
+160893 rwbwp.rmr
+dir vcthd
+$ cd qwtwps
+$ ls
+dir cmf
+$ cd cmf
+$ ls
+73595 wdsjg.thm
+$ cd ..
+$ cd ..
+$ cd vcthd
+$ ls
+15016 cfhjvmh
+$ cd ..
+$ cd ..
+$ cd sntcbctt
+$ ls
+dir lrrl
+dir mjfdjrgt
+dir npqj
+$ cd lrrl
+$ ls
+258433 clgfwbb.htg
+166151 fbt.cnp
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+64472 csphnrqr
+222554 fbt.cnp
+30487 vqb.grr
+$ cd ..
+$ cd npqj
+$ ls
+154071 mtn.pjq
+185929 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd vzhvjp
+$ ls
+161341 mrnhn.wvw
+$ cd ..
+$ cd wdtm
+$ ls
+224565 cdd
+dir jrswcjq
+dir smgbdw
+$ cd jrswcjq
+$ ls
+173122 blm.znb
+$ cd ..
+$ cd smgbdw
+$ ls
+307533 cfhjvmh.ppp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ggnwqcj
+$ ls
+dir bfjvt
+146815 fbt.cnp
+279655 nljrr
+152735 qpv
+$ cd bfjvt
+$ ls
+193338 qlfcz
+238188 qnz.llm
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir cfhjvmh
+dir cjsrvg
+32604 fbt.cnp
+231569 fpjfth.mmc
+dir hghjzpgc
+270425 mjfdjrgt.fdt
+273944 mjfdjrgt.twj
+141791 ztswsbs.pjs
+$ cd cfhjvmh
+$ ls
+306620 lrrl.mgd
+$ cd ..
+$ cd cjsrvg
+$ ls
+303619 dffrqscq.nct
+16738 lrrl.rbb
+63842 zbbwj
+$ cd ..
+$ cd hghjzpgc
+$ ls
+dir mgnq
+273152 mnszcbnv.fzj
+$ cd mgnq
+$ ls
+dir ttmctqlc
+250332 wdsjg.thm
+20054 zpzml
+$ cd ttmctqlc
+$ ls
+9006 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd nwjggvr
+$ ls
+dir bwmglvmt
+202937 lqqmqzl.vqj
+dir lrrl
+dir wmjp
+dir zvlhngjm
+$ cd bwmglvmt
+$ ls
+dir bszd
+244726 dnwvnsn.npc
+dir dqdrngf
+226857 jvcn
+dir lrrl
+288079 mjfdjrgt.ttw
+172669 vqr
+dir wtqgd
+$ cd bszd
+$ ls
+3937 csn.mft
+198599 vpbccpm
+$ cd ..
+$ cd dqdrngf
+$ ls
+26680 lrrl.gch
+150627 tndtmwfv
+$ cd ..
+$ cd lrrl
+$ ls
+dir bzrs
+27874 grjbtv
+$ cd bzrs
+$ ls
+71351 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd wtqgd
+$ ls
+58033 lrrl.cgp
+16732 vnznzhc.bzr
+137407 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+dir wrtp
+$ cd wrtp
+$ ls
+267582 nwmj.rlb
+$ cd ..
+$ cd ..
+$ cd wmjp
+$ ls
+155158 szhljp
+dir tzqqmmp
+163989 zwz.jvq
+$ cd tzqqmmp
+$ ls
+140115 qgwcfnvr.fzt
+$ cd ..
+$ cd ..
+$ cd zvlhngjm
+$ ls
+dir fjt
+214803 mjfdjrgt.zrb
+dir qsvwfb
+187556 tcqgvqr.gmv
+185730 tndtmwfv
+301659 wlfwpb.wpg
+$ cd fjt
+$ ls
+57947 mnchj
+$ cd ..
+$ cd qsvwfb
+$ ls
+23145 dzrgbhgf.dcm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sqpgr
+$ ls
+dir bpnlrhsb
+dir jvdh
+dir zplwvj
+$ cd bpnlrhsb
+$ ls
+22875 wdsjg.thm
+$ cd ..
+$ cd jvdh
+$ ls
+95461 ftmzfwt
+$ cd ..
+$ cd zplwvj
+$ ls
+dir gtd
+$ cd gtd
+$ ls
+50675 lgjbhr.jmc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd wgpqg
+$ ls
+65679 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd qgpr
+$ ls
+dir fhnnc
+dir jzmpcc
+dir lrrl
+dir wdtm
+$ cd fhnnc
+$ ls
+84726 tndtmwfv
+$ cd ..
+$ cd jzmpcc
+$ ls
+dir mjfdjrgt
+dir mrnhn
+dir wdtm
+120156 whz.cts
+134435 wlfwpb.wpg
+$ cd mjfdjrgt
+$ ls
+234188 wdtm.bpt
+$ cd ..
+$ cd mrnhn
+$ ls
+dir gphqmvpn
+dir gvtgqn
+$ cd gphqmvpn
+$ ls
+23807 nzl.hzv
+$ cd ..
+$ cd gvtgqn
+$ ls
+225267 fbt.cnp
+132455 mrnhn.vcn
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+dir cfhjvmh
+dir mjfdjrgt
+119601 mjfdjrgt.rhc
+226225 wdsjg.thm
+191042 wdtm
+$ cd cfhjvmh
+$ ls
+130491 dgdcbwqp.czm
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+87408 djd.ccj
+152868 mjfdjrgt.zcn
+22605 srdfwwtj.rcp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+26548 zwrctnn.lln
+$ cd ..
+$ cd wdtm
+$ ls
+dir jszntstc
+$ cd jszntstc
+$ ls
+210953 gwgmnvsh.nhb
+277302 msqjtrdm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sqhw
+$ ls
+dir djw
+dir dqnhzbh
+dir lwp
+dir mjfdjrgt
+211273 mjfdjrgt.hls
+dir mrnhn
+$ cd djw
+$ ls
+98290 cfhjvmh.jpr
+$ cd ..
+$ cd dqnhzbh
+$ ls
+43311 bdf.pzd
+68801 cfwdq.rbz
+dir cmfhw
+dir cwtm
+77978 nnzhntgh
+138343 nqth.gcn
+81692 tzhltsq
+dir zwhs
+$ cd cmfhw
+$ ls
+dir dsbjlmrf
+215307 fbt.cnp
+dir lch
+217372 mjfdjrgt.dzq
+228751 tndtmwfv
+dir tpgszv
+$ cd dsbjlmrf
+$ ls
+92510 pzq.hcl
+$ cd ..
+$ cd lch
+$ ls
+171339 czhsjn.ttq
+$ cd ..
+$ cd tpgszv
+$ ls
+215263 nvgcfqzb.gww
+$ cd ..
+$ cd ..
+$ cd cwtm
+$ ls
+105200 twrb.ljq
+$ cd ..
+$ cd zwhs
+$ ls
+35576 gnt.zdh
+68204 mfg
+207974 njb.lzw
+$ cd ..
+$ cd ..
+$ cd lwp
+$ ls
+65175 jcwncw.tms
+208506 tndtmwfv
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+dir hlgqdqb
+153252 mjfdjrgt.njp
+dir pdsdjdlz
+144949 phsnm.bvl
+287686 zlszpmlv.gsf
+$ cd hlgqdqb
+$ ls
+128570 fdbls
+dir lmhrtp
+dir mjfdjrgt
+184639 mjfdjrgt.lct
+168706 mmlfd
+159454 mrdljff
+dir pzcnzs
+dir rcmzfm
+86088 tndtmwfv
+$ cd lmhrtp
+$ ls
+251922 cfhjvmh.njw
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+61866 nqtrmm.zts
+24980 wlfwpb.wpg
+$ cd ..
+$ cd pzcnzs
+$ ls
+123265 fbt.cnp
+$ cd ..
+$ cd rcmzfm
+$ ls
+dir gjls
+$ cd gjls
+$ ls
+109021 cnzz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pdsdjdlz
+$ ls
+103346 zhfhrzmr.qqm
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir tmldr
+140361 tndtmwfv
+$ cd tmldr
+$ ls
+169607 dvchnsqr.ltc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd vllgn
+$ ls
+58389 tndtmwfv
+$ cd ..
+$ cd wdtm
+$ ls
+dir cfhjvmh
+dir cpcqz
+dir gmrgsmpp
+290978 jbfn
+179525 mjfdjrgt
+dir mrnhn
+dir nvgmrpdf
+dir vpm
+67780 wlfwpb.wpg
+dir ztp
+$ cd cfhjvmh
+$ ls
+dir hqf
+218467 lfl.vpp
+dir rgq
+147778 rhntpj
+dir tgmw
+$ cd hqf
+$ ls
+207656 blvtl.zhg
+$ cd ..
+$ cd rgq
+$ ls
+54691 cfhjvmh.mhw
+201230 jjhr.lml
+22759 mgqdg.qsj
+$ cd ..
+$ cd tgmw
+$ ls
+153570 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd cpcqz
+$ ls
+dir cfhjvmh
+17143 fbt.cnp
+dir ftpm
+dir lrrl
+92760 lwdzptgw.gfv
+dir mrnhn
+151636 tndtmwfv
+dir vqt
+$ cd cfhjvmh
+$ ls
+17554 wlfwpb.wpg
+$ cd ..
+$ cd ftpm
+$ ls
+244476 crpfc.bwn
+290894 dhdnh
+210196 lhf
+58166 nqth.gcn
+$ cd ..
+$ cd lrrl
+$ ls
+229894 btrbfh.twr
+269093 cfhjvmh.pbb
+277722 fvhtjpg.pvb
+236232 gztc.lbh
+dir mjfdjrgt
+230753 qgjrh.zsf
+dir sdvhlnz
+$ cd mjfdjrgt
+$ ls
+186105 lrrl.zng
+226081 lsdzz.gsj
+33416 nqth.gcn
+109966 wgtclbvt.nct
+160015 wlfwpb.wpg
+$ cd ..
+$ cd sdvhlnz
+$ ls
+219905 cngbvwz.zsm
+284092 dgjz
+dir lcmlmr
+22135 lrrl
+dir vdcbcvzv
+dir wdwgp
+dir zllqgnhj
+$ cd lcmlmr
+$ ls
+dir lrrl
+$ cd lrrl
+$ ls
+104034 cpv
+$ cd ..
+$ cd ..
+$ cd vdcbcvzv
+$ ls
+263858 qwsmpvdv.lfr
+dir sldsnqld
+$ cd sldsnqld
+$ ls
+3116 hvsb.vrj
+166766 wqfg.ztg
+$ cd ..
+$ cd ..
+$ cd wdwgp
+$ ls
+11714 wdsjg.thm
+$ cd ..
+$ cd zllqgnhj
+$ ls
+113285 hrjtqzvf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+212363 bhldtsnn.jbp
+194936 wdsjg.thm
+$ cd ..
+$ cd vqt
+$ ls
+46371 lrrl.ztz
+215875 rnggjsg.hsw
+255959 vnjhm.frz
+277765 vwvjnrjp.mwq
+$ cd ..
+$ cd ..
+$ cd gmrgsmpp
+$ ls
+dir fbcv
+275639 fbt.cnp
+dir tnrmj
+65119 vtfjqtw.tqg
+117334 zsg.grj
+$ cd fbcv
+$ ls
+dir htmwl
+292840 wwwspsb.hrb
+$ cd htmwl
+$ ls
+34803 dshcw
+10573 dwtd
+$ cd ..
+$ cd ..
+$ cd tnrmj
+$ ls
+dir cfhjvmh
+dir wqtnrwg
+$ cd cfhjvmh
+$ ls
+110464 wlfwpb.wpg
+$ cd ..
+$ cd wqtnrwg
+$ ls
+283055 mfgllgv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+2633 tndtmwfv
+$ cd ..
+$ cd nvgmrpdf
+$ ls
+32919 pnc
+$ cd ..
+$ cd vpm
+$ ls
+dir ddz
+dir dhmphrn
+dir grr
+132419 mgfdgw.vlt
+dir nbccdd
+dir plw
+183717 pvgbbjgt.wbt
+dir qsmg
+120729 stbh.rvz
+101652 ttqc
+$ cd ddz
+$ ls
+4672 hrnnrzd
+217020 wdtm
+$ cd ..
+$ cd dhmphrn
+$ ls
+dir fwbmb
+dir gdq
+dir lrrl
+dir mrcnm
+dir mrmmr
+161427 rllvrpzl.vcg
+$ cd fwbmb
+$ ls
+258937 dfd.wrl
+103543 gtfgscfg.jjc
+$ cd ..
+$ cd gdq
+$ ls
+133691 bzgt.llh
+278010 cfhjvmh.nhj
+191344 cjbcnfz.rjb
+269115 fbt.cnp
+$ cd ..
+$ cd lrrl
+$ ls
+dir gqqsg
+dir gwbtt
+dir mrnhn
+140500 nqth.gcn
+dir pdtm
+220764 tndtmwfv
+dir vvsvfchb
+$ cd gqqsg
+$ ls
+dir gvn
+dir hzfmdhw
+34666 vfzbvl
+dir wdtm
+$ cd gvn
+$ ls
+206457 cfhjvmh.thh
+133435 hsdsstt
+dir lrrl
+dir rwvbmlq
+127003 sjqvt.lzl
+136402 wlfwpb.wpg
+60537 zwjfrqf.nvl
+$ cd lrrl
+$ ls
+15291 mrnhn.ltr
+190429 wlfwpb.wpg
+119328 wln.msz
+86384 zbhzvrc.gbj
+$ cd ..
+$ cd rwvbmlq
+$ ls
+186907 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd hzfmdhw
+$ ls
+9653 fbt.cnp
+dir lvdhtg
+301280 nqth.gcn
+dir nwnp
+241354 vzrbbj.bfb
+$ cd lvdhtg
+$ ls
+dir cfhjvmh
+dir hzpzz
+296694 mjfdjrgt.mpj
+65800 nqth.gcn
+dir pbfhn
+dir wljjgs
+$ cd cfhjvmh
+$ ls
+87654 htlq
+203005 vhmthzjb
+$ cd ..
+$ cd hzpzz
+$ ls
+153446 brfstm.nwc
+47585 cfhjvmh
+258754 wdtm.gpt
+150809 zlwq.hgr
+$ cd ..
+$ cd pbfhn
+$ ls
+dir mjfdjrgt
+$ cd mjfdjrgt
+$ ls
+16108 rmfwpm.fnt
+$ cd ..
+$ cd ..
+$ cd wljjgs
+$ ls
+228757 bqf.jll
+$ cd ..
+$ cd ..
+$ cd nwnp
+$ ls
+124842 lrrl
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+122771 fbt.cnp
+252697 lpqf.bvg
+264813 mrnhn
+165228 pgn.wnw
+dir vsls
+292567 wlfwpb.wpg
+$ cd vsls
+$ ls
+250070 dvbv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd gwbtt
+$ ls
+dir mjfdjrgt
+2327 nqth.gcn
+20064 sdjvgv.sfr
+$ cd mjfdjrgt
+$ ls
+96726 fbt.cnp
+4801 lrrl.fgv
+180291 wspcp.brw
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir lrrl
+dir mqcstf
+271459 nqth.gcn
+190006 zdln
+$ cd lrrl
+$ ls
+160260 fbt.cnp
+281732 tfpprjj
+$ cd ..
+$ cd mqcstf
+$ ls
+222125 gntrdss.zcw
+dir pdbbbmn
+58613 stwlp.wpl
+$ cd pdbbbmn
+$ ls
+250947 mjfdjrgt
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pdtm
+$ ls
+55975 wdhn
+$ cd ..
+$ cd vvsvfchb
+$ ls
+10547 hpwmnjgc
+157960 tcc
+$ cd ..
+$ cd ..
+$ cd mrcnm
+$ ls
+106708 cfhjvmh
+264809 ffqfm.slz
+dir lrrl
+dir mjfdjrgt
+174610 wlfwpb.wpg
+90207 wwhwvdc.zvc
+$ cd lrrl
+$ ls
+305034 fbt.cnp
+240756 jmfwlmzv.gjc
+77875 wgfpcscz.mdn
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+26073 mrnhn
+$ cd ..
+$ cd ..
+$ cd mrmmr
+$ ls
+287663 qlc
+$ cd ..
+$ cd ..
+$ cd grr
+$ ls
+dir tgb
+$ cd tgb
+$ ls
+203808 psssw.nzs
+$ cd ..
+$ cd ..
+$ cd nbccdd
+$ ls
+62162 wfmhzh
+$ cd ..
+$ cd plw
+$ ls
+185632 ljwvnppm.bcc
+$ cd ..
+$ cd qsmg
+$ ls
+164538 lrrl.flr
+dir vbvtzmsg
+dir wrrtctvd
+$ cd vbvtzmsg
+$ ls
+15318 mrnhn.qlh
+$ cd ..
+$ cd wrrtctvd
+$ ls
+249219 lggjwn.mfj
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ztp
+$ ls
+241178 fzc.swf
+dir hns
+223340 lbmzvf
+dir wdtm
+195144 wlfwpb.wpg
+$ cd hns
+$ ls
+dir fshzss
+77792 mjfdjrgt.qcm
+85013 nlpsw
+274710 pmclgp.lvz
+dir spdzjs
+$ cd fshzss
+$ ls
+297058 fbj.qjm
+131320 wjbhllz.mnf
+$ cd ..
+$ cd spdzjs
+$ ls
+165766 nrzthq.rvj
+10584 zfhqhm.njj
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+dir vnmg
+$ cd vnmg
+$ ls
+83938 mrnhn.wwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ztfdwp
+$ ls
+152895 swjdzqdh.ngv
+215804 tndtmwfv
+68954 wdsjg.thm
diff --git a/2022/src/bin/day_7.rs b/2022/src/bin/day_7.rs
new file mode 100644
index 0000000..8933816
--- /dev/null
+++ b/2022/src/bin/day_7.rs
@@ -0,0 +1,227 @@
+use nom::{
+ branch::alt,
+ bytes::complete::tag,
+ character::complete::{line_ending, not_line_ending, u32 as nom_u32},
+ combinator::map,
+ multi::separated_list1,
+ sequence::{preceded, tuple},
+ IResult,
+};
+use std::fs;
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let input = fs::read_to_string("inputs/day_7.txt")?;
+ let terminal_log = TerminalLog::parser(&input).unwrap().1;
+ let dir_tree = terminal_log.process_to_dir_tree();
+
+ dbg!(dir_tree.sum_sizes_below_threshhold(100000));
+
+ let required_disk_usage = 70000000 - 30000000;
+ let required_deletion = dir_tree.size() - required_disk_usage;
+ dbg!(dir_tree.find_min_size_greater_than(required_deletion));
+
+ Ok(())
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+struct TerminalLog(Vec<TerminalLogItem>);
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+enum TerminalLogItem {
+ Command(TerminalLogCommand),
+ Output(TerminalLogOutput),
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+enum TerminalLogCommand {
+ CdRoot,
+ CdUp,
+ CdDown(String),
+ List,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+enum TerminalLogOutput {
+ Dir(String),
+ File(u32, String),
+}
+
+impl TerminalLog {
+ fn parser(input: &str) -> IResult<&str, TerminalLog> {
+ map(
+ separated_list1(line_ending, TerminalLogItem::parser),
+ TerminalLog,
+ )(input)
+ }
+
+ fn process_to_dir_tree(&self) -> DirTree {
+ use TerminalLogCommand::*;
+ use TerminalLogItem::*;
+ use TerminalLogOutput::*;
+
+ let mut dir_tree_root = DirTree::root();
+ let mut dir_path = Vec::new();
+
+ for log in &self.0 {
+ match log {
+ Command(CdRoot) => dir_path.clear(),
+ Command(CdUp) => {
+ dir_path.pop();
+ }
+ Command(CdDown(dir_name)) => {
+ dir_path.push(dir_name.clone());
+ }
+ Command(List) => {}
+ Output(Dir(dir_name)) => {
+ let dir = DirTree::new(dir_name.clone());
+ dir_tree_root.push_dir(&dir_path, dir);
+ }
+ Output(File(size, name)) => {
+ let file = DirTreeFile {
+ name: name.clone(),
+ size: size.clone(),
+ };
+ dir_tree_root.push_file(&dir_path, file);
+ }
+ }
+ }
+
+ dir_tree_root
+ }
+}
+
+impl TerminalLogItem {
+ fn parser(input: &str) -> IResult<&str, TerminalLogItem> {
+ alt((
+ map(
+ preceded(tag("$ "), TerminalLogCommand::parser),
+ TerminalLogItem::Command,
+ ),
+ map(TerminalLogOutput::parser, TerminalLogItem::Output),
+ ))(input)
+ }
+}
+
+impl TerminalLogCommand {
+ fn parser(input: &str) -> IResult<&str, TerminalLogCommand> {
+ alt((
+ map(tag("cd /"), |_| TerminalLogCommand::CdRoot),
+ map(tag("cd .."), |_| TerminalLogCommand::CdUp),
+ map(preceded(tag("cd "), name_parser), |name| {
+ TerminalLogCommand::CdDown(name)
+ }),
+ map(tag("ls"), |_| TerminalLogCommand::List),
+ ))(input)
+ }
+}
+
+impl TerminalLogOutput {
+ fn parser(input: &str) -> IResult<&str, TerminalLogOutput> {
+ alt((
+ map(preceded(tag("dir "), name_parser), |name| {
+ TerminalLogOutput::Dir(name)
+ }),
+ map(
+ tuple((nom_u32, tag(" "), name_parser)),
+ |(size, _, name)| TerminalLogOutput::File(size, name),
+ ),
+ ))(input)
+ }
+}
+
+fn name_parser(input: &str) -> IResult<&str, String> {
+ map(not_line_ending, |s: &str| s.to_owned())(input)
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+struct DirTree {
+ name: String,
+ files: Vec<DirTreeFile>,
+ dirs: Vec<DirTree>,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+struct DirTreeFile {
+ name: String,
+ size: u32,
+}
+
+impl DirTree {
+ fn root() -> DirTree {
+ DirTree {
+ name: "/".into(),
+ files: Vec::new(),
+ dirs: Vec::new(),
+ }
+ }
+
+ fn new(name: String) -> DirTree {
+ DirTree {
+ name,
+ files: Vec::new(),
+ dirs: Vec::new(),
+ }
+ }
+
+ fn push_dir(&mut self, path: &[String], dir: DirTree) {
+ if path.is_empty() {
+ self.dirs.push(dir);
+ } else {
+ let subdir = self
+ .dirs
+ .iter_mut()
+ .find(|d| d.name == path[0])
+ .expect("Subdir doesn't exist");
+ subdir.push_dir(&path[1..], dir);
+ }
+ }
+
+ fn push_file(&mut self, path: &[String], dir: DirTreeFile) {
+ if path.is_empty() {
+ self.files.push(dir);
+ } else {
+ let subdir = self
+ .dirs
+ .iter_mut()
+ .find(|d| d.name == path[0])
+ .expect("Subdir doesn't exist");
+ subdir.push_file(&path[1..], dir);
+ }
+ }
+
+ fn size(&self) -> u32 {
+ self.files.iter().map(|f| f.size).sum::<u32>()
+ + self.dirs.iter().map(|f| f.size()).sum::<u32>()
+ }
+
+ fn sum_sizes_below_threshhold(&self, threshhold: u32) -> u32 {
+ let self_size = self.size();
+ let self_size_below_threshold = if self_size < threshhold { self_size } else { 0 };
+ self_size_below_threshold
+ + self
+ .dirs
+ .iter()
+ .map(|f| f.sum_sizes_below_threshhold(threshhold))
+ .sum::<u32>()
+ }
+
+ fn find_min_size_greater_than(&self, threshhold: u32) -> Option<u32> {
+ let min_subdir = self
+ .dirs
+ .iter()
+ .filter_map(|d| d.find_min_size_greater_than(threshhold))
+ .min();
+
+ match min_subdir {
+ Some(min) => Some(min),
+ None => {
+ let self_size = self.size();
+ if self_size > threshhold {
+ Some(self_size)
+ } else {
+ None
+ }
+ }
+ }
+ }
+}