From ab84537ca5d71b6f2b423eb6fa586eeabaf38bfe Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 13 Dec 2022 12:15:36 +0100 Subject: [PATCH] Added day 7 --- inputs/day7.txt | 1046 +++++++++++++++++++++++++++++++++++++++++++++++ src/bin/day7.rs | 148 +++++++ 2 files changed, 1194 insertions(+) create mode 100644 inputs/day7.txt create mode 100644 src/bin/day7.rs diff --git a/inputs/day7.txt b/inputs/day7.txt new file mode 100644 index 0000000..3c46e58 --- /dev/null +++ b/inputs/day7.txt @@ -0,0 +1,1046 @@ +$ cd / +$ ls +149291 cgc.vzv +dir cmcrzdt +dir hwdvrrp +26925 hwqvsl +dir lsmv +dir ngfllcq +dir ngnzzmpc +dir pwhjps +dir rgwnzttf +260556 tcglclw.hsn +dir trvznjhb +dir wgcqrc +68873 whpnhm +$ cd cmcrzdt +$ ls +dir chqllfw +95243 hjpf +108868 hwqvsl +115004 jpppczvz.mtp +dir lnsgfnbr +dir pdtjlb +dir rqfzvwts +dir trvznjhb +$ cd chqllfw +$ ls +56623 cgs.hbt +134804 zqb.grc +$ cd .. +$ cd lnsgfnbr +$ ls +dir jtzw +dir ngfllcq +dir sdm +dir wlsg +$ cd jtzw +$ ls +dir nfz +$ cd nfz +$ ls +255427 hwqvsl +94147 tmnjbqq.fzh +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +110661 cdgqtwcv.lzn +208050 dpf +$ cd .. +$ cd sdm +$ ls +dir dhwm +dir ngfllcq +125983 rfdz.vqm +24227 tzn +41909 tzn.vnr +dir zdzq +$ cd dhwm +$ ls +dir clr +dir lhv +dir ncvmgn +212499 ngfllcq.dcr +191108 nggnj +dir pdtjlb +dir pwhjps +dir sqqbthdp +dir trvznjhb +$ cd clr +$ ls +dir lnbc +87079 npwhncc +109530 pfqhpr.tzl +249566 tmnjbqq.fzh +dir zgmgztcd +$ cd lnbc +$ ls +62635 ftshngp.vbj +$ cd .. +$ cd zgmgztcd +$ ls +149111 pwhjps.fjm +$ cd .. +$ cd .. +$ cd lhv +$ ls +dir phzfwl +$ cd phzfwl +$ ls +dir gmzcjzm +$ cd gmzcjzm +$ ls +263161 vsptqdv +$ cd .. +$ cd .. +$ cd .. +$ cd ncvmgn +$ ls +245840 hjpf +21272 pbcjtbg +dir stm +$ cd stm +$ ls +dir hnbrd +$ cd hnbrd +$ ls +102906 lftjtq.gdt +45082 vsptqdv +$ cd .. +$ cd .. +$ cd .. +$ cd pdtjlb +$ ls +171382 hwqvsl +$ cd .. +$ cd pwhjps +$ ls +75342 cgc.vzv +185458 hwqvsl +254359 ngfllcq.jzd +dir pdtjlb +200999 slnlws.sgh +91174 vqqbcb +dir zmc +$ cd pdtjlb +$ ls +39001 ngfllcq +$ cd .. +$ cd zmc +$ ls +dir cjqmc +$ cd cjqmc +$ ls +257668 ctsfdprp +889 mzr.hnp +$ cd .. +$ cd .. +$ cd .. +$ cd sqqbthdp +$ ls +154217 pwhjps.jtn +$ cd .. +$ cd trvznjhb +$ ls +105431 hwqvsl +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +183850 dcppzj.lmm +131039 hbpn.zlp +110398 hjpf +dir pwhjps +251784 rqgslj.sqg +dir szqf +150728 vsptqdv +$ cd pwhjps +$ ls +dir pzrtwv +156616 rpbh.ftj +dir tzn +$ cd pzrtwv +$ ls +197890 tzn +$ cd .. +$ cd tzn +$ ls +121296 pdtjlb.nmg +$ cd .. +$ cd .. +$ cd szqf +$ ls +dir ngfllcq +dir qtrhn +$ cd ngfllcq +$ ls +dir vnfcczg +$ cd vnfcczg +$ ls +86691 cgc.vzv +189290 hjds.lwf +230265 hwqvsl +dir jbmvmzn +223129 ngfllcq.mdw +dir rpcbpjvm +215119 tmnjbqq.fzh +$ cd jbmvmzn +$ ls +dir flrszsrr +175047 hjpf +dir jrzf +dir ngfllcq +$ cd flrszsrr +$ ls +163007 zdvfmqr.pfq +$ cd .. +$ cd jrzf +$ ls +32641 qbnz +$ cd .. +$ cd ngfllcq +$ ls +dir dlcvcd +dir gcpftfm +183962 tzn.mjh +$ cd dlcvcd +$ ls +260612 mhf +$ cd .. +$ cd gcpftfm +$ ls +227489 hwqvsl +$ cd .. +$ cd .. +$ cd .. +$ cd rpcbpjvm +$ ls +dir tnwzgrvw +$ cd tnwzgrvw +$ ls +dir trvznjhb +$ cd trvznjhb +$ ls +127767 pdtjlb.qjw +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd qtrhn +$ ls +81716 dngdll +76367 tdj +180116 tmnjbqq.fzh +$ cd .. +$ cd .. +$ cd .. +$ cd zdzq +$ ls +192339 bqcmzm.vzw +dir cplvj +dir drpmlmf +92165 mcthl.dzw +dir qccnln +$ cd cplvj +$ ls +dir gmqddf +71720 hjpf +220700 hwqvsl +260353 lgw.msr +$ cd gmqddf +$ ls +36587 dmdgjrs +$ cd .. +$ cd .. +$ cd drpmlmf +$ ls +4896 hjpf +dir ngfllcq +65712 pwhjps.mng +67097 tmnjbqq.fzh +$ cd ngfllcq +$ ls +248967 swvf.prt +$ cd .. +$ cd .. +$ cd qccnln +$ ls +dir tzn +$ cd tzn +$ ls +81833 vsptqdv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd wlsg +$ ls +181214 nmglzcds.hcg +195698 pdtjlb.vbr +dir trvznjhb +77162 vsptqdv +$ cd trvznjhb +$ ls +237856 trvznjhb +$ cd .. +$ cd .. +$ cd .. +$ cd pdtjlb +$ ls +101237 hwqvsl +dir jssl +dir ngfllcq +dir pvlqvdrw +dir pwhjps +dir tzn +115255 vsptqdv +$ cd jssl +$ ls +76335 smmjjrp +$ cd .. +$ cd ngfllcq +$ ls +102639 cgc.vzv +55243 fjfhdtr.ltc +$ cd .. +$ cd pvlqvdrw +$ ls +38570 pwhjps.qgq +191322 scnbjgg.gww +$ cd .. +$ cd pwhjps +$ ls +dir ghfwwj +dir vtr +$ cd ghfwwj +$ ls +109461 mdtp.ztw +$ cd .. +$ cd vtr +$ ls +dir fmtpdc +$ cd fmtpdc +$ ls +42101 bcdbqcs.lhp +$ cd .. +$ cd .. +$ cd .. +$ cd tzn +$ ls +dir pdtjlb +$ cd pdtjlb +$ ls +154813 vsptqdv +$ cd .. +$ cd .. +$ cd .. +$ cd rqfzvwts +$ ls +250112 hwqvsl +63241 tzn +149460 tzn.pph +$ cd .. +$ cd trvznjhb +$ ls +784 bdptcbl.ntt +108339 cgc.vzv +dir hnpdrdsm +dir mnnwcmd +dir ngfllcq +dir pbsnd +dir pdtjlb +261083 rhl.cjh +dir trvznjhb +103421 wjftfs +$ cd hnpdrdsm +$ ls +253895 pwhjps.nps +36928 ssjhl +235679 tmnjbqq.fzh +38049 trvznjhb.dzs +$ cd .. +$ cd mnnwcmd +$ ls +218411 fvzhntq.rwm +78694 gwlcbbtm +243270 hjpf +15610 trvznjhb.wdj +$ cd .. +$ cd ngfllcq +$ ls +dir fmhlq +dir fwbdttbj +dir hccstwh +$ cd fmhlq +$ ls +142240 rbrwv.hjl +dir tjpwvb +256604 tmnjbqq.fzh +dir trvznjhb +$ cd tjpwvb +$ ls +83436 sfrpt +$ cd .. +$ cd trvznjhb +$ ls +44433 trvznjhb +$ cd .. +$ cd .. +$ cd fwbdttbj +$ ls +4127 hwqvsl +$ cd .. +$ cd hccstwh +$ ls +dir cbd +243765 lvzsrqlw.llc +$ cd cbd +$ ls +158372 vzgtjqbd.tmd +$ cd .. +$ cd .. +$ cd .. +$ cd pbsnd +$ ls +172548 cgc.vzv +261836 pwhjps +$ cd .. +$ cd pdtjlb +$ ls +73184 cgc.vzv +dir mdbjwvh +dir mgt +dir nbrvvghc +98702 ngf.gtb +dir ngfllcq +224788 pdtjlb +191754 tmnjbqq.fzh +189444 tnqwbmzm.vlq +dir tzn +dir ztzsg +$ cd mdbjwvh +$ ls +135602 nvt.rjh +$ cd .. +$ cd mgt +$ ls +dir pbrtf +dir whflvwv +$ cd pbrtf +$ ls +dir tnnnllg +$ cd tnnnllg +$ ls +269436 hjpf +$ cd .. +$ cd .. +$ cd whflvwv +$ ls +185562 ngfllcq +dir rdl +150984 trvznjhb +$ cd rdl +$ ls +231952 mqjcttf +$ cd .. +$ cd .. +$ cd .. +$ cd nbrvvghc +$ ls +dir pdtjlb +$ cd pdtjlb +$ ls +40347 hjpf +dir vwl +$ cd vwl +$ ls +124408 tzn.hjw +$ cd .. +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +54894 bvgf +$ cd .. +$ cd tzn +$ ls +41506 vnhlvqqw.cvd +$ cd .. +$ cd ztzsg +$ ls +216433 fzsnpr.vrd +dir grrngq +dir hcmvbhp +dir lbmnq +19985 ngfllcq +dir pqqjgbvj +dir zsnggz +$ cd grrngq +$ ls +dir cqcvb +dir ngfllcq +dir shrhb +$ cd cqcvb +$ ls +125712 cgc.vzv +69800 fpszwd +160009 rbbwsszz +dir trvznjhb +33640 tzghd.fjp +$ cd trvznjhb +$ ls +dir gtjfll +dir mrncfvnp +dir pwt +dir trvznjhb +173974 tzn +$ cd gtjfll +$ ls +126840 cgc.vzv +180163 fswwvhwn +dir gnpcbvmt +122192 ngfllcq.snb +$ cd gnpcbvmt +$ ls +127188 crhvwb.pct +218972 mwg +$ cd .. +$ cd .. +$ cd mrncfvnp +$ ls +216569 phlbdl +$ cd .. +$ cd pwt +$ ls +119692 tmnjbqq.fzh +$ cd .. +$ cd trvznjhb +$ ls +203464 nltqsvd.fhc +$ cd .. +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +31226 rdwczp.hfq +$ cd .. +$ cd shrhb +$ ls +246035 bnbg +98513 hjpf +$ cd .. +$ cd .. +$ cd hcmvbhp +$ ls +dir cbb +201230 cgc.vzv +dir grmmpz +220707 hjpf +dir jnr +dir psv +dir trvznjhb +134184 trvznjhb.ghp +228507 vsptqdv +$ cd cbb +$ ls +17897 hwqvsl +$ cd .. +$ cd grmmpz +$ ls +214171 spsnch.drs +$ cd .. +$ cd jnr +$ ls +82130 bhjqplbc.rth +$ cd .. +$ cd psv +$ ls +215898 pwhjps +$ cd .. +$ cd trvznjhb +$ ls +dir dfcn +98111 gwt.fmw +20948 hjpf +dir pwhjps +dir rnlrgd +$ cd dfcn +$ ls +dir fqm +179114 mbcrjb +dir trvznjhb +dir vfrrzdb +$ cd fqm +$ ls +dir frgwsrdh +$ cd frgwsrdh +$ ls +142027 hhpwsl +$ cd .. +$ cd .. +$ cd trvznjhb +$ ls +dir nbbb +34253 ngfllcq.src +dir qgqmmvg +dir tfgwmlc +11919 trvznjhb.qgz +dir tzn +24383 zvfzhb.dcw +$ cd nbbb +$ ls +260947 pwhjps.bdq +$ cd .. +$ cd qgqmmvg +$ ls +67028 wjvhq.tdz +$ cd .. +$ cd tfgwmlc +$ ls +dir rmcgqpb +dir wdtmdtz +$ cd rmcgqpb +$ ls +263786 nsmcndc.bjs +$ cd .. +$ cd wdtmdtz +$ ls +37751 lnspfqv.tpp +$ cd .. +$ cd .. +$ cd tzn +$ ls +265035 nqsgm.dhm +$ cd .. +$ cd .. +$ cd vfrrzdb +$ ls +dir pzbtsnd +dir srpdb +$ cd pzbtsnd +$ ls +72770 pdtjlb +$ cd .. +$ cd srpdb +$ ls +231540 dzgsf +dir ngfllcq +dir sjv +$ cd ngfllcq +$ ls +26488 cgc.vzv +195815 dfjss +119177 lbjtjqr +$ cd .. +$ cd sjv +$ ls +225677 msgjj +228113 ngfllcq +92448 tzn.rbp +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pwhjps +$ ls +171613 nzqd.rzh +$ cd .. +$ cd rnlrgd +$ ls +132964 hjpf +146636 hwqvsl +187596 mlrllbbb.wmh +92535 trvznjhb +$ cd .. +$ cd .. +$ cd .. +$ cd lbmnq +$ ls +142963 qfpjgvll.ncb +$ cd .. +$ cd pqqjgbvj +$ ls +dir dfhhzwp +253570 jjbr.cgf +dir lchljrwb +dir pdtjlb +$ cd dfhhzwp +$ ls +dir bqp +$ cd bqp +$ ls +122939 hjpf +$ cd .. +$ cd .. +$ cd lchljrwb +$ ls +259475 fqmppdtd.tjm +$ cd .. +$ cd pdtjlb +$ ls +199658 vsptqdv +$ cd .. +$ cd .. +$ cd zsnggz +$ ls +117242 hjpf +$ cd .. +$ cd .. +$ cd .. +$ cd trvznjhb +$ ls +dir bgvqct +160709 dtq +dir fldlwj +dir ndq +221408 tmnjbqq.fzh +69148 zvfzt.rjm +$ cd bgvqct +$ ls +66024 cmjrmfn.lpt +40153 fdlvqgn.dbt +135848 tmnjbqq.fzh +$ cd .. +$ cd fldlwj +$ ls +172275 ngfllcq.gbb +$ cd .. +$ cd ndq +$ ls +117311 bbhlcn.qll +dir dtzmzgw +123263 hsb +dir jnthg +111208 pdtjlb +200860 pjq +$ cd dtzmzgw +$ ls +dir tzn +$ cd tzn +$ ls +249561 pszf.zcn +$ cd .. +$ cd .. +$ cd jnthg +$ ls +17013 pwhjps.gpp +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hwdvrrp +$ ls +dir fgvqft +dir fwc +dir sfhsb +dir tzn +dir wbtf +$ cd fgvqft +$ ls +215710 wzh +$ cd .. +$ cd fwc +$ ls +184576 dmvqc.tsr +dir hgznwf +dir lfjtqz +dir ngfllcq +53748 ngfllcq.vgl +dir pgpvcp +$ cd hgznwf +$ ls +51012 tmnjbqq.fzh +$ cd .. +$ cd lfjtqz +$ ls +96666 fwttv.qrp +203264 nhc.lgd +dir pwhjps +213570 tzn +$ cd pwhjps +$ ls +69941 frqq.jnv +136814 pqmsc.dgz +185821 rww.trv +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +97361 zcw.zrq +$ cd .. +$ cd pgpvcp +$ ls +834 nwv.mtw +$ cd .. +$ cd .. +$ cd sfhsb +$ ls +78513 pdtjlb +$ cd .. +$ cd tzn +$ ls +dir lpf +$ cd lpf +$ ls +242317 bngfvvgq.ptp +82304 ngfllcq.qdz +dir wsvqtcb +$ cd wsvqtcb +$ ls +32176 vrwlnphn.nnv +$ cd .. +$ cd .. +$ cd .. +$ cd wbtf +$ ls +53446 jvvdpn +41661 ngfllcq.vhl +dir pwhjps +231151 tzn +241080 vdzdhdtb.dgj +dir vlqmz +$ cd pwhjps +$ ls +200296 hdds.lsw +$ cd .. +$ cd vlqmz +$ ls +166538 pwhjps.mnq +$ cd .. +$ cd .. +$ cd .. +$ cd lsmv +$ ls +dir dtjjv +87897 hjpf +216417 hwqvsl +dir ngfllcq +dir pdtjlb +dir qlnlbcdv +230724 vsptqdv +177119 vvzvnn +$ cd dtjjv +$ ls +218742 hjpf +$ cd .. +$ cd ngfllcq +$ ls +38560 cgc.vzv +257037 fbttg.jlc +29948 pwhjps.bvj +1253 trvznjhb.nzl +241388 tzn.vdb +dir wlmtj +$ cd wlmtj +$ ls +51957 hjpf +27480 pwhjps.hgj +dir qdjfgz +dir shb +182077 tclmtwh.wzr +dir trvznjhb +103119 twlf.rnl +31950 tzn.zfm +$ cd qdjfgz +$ ls +238882 hpms.gll +dir qpbsmmp +184633 trvznjhb.nsb +130374 vsptqdv +$ cd qpbsmmp +$ ls +60269 spsbz +$ cd .. +$ cd .. +$ cd shb +$ ls +140111 vsptqdv +$ cd .. +$ cd trvznjhb +$ ls +dir qjqzppj +$ cd qjqzppj +$ ls +203246 hjpf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pdtjlb +$ ls +41982 hjpf +245930 hwqvsl +dir mmnhtmr +42314 ngfllcq.tcn +68269 pdtjlb +103066 vhtjp.grt +$ cd mmnhtmr +$ ls +dir zqjjgvj +$ cd zqjjgvj +$ ls +263209 nvhflpng.ngd +$ cd .. +$ cd .. +$ cd .. +$ cd qlnlbcdv +$ ls +dir jmd +58921 pdtjlb.mwb +dir pzjgmm +dir qqvrvcw +79958 rrqmn.zwv +18158 swjpt.trv +dir trvznjhb +dir tzn +92135 zjb.nns +268795 zspzsb.szp +$ cd jmd +$ ls +137766 pwhjps +$ cd .. +$ cd pzjgmm +$ ls +1704 tzn.rhf +66307 tzn.zll +116623 vrfvctv.clb +$ cd .. +$ cd qqvrvcw +$ ls +179302 zrqf.fcn +$ cd .. +$ cd trvznjhb +$ ls +265026 qfzlgccf.hvz +dir rbbmmcc +$ cd rbbmmcc +$ ls +dir rtr +$ cd rtr +$ ls +dir dtw +$ cd dtw +$ ls +249472 svs.tgj +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd tzn +$ ls +80112 pdtjlb.thm +$ cd .. +$ cd .. +$ cd .. +$ cd ngfllcq +$ ls +228868 ggcfwgr.mwh +10205 gztwg.pwz +136188 hjpf +141381 hwqvsl +250522 pdtjlb.dwg +dir pwhjps +dir qcwvfl +dir tzn +dir zgwcwqr +$ cd pwhjps +$ ls +19881 tmrljtw +$ cd .. +$ cd qcwvfl +$ ls +63317 fcjsw.jcj +dir gvvfsq +272464 lvqc +148216 nwppjnwc.sdg +121107 tzn.ppw +dir vwfb +$ cd gvvfsq +$ ls +80607 jplds.mjz +$ cd .. +$ cd vwfb +$ ls +dir gtlfdvjz +$ cd gtlfdvjz +$ ls +228623 jbbplpz +dir shf +$ cd shf +$ ls +120966 cgc.vzv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd tzn +$ ls +215528 cgc.vzv +112331 gtzcl.rzp +128653 mqd.dcz +dir ngfllcq +dir vmfgbzmw +$ cd ngfllcq +$ ls +207193 qchb.hmv +$ cd .. +$ cd vmfgbzmw +$ ls +16152 vtlgffn +$ cd .. +$ cd .. +$ cd zgwcwqr +$ ls +dir pdtjlb +110033 vsptqdv +$ cd pdtjlb +$ ls +9746 cgc.vzv +8010 jdvjpps +$ cd .. +$ cd .. +$ cd .. +$ cd ngnzzmpc +$ ls +116647 gmsnm +157873 hwqvsl +$ cd .. +$ cd pwhjps +$ ls +96321 cgc.vzv +dir lcds +dir tzn +$ cd lcds +$ ls +134975 wcfv.gpd +$ cd .. +$ cd tzn +$ ls +95149 hjpf +55950 pwhjps.rpq +166540 tdt.pgw +236704 trvznjhb.ccn +$ cd .. +$ cd .. +$ cd rgwnzttf +$ ls +122721 hjpf +$ cd .. +$ cd trvznjhb +$ ls +106424 zvqz +$ cd .. +$ cd wgcqrc +$ ls +87367 hjpf +63133 lld +234148 pwhjps.lcr +dir rjnnz +19538 tzn +233765 zlvznnwj +$ cd rjnnz +$ ls +258856 gpgdm diff --git a/src/bin/day7.rs b/src/bin/day7.rs new file mode 100644 index 0000000..86d9ad5 --- /dev/null +++ b/src/bin/day7.rs @@ -0,0 +1,148 @@ +use regex::Regex; +use std::collections::{HashMap, HashSet}; +use std::error::Error; +use std::fs::File; +use std::io::{self, BufRead}; + +#[derive(Debug)] +struct Directory { + subdirs: HashSet, + files: HashMap, +} + +impl Directory { + fn new() -> Directory { + Directory { + subdirs: HashSet::new(), + files: HashMap::new(), + } + } + + fn add_file(&mut self, name: &str, size: u32) { + self.files.insert(name.to_owned(), size); + } + + fn add_subdir(&mut self, name: &str) { + self.subdirs.insert(name.to_owned()); + } + + fn get_file_sizes(&self) -> u32 { + self.files.values().fold(0, |a, b| a + b) + } +} + +fn get_directory_size(path: &Vec, directories: &HashMap, Directory>) -> u32 { + let mut result = directories[path].get_file_sizes(); + + for subdir in directories[path].subdirs.iter() { + let mut sub_path = path.clone(); + sub_path.push(subdir.to_owned()); + + result += get_directory_size(&sub_path, directories); + } + + result +} + +fn sum_up_dirs(path: &Vec, directories: &HashMap, Directory>) -> u32 { + let mut result = 0; + let own_size = get_directory_size(path, directories); + if own_size < 100000 { + result += own_size; + } + + for subdir in directories[path].subdirs.iter() { + let mut sub_path = path.clone(); + sub_path.push(subdir.to_owned()); + result += sum_up_dirs(&sub_path, directories); + } + + result +} + +fn find_optimal_deletion( + path: &Vec, + optimal_size: u32, + current_optimum: u32, + directories: &HashMap, Directory>, +) -> u32 { + let own_size = get_directory_size(path, directories); + let mut result = if own_size >= optimal_size && own_size < current_optimum { + own_size + } else { + current_optimum + }; + + for subdir in directories[path].subdirs.iter() { + let mut sub_path = path.clone(); + sub_path.push(subdir.to_owned()); + result = find_optimal_deletion(&sub_path, optimal_size, result, directories); + } + + result +} + +fn main() -> Result<(), Box> { + let file = File::open("inputs/day7.txt")?; + let mut lines = io::BufReader::new(file).lines().map(|l| l.unwrap()); + + let mut directories = HashMap::new(); + let mut current_path: Vec = Vec::new(); + + let cd_re = Regex::new(r"^\$ cd (.+)$").unwrap(); + let dir_re = Regex::new(r"^dir (.+)$").unwrap(); + let file_re = Regex::new(r"^([0-9]+) (.+)$").unwrap(); + + for line in lines { + if let Some(result) = cd_re.captures(&line) { + let target = &result[1]; + if target == "/" { + current_path = vec!["/".to_owned()]; + } else if target == ".." { + current_path.pop().unwrap(); + } else { + current_path.push(target.to_owned()); + } + + if !directories.contains_key(¤t_path) { + directories.insert(current_path.clone(), Directory::new()); + } + } else if let Some(result) = dir_re.captures(&line) { + directories + .get_mut(¤t_path) + .unwrap() + .add_subdir(&result[1]); + let mut subdir_path = current_path.clone(); + subdir_path.push(result[1].to_owned()); + if !directories.contains_key(&subdir_path) { + directories.insert(subdir_path, Directory::new()); + } + } else if let Some(result) = file_re.captures(&line) { + let size: u32 = result[1].parse().unwrap(); + let name = &result[2]; + + directories + .get_mut(¤t_path) + .unwrap() + .add_file(name, size); + } + } + + let answer1 = sum_up_dirs(&vec!["/".to_owned()], &directories); + + println!("Answer Part1: {}", answer1); + + let unused_space = 70000000 - get_directory_size(&vec!["/".to_owned()], &directories); + let minimum_deletion_size = 30000000 - unused_space; + + let answer2 = find_optimal_deletion( + &vec!["/".to_owned()], + minimum_deletion_size, + 30000000, + &directories, + ); + + println!("Answer Part2: {}", answer2); + + Ok(()) +}