diff --git a/day07/common.rs b/day07/common.rs new file mode 100644 index 0000000..7ece8eb --- /dev/null +++ b/day07/common.rs @@ -0,0 +1,112 @@ +// Copyright 2022 Christian Ulrich +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use std::io; +use std::iter; + +#[derive(Debug)] +pub enum Node { + Directory { name: String, children: Vec }, + File { name: String, size: usize }, +} + +pub struct FileSystem { + root: Node, +} + +impl Node { + pub fn name(&self) -> &str { + match self { + Node::File { name, size: _ } => name, + Node::Directory { name, children: _ } => name, + } + } + + pub fn size(&self) -> usize { + match self { + Node::File { name: _, size } => *size, + Node::Directory { name: _, children } => { + children.iter().fold(0, |acc, c| acc + c.size()) + } + } + } + + pub fn walk(&self) -> Box + '_> { + match self { + Node::File { name: _, size: _ } => Box::new(iter::empty()), + Node::Directory { name: _, children } => Box::new( + children.iter().chain( + children + .iter() + .skip(1) + .fold(children[0].walk(), |acc, c| Box::new(acc.chain(c.walk()))), + ), + ), + } + } +} + +impl FileSystem { + pub fn from_stdin() -> Result { + let mut line = String::new(); + if let Ok(_) = io::stdin().read_line(&mut line) { + return Ok(FileSystem { + root: FileSystem::parse_dir(&line)?, + }); + } + Err("input file is empty") + } + + pub fn root(&self) -> &Node { + &self.root + } + + fn parse_file(line: &str) -> Result { + if let Some((size, name)) = line.trim().split_once(' ') { + return Ok(Node::File { + name: name.into(), + size: size.parse().map_err(|_| "failed to parse file")?, + }); + } + Err("failed to parse file") + } + + fn parse_dir(line: &str) -> Result { + if !line.starts_with("$ cd ") { + return Err("cannot parse directory"); + } + let name = line[5..].trim(); + let mut children = vec![]; + let mut line = String::new(); + match io::stdin().read_line(&mut line) { + Ok(_) if { line == "$ ls\n" } => (), + _ => return Err("cannot parse directory"), + } + loop { + line.clear(); + match io::stdin().read_line(&mut line) { + Ok(_) if { line.starts_with("dir ") } => (), + Ok(_) if { line.trim().is_empty() || line == "$ cd ..\n" } => break, + Ok(_) if { line.starts_with("$ cd ") } => children.push(Self::parse_dir(&line)?), + Ok(_) => children.push(Self::parse_file(&line)?), + _ => assert!(false), + } + } + Ok(Node::Directory { + name: name.into(), + children: children, + }) + } +} diff --git a/day07/input b/day07/input new file mode 100644 index 0000000..9a742c8 --- /dev/null +++ b/day07/input @@ -0,0 +1,1092 @@ +$ cd / +$ ls +dir fts +dir jnwr +dir lrvl +dir nzgprvw +dir snwqjgj +16394 tllvcdr.sjl +195891 zbdp.gqb +dir zddrb +$ cd fts +$ ls +dir dlqtffw +dir rbfmmjvd +254713 wvwhrb.dhh +$ cd dlqtffw +$ ls +73533 nqbvg.fgd +$ cd .. +$ cd rbfmmjvd +$ ls +290697 zcgrgff.fnf +$ cd .. +$ cd .. +$ cd jnwr +$ ls +323577 ghmtnzr +57588 tdcbdpnr +dir wbv +dir zzbvdcf +$ cd wbv +$ ls +dir nmdwbnnr +253584 slzdbm.ncn +$ cd nmdwbnnr +$ ls +208370 scbcsb.pjg +$ cd .. +$ cd .. +$ cd zzbvdcf +$ ls +8052 ssssrhwz +$ cd .. +$ cd .. +$ cd lrvl +$ ls +dir bqqltcg +189288 cwpwh +90813 jhnddzml.lww +dir pwc +dir rjl +dir rzvqvv +dir slzdbm +dir tcbjmq +140665 zbdp.gqb +dir zhbpqlnd +$ cd bqqltcg +$ ls +dir dlbjblbf +dir fdlw +dir jnwr +dir slzdbm +dir zcgrgff +$ cd dlbjblbf +$ ls +11732 rnsrrf.rtv +$ cd .. +$ cd fdlw +$ ls +dir hlvpfw +228436 mzsfcvgv.pqw +$ cd hlvpfw +$ ls +dir dhwq +$ cd dhwq +$ ls +127459 cgdpqh.tct +58310 jnwr.nqt +$ cd .. +$ cd .. +$ cd .. +$ cd jnwr +$ ls +305998 ssssrhwz +129135 vrt.qdt +86204 wnvm.bld +$ cd .. +$ cd slzdbm +$ ls +40915 zbdp.gqb +120991 zsvffwlt.rbp +$ cd .. +$ cd zcgrgff +$ ls +94614 jnwr.mqm +191626 zbdp.gqb +dir ztrslh +$ cd ztrslh +$ ls +dir bhzn +201167 dvcjtzvs.rvd +dir slzdbm +dir szrth +dir zcp +$ cd bhzn +$ ls +119164 qbgmrqw +102090 zbdp.gqb +$ cd .. +$ cd slzdbm +$ ls +124928 gtdq +$ cd .. +$ cd szrth +$ ls +dir hpbbsq +dir vlwlsdjp +dir zcgrgff +$ cd hpbbsq +$ ls +151717 qsdhff.jsv +$ cd .. +$ cd vlwlsdjp +$ ls +15049 glpdjtq.mwm +302526 jnwr.tds +9550 lhwtbh +22857 ssssrhwz +$ cd .. +$ cd zcgrgff +$ ls +73640 mpq.cdn +dir zcgrgff +$ cd zcgrgff +$ ls +115955 rssmrfbq.trs +$ cd .. +$ cd .. +$ cd .. +$ cd zcp +$ ls +dir qdjtmwrr +dir wpdjttm +$ cd qdjtmwrr +$ ls +138185 jnwr +$ cd .. +$ cd wpdjttm +$ ls +207755 vvwtghjb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pwc +$ ls +15911 fqw +$ cd .. +$ cd rjl +$ ls +119274 ssssrhwz +$ cd .. +$ cd rzvqvv +$ ls +273935 ssssrhwz +$ cd .. +$ cd slzdbm +$ ls +dir hlvpfw +290414 lgzbzjvd.glj +dir ljpmphn +316440 slzdbm.tsj +$ cd hlvpfw +$ ls +dir mhvmszgh +107004 slzdbm +$ cd mhvmszgh +$ ls +dir tftstdp +$ cd tftstdp +$ ls +176794 mpq.cdn +$ cd .. +$ cd .. +$ cd .. +$ cd ljpmphn +$ ls +37528 slfdb.bqt +$ cd .. +$ cd .. +$ cd tcbjmq +$ ls +96506 lrz.nhb +$ cd .. +$ cd zhbpqlnd +$ ls +14027 ccswrthv.pfd +dir clnqtjz +dir fdsqmnn +dir fwdt +dir nljb +dir npmsdrgp +57812 slfdb.bqt +184299 wmlmg +241025 zcgrgff.wbh +dir zggqfj +$ cd clnqtjz +$ ls +62391 cbhw.wgr +309318 jlm.lfq +dir mzsfcvgv +dir rrn +307583 ssssrhwz +$ cd mzsfcvgv +$ ls +1356 hrbh.wpz +dir vnwqstw +$ cd vnwqstw +$ ls +184434 hnhzdshl.lrl +150624 wsrnprdb.pjf +$ cd .. +$ cd .. +$ cd rrn +$ ls +105792 dzprqqc.rbh +107482 ffdjdbc +dir hnr +dir rdmgtf +dir rgrwp +325147 shqr.pdj +43186 slfdb.bqt +236667 zcgrgff +$ cd hnr +$ ls +dir gljrlhjm +250526 mzsfcvgv.nsb +43164 ssssrhwz +$ cd gljrlhjm +$ ls +dir wjwqrnj +$ cd wjwqrnj +$ ls +142366 gshl.qfc +$ cd .. +$ cd .. +$ cd .. +$ cd rdmgtf +$ ls +193562 gdrdnc.vml +123723 hmqfdht +dir lzfntb +dir mjfwsmgd +208819 nqbgcn.qfq +dir tqh +$ cd lzfntb +$ ls +dir gwnpsvw +dir rsgwzhp +103487 scvllbjh.pnw +$ cd gwnpsvw +$ ls +dir lqnz +81937 zbdp.gqb +$ cd lqnz +$ ls +27250 zcgrgff +$ cd .. +$ cd .. +$ cd rsgwzhp +$ ls +dir hhz +$ cd hhz +$ ls +46435 djvfz +$ cd .. +$ cd .. +$ cd .. +$ cd mjfwsmgd +$ ls +25726 clcvm +170085 zbdp.gqb +$ cd .. +$ cd tqh +$ ls +111272 gdq.llg +3215 hdghs +dir lpdcdr +dir vhfr +$ cd lpdcdr +$ ls +203902 hmqfdht +$ cd .. +$ cd vhfr +$ ls +91584 hmqfdht +dir stmvj +$ cd stmvj +$ ls +315660 wwpq.ffq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rgrwp +$ ls +dir dhwtfld +187439 hmqfdht +dir jnwr +dir npr +dir sdsppq +228581 twd.nnc +42349 wbf.cwb +194162 zbdp.gqb +224441 zcgrgff.qpg +$ cd dhwtfld +$ ls +152381 dqdrd +$ cd .. +$ cd jnwr +$ ls +229758 hmvw.gdz +92710 mzsfcvgv.cdd +79954 stjtn.gft +89831 zbdp.gqb +$ cd .. +$ cd npr +$ ls +52767 hlvpfw.rqb +dir nrbjzvgq +270579 pbsq.msg +240181 slfdb.bqt +dir znbwnh +$ cd nrbjzvgq +$ ls +295237 bwqqvn +229608 dhrjnvtt.lvm +55391 nlvn +dir zcgrgff +$ cd zcgrgff +$ ls +124604 hlvpfw.mlw +$ cd .. +$ cd .. +$ cd znbwnh +$ ls +228293 zcgrgff +$ cd .. +$ cd .. +$ cd sdsppq +$ ls +235741 bcsdzpfj.lvd +dir jnwr +dir njtrhrfm +dir tvq +dir wshgn +$ cd jnwr +$ ls +273541 brcps +dir gjt +dir hlvpfw +dir nbsdvpnj +dir zcgrgff +$ cd gjt +$ ls +184707 zbdp.gqb +$ cd .. +$ cd hlvpfw +$ ls +242810 zcgrgff +$ cd .. +$ cd nbsdvpnj +$ ls +181797 hlvpfw.gsd +294284 hmqfdht +215098 mqbclwwq +$ cd .. +$ cd zcgrgff +$ ls +188814 hmqfdht +$ cd .. +$ cd .. +$ cd njtrhrfm +$ ls +dir dqpjdztt +$ cd dqpjdztt +$ ls +178036 vwg +$ cd .. +$ cd .. +$ cd tvq +$ ls +233085 rmq.zgq +215613 slzdbm.wvf +$ cd .. +$ cd wshgn +$ ls +209007 jnwr.hsr +dir ntrlll +$ cd ntrlll +$ ls +245558 jnwr.tbr +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd fdsqmnn +$ ls +dir dfl +dir hqffnmq +268076 zcgrgff.cfm +dir ztc +$ cd dfl +$ ls +5553 bbvqpgf +128390 lqtvvc.tdj +190189 vnmfcdws +$ cd .. +$ cd hqffnmq +$ ls +28438 ssssrhwz +$ cd .. +$ cd ztc +$ ls +247470 slfdb.bqt +$ cd .. +$ cd .. +$ cd fwdt +$ ls +60342 bdwbzpzz +dir cdcc +dir jldlzttm +261042 ssssrhwz +dir sws +293090 zbdp.gqb +93624 zcgrgff.vgh +$ cd cdcc +$ ls +dir cwpfczr +dir lsrgfml +$ cd cwpfczr +$ ls +303853 wzz.chs +$ cd .. +$ cd lsrgfml +$ ls +63205 hmqfdht +$ cd .. +$ cd .. +$ cd jldlzttm +$ ls +184715 brclwptp +309967 gdbfh.vhn +5460 hlvpfw.fwb +46159 jnwr.ggw +173896 zbdp.gqb +$ cd .. +$ cd sws +$ ls +dir hlvpfw +75133 nqrp.jdg +$ cd hlvpfw +$ ls +71403 cvdd.whl +$ cd .. +$ cd .. +$ cd .. +$ cd nljb +$ ls +105380 lrhmdl +$ cd .. +$ cd npmsdrgp +$ ls +176062 bhm.gfd +dir dgdl +24535 fdfmntpt.qvp +dir jnwr +279503 ssssrhwz +4671 zbdp.gqb +$ cd dgdl +$ ls +4624 qqcp.rcg +$ cd .. +$ cd jnwr +$ ls +dir cvw +122648 hmqfdht +26565 jnwr.fst +271544 jnwr.tqb +170968 mpq.cdn +dir ncqflwrb +103826 qgzlff.frl +dir wclwg +dir wtcfswt +$ cd cvw +$ ls +58583 pjthqdbr.zzh +398 ssssrhwz +$ cd .. +$ cd ncqflwrb +$ ls +105747 wwstfng.cdl +$ cd .. +$ cd wclwg +$ ls +75020 wbq +$ cd .. +$ cd wtcfswt +$ ls +182813 dnln +255923 hmqfdht +$ cd .. +$ cd .. +$ cd .. +$ cd zggqfj +$ ls +dir gpnfpv +dir gzfsnbv +186684 jnwr +dir msrz +$ cd gpnfpv +$ ls +dir hlvpfw +$ cd hlvpfw +$ ls +186814 bgqpn +41444 mzsfcvgv.qpp +292879 zcgrgff +$ cd .. +$ cd .. +$ cd gzfsnbv +$ ls +321796 jnwr.ghb +dir sdgwjtf +$ cd sdgwjtf +$ ls +127216 mzsfcvgv.qlv +$ cd .. +$ cd .. +$ cd msrz +$ ls +dir fzl +32371 jqtgpzw.thg +271389 slfdb.bqt +270845 tchtnp.rsw +146371 zmwbmj +$ cd fzl +$ ls +140610 ssssrhwz +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd nzgprvw +$ ls +dir hgfdbf +218138 mpq.cdn +73419 slfdb.bqt +dir vfztvnjm +269866 wldptfv.bbb +dir zgdsgh +$ cd hgfdbf +$ ls +163792 ssssrhwz +262305 zcgrgff +$ cd .. +$ cd vfztvnjm +$ ls +139863 hlvpfw +138410 hmqfdht +$ cd .. +$ cd zgdsgh +$ ls +194820 dhp.tgt +dir hlvpfw +dir sdllphqd +dir zcgrgff +$ cd hlvpfw +$ ls +44509 hmqfdht +$ cd .. +$ cd sdllphqd +$ ls +47133 mpq.cdn +$ cd .. +$ cd zcgrgff +$ ls +186613 jrrpljrc +$ cd .. +$ cd .. +$ cd .. +$ cd snwqjgj +$ ls +dir slzdbm +dir zcgrgff +dir zldscsc +$ cd slzdbm +$ ls +21422 dplgjzvs.nrn +175310 zcgrgff.dfq +$ cd .. +$ cd zcgrgff +$ ls +dir rrfhvjf +275455 vwnvj.nhb +dir zcgrgff +$ cd rrfhvjf +$ ls +69149 mqmwv.jmr +$ cd .. +$ cd zcgrgff +$ ls +dir zcgrgff +$ cd zcgrgff +$ ls +183398 hmqfdht +93968 sdhmwd +$ cd .. +$ cd .. +$ cd .. +$ cd zldscsc +$ ls +dir fmzvccvg +299187 mpq.cdn +324288 mzsfcvgv.srz +dir prdfldrf +dir sgpdqw +289150 ssssrhwz +3330 vwwj +133537 wbb.fdl +dir wjdpws +$ cd fmzvccvg +$ ls +dir brrlg +dir crm +dir mzsfcvgv +$ cd brrlg +$ ls +17776 jnwr.qqz +$ cd .. +$ cd crm +$ ls +220545 mltrj +177044 mzsfcvgv.thj +$ cd .. +$ cd mzsfcvgv +$ ls +51223 pdnbml.qpg +$ cd .. +$ cd .. +$ cd prdfldrf +$ ls +213872 ftw +$ cd .. +$ cd sgpdqw +$ ls +205684 whrfvw.dph +$ cd .. +$ cd wjdpws +$ ls +dir hlvpfw +$ cd hlvpfw +$ ls +324522 zbdp.gqb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zddrb +$ ls +238213 dhrdjfzl.npj +28938 hlvpfw +313900 hlvpfw.bwd +dir pgbgpn +132967 rrhsr +dir slzdbm +142210 wlvpwjjz +dir zdhcp +$ cd pgbgpn +$ ls +dir jpmvrvt +154268 mpq.cdn +dir mzsfcvgv +dir vvmwgngv +$ cd jpmvrvt +$ ls +150157 ghcvqm +$ cd .. +$ cd mzsfcvgv +$ ls +93810 mjglpwbc.tvt +dir slzdbm +$ cd slzdbm +$ ls +dir jnwr +174522 slzdbm.ncl +$ cd jnwr +$ ls +183686 rpwjvc +$ cd .. +$ cd .. +$ cd .. +$ cd vvmwgngv +$ ls +dir bqc +dir mzsfcvgv +dir qgj +dir wfjzls +$ cd bqc +$ ls +191442 bqsn +dir lmnvtg +278861 mpq.cdn +191779 mthgd.mjp +dir mzsfcvgv +dir twzq +$ cd lmnvtg +$ ls +dir dzdd +7920 hmqfdht +dir rnlctfm +dir slzdbm +213184 zcgrgff.vln +$ cd dzdd +$ ls +dir jnwr +$ cd jnwr +$ ls +71772 hlvpfw +$ cd .. +$ cd .. +$ cd rnlctfm +$ ls +282289 jvnmblr.mdc +24454 ssssrhwz +$ cd .. +$ cd slzdbm +$ ls +316131 mzsfcvgv.czz +$ cd .. +$ cd .. +$ cd mzsfcvgv +$ ls +dir nsvn +dir plj +dir tvmv +$ cd nsvn +$ ls +dir bcmd +dir jcjsp +dir jnwr +$ cd bcmd +$ ls +206778 cpljbvm.vws +86096 lfgjnzhw.rtm +$ cd .. +$ cd jcjsp +$ ls +188389 zbdp.gqb +$ cd .. +$ cd jnwr +$ ls +293633 jhh.wtj +$ cd .. +$ cd .. +$ cd plj +$ ls +323119 qgs +221100 ssssrhwz +264549 zbdp.gqb +$ cd .. +$ cd tvmv +$ ls +198197 mpq.cdn +$ cd .. +$ cd .. +$ cd twzq +$ ls +dir hwgndwpj +$ cd hwgndwpj +$ ls +dir srdzqqf +$ cd srdzqqf +$ ls +101738 slzdbm +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd mzsfcvgv +$ ls +dir hlvpfw +dir vbdw +$ cd hlvpfw +$ ls +270309 wncrt +$ cd .. +$ cd vbdw +$ ls +dir csw +$ cd csw +$ ls +231750 dcjr.jgb +297504 mpq.cdn +215564 plm.rtl +$ cd .. +$ cd .. +$ cd .. +$ cd qgj +$ ls +192181 hmqfdht +dir lmp +250495 mpq.cdn +dir slzdbm +253262 ssssrhwz +dir tzth +$ cd lmp +$ ls +dir jnwr +$ cd jnwr +$ ls +284951 zcgrgff.slq +$ cd .. +$ cd .. +$ cd slzdbm +$ ls +266715 hzbq.plc +dir jnwr +11379 mzsfcvgv.rbw +dir slzdbm +$ cd jnwr +$ ls +108636 mpq.cdn +324035 zzvmlrj.rrl +$ cd .. +$ cd slzdbm +$ ls +68393 zbdp.gqb +$ cd .. +$ cd .. +$ cd tzth +$ ls +12884 hlvpfw.gwl +146470 jnwr +$ cd .. +$ cd .. +$ cd wfjzls +$ ls +191088 hlvpfw.prw +64712 mpq.cdn +103828 pjhg.qmc +dir qvmdt +$ cd qvmdt +$ ls +244001 ssssrhwz +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd slzdbm +$ ls +dir hsvbbbp +dir jdtrdgqs +dir lrldsqcr +194137 mzsfcvgv.hnv +dir nzcbqzdz +$ cd hsvbbbp +$ ls +104752 rcfpnh.vlr +185473 slzdbm.dbr +dir vpwf +dir zhngz +$ cd vpwf +$ ls +266988 frhvp.ltf +82931 mpq.cdn +$ cd .. +$ cd zhngz +$ ls +181282 drtfhrhp +$ cd .. +$ cd .. +$ cd jdtrdgqs +$ ls +37106 hdjl.rrr +$ cd .. +$ cd lrldsqcr +$ ls +dir brwcprn +dir hlvpfw +dir jnwr +dir slzdbm +dir wrmr +dir zjrdgf +dir zrpqf +$ cd brwcprn +$ ls +dir bmjwts +$ cd bmjwts +$ ls +157148 jwbd +251396 qtgc +$ cd .. +$ cd .. +$ cd hlvpfw +$ ls +121723 zbdp.gqb +$ cd .. +$ cd jnwr +$ ls +240747 gfrrtdh +$ cd .. +$ cd slzdbm +$ ls +176832 jnwr +36125 ltwmzw.fdl +132059 plqmwhr.hhv +85540 slzdbm.wzm +23459 zhbwh.cds +$ cd .. +$ cd wrmr +$ ls +90357 zbdp.gqb +$ cd .. +$ cd zjrdgf +$ ls +301679 qbmt.vhh +12942 slfdb.bqt +$ cd .. +$ cd zrpqf +$ ls +241851 pnsdlbs.brw +$ cd .. +$ cd .. +$ cd nzcbqzdz +$ ls +182963 qgg.zsc +dir qwjgb +301344 slfdb.bqt +299029 zbdp.gqb +$ cd qwjgb +$ ls +223978 rprrjp.hfd +164106 wlq.rcq +$ cd .. +$ cd .. +$ cd .. +$ cd zdhcp +$ ls +dir hbggp +dir mzsfcvgv +dir zdsvth +$ cd hbggp +$ ls +302339 qcmfdhvm +112806 rpb.vfl +$ cd .. +$ cd mzsfcvgv +$ ls +dir gpz +dir slzdbm +dir zvjv +$ cd gpz +$ ls +290264 fdl +158548 slfdb.bqt +$ cd .. +$ cd slzdbm +$ ls +dir hlvpfw +dir mzsfcvgv +dir zdcthssc +$ cd hlvpfw +$ ls +49287 zbdp.gqb +$ cd .. +$ cd mzsfcvgv +$ ls +dir gnmtggs +103244 jnwr.gtn +263736 slfdb.bqt +$ cd gnmtggs +$ ls +31665 qhthp.lfh +$ cd .. +$ cd .. +$ cd zdcthssc +$ ls +64408 cgbnzc.cgn +$ cd .. +$ cd .. +$ cd zvjv +$ ls +6088 gnpsb.dml +145405 llp.cbm +dir mgcg +dir nwl +dir rqznjmt +128194 zbdp.gqb +$ cd mgcg +$ ls +dir ngwvm +dir slzdbm +dir smd +dir smr +dir zcgrgff +$ cd ngwvm +$ ls +49186 hmqfdht +$ cd .. +$ cd slzdbm +$ ls +44434 rdcb +$ cd .. +$ cd smd +$ ls +dir fjd +dir rscdvnwt +dir wbhp +318166 zbdp.gqb +$ cd fjd +$ ls +14084 hlvpfw.ghn +$ cd .. +$ cd rscdvnwt +$ ls +6432 fzwpmjm.ntl +$ cd .. +$ cd wbhp +$ ls +dir czv +217474 dnq.cpq +36009 jnwr.zdv +32123 mpq.cdn +27607 mrm.sgs +107593 zbdp.gqb +$ cd czv +$ ls +60750 zcgrgff.mnr +$ cd .. +$ cd .. +$ cd .. +$ cd smr +$ ls +47204 zcgrgff.vsl +$ cd .. +$ cd zcgrgff +$ ls +317050 hjtfb +110272 jrbcbvjw +290867 ltfj.dvl +dir mzsfcvgv +130694 wnc.rnr +206448 zbdp.gqb +$ cd mzsfcvgv +$ ls +dir jnwr +$ cd jnwr +$ ls +20405 bjpvssjt +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd nwl +$ ls +254439 dlv +193910 hlvpfw +13603 hnsdntn.trz +2990 mpq.cdn +$ cd .. +$ cd rqznjmt +$ ls +250114 hlvpfw +189732 mzsfcvgv.vqv +144688 zcgrgff +$ cd .. +$ cd .. +$ cd .. +$ cd zdsvth +$ ls +150609 jnwr.rtr +173402 nftm.nwd +dir njhjrgmf +$ cd njhjrgmf +$ ls +295762 nchztlh.lcs + diff --git a/day07/part1.rs b/day07/part1.rs new file mode 100644 index 0000000..817e8a7 --- /dev/null +++ b/day07/part1.rs @@ -0,0 +1,39 @@ +// Copyright 2022 Christian Ulrich +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// usage: ./part1 < input + +pub mod common; + +use common::{FileSystem, Node}; + +fn main() -> Result<(), &'static str> { + let fs = FileSystem::from_stdin()?; + let mut result = 0; + for node in fs.root().walk() { + if let Node::Directory { + name: _, + children: _, + } = node + { + let size = node.size(); + if size <= 100000 { + result += size; + } + } + } + println!("{result}"); + Ok(()) +} diff --git a/day07/testinput b/day07/testinput new file mode 100644 index 0000000..09a921e --- /dev/null +++ b/day07/testinput @@ -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