diff options
-rw-r--r-- | 2022/inputs/day_7.txt | 942 | ||||
-rw-r--r-- | 2022/src/bin/day_7.rs | 227 |
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 + } + } + } + } +} |