From ea5d557f0b94be28c92aba9dcb21e2e7bbc7023d Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 10 Dec 2022 08:17:20 -0800 Subject: [PATCH] Day 7, Parts 1 + 2 Doing this one in Rust kicked my ass. I fought with the compiler for three days and never was able to figure out the borrows and pointers. I gave up yesterday and wrote up a solution in Python. Maybe I'll come back to it one day. --- 2022/Data/day7-input.txt | 1040 +++++++++++++++++++++++++++++++++ 2022/Data/day7-test-input.txt | 23 + 2022/aoc2022/src/day7.rs | 202 +++++++ 2022/aoc2022/src/main.rs | 1 + 2022/day7.py | 125 ++++ 5 files changed, 1391 insertions(+) create mode 100644 2022/Data/day7-input.txt create mode 100644 2022/Data/day7-test-input.txt create mode 100644 2022/aoc2022/src/day7.rs create mode 100755 2022/day7.py diff --git a/2022/Data/day7-input.txt b/2022/Data/day7-input.txt new file mode 100644 index 0000000..77eb5a2 --- /dev/null +++ b/2022/Data/day7-input.txt @@ -0,0 +1,1040 @@ +$ cd / +$ ls +dir bsncwlw +dir dssnr +290062 lpj.tpq +183564 rfhsnp.mfv +dir sfb +199911 ttctlvjp +dir vhbnn +253955 vngjfb.nlm +284563 vzgpzlv.hgm +$ cd bsncwlw +$ ls +264332 gzsrhr.snp +94633 ttctlvjp +$ cd .. +$ cd dssnr +$ ls +101990 vmqbwtd.dqv +$ cd .. +$ cd sfb +$ ls +dir dth +dir gmgwq +dir hmvtj +dir jrcgrvp +dir mjqww +234348 nrrtpbqw +dir ntczgz +dir qvfnt +dir tvmv +dir vrsdff +dir wndttgwm +$ cd dth +$ ls +214526 btvzp +$ cd .. +$ cd gmgwq +$ ls +270924 czj.rsc +dir lfnhb +97804 snqqrvwd.hbq +99847 tjcpgqnm.dvv +$ cd lfnhb +$ ls +110202 cvffv.wzr +45842 lfnhb +181410 mjqww.zhl +72379 snqqrvwd.tsb +46957 vdjjgd.lnb +dir vrsdff +$ cd vrsdff +$ ls +191477 jrcgrvp.plv +292376 mjqww +97997 vdjjgd.lnb +5027 zplw.cmd +$ cd .. +$ cd .. +$ cd .. +$ cd hmvtj +$ ls +dir dqvjbhg +$ cd dqvjbhg +$ ls +98579 vdjjgd.lnb +$ cd .. +$ cd .. +$ cd jrcgrvp +$ ls +dir dzrcrcz +3233 lfnhb.frn +dir sln +dir sqtj +268936 ttctlvjp +dir tzqsbwnb +$ cd dzrcrcz +$ ls +218954 bppp.qfg +206406 zwhtbhg.jms +$ cd .. +$ cd sln +$ ls +269167 fvsc +274943 mjtb.gpd +$ cd .. +$ cd sqtj +$ ls +dir cvjwqpz +dir djqjv +11761 frrdhnsz.ltt +dir htc +dir lfnhb +dir mcfdlh +dir mjqww +$ cd cvjwqpz +$ ls +46716 fpd.ljl +$ cd .. +$ cd djqjv +$ ls +dir gplnb +282457 jgbn.zhm +dir jrcgrvp +dir lfnhb +$ cd gplnb +$ ls +dir gqrlz +dir srpcmhq +dir vrsdff +$ cd gqrlz +$ ls +43021 pmshlv +124139 vrsdff +255316 zpgwmgf +$ cd .. +$ cd srpcmhq +$ ls +128669 jrcgrvp +dir lfnhb +243510 vrsdff.pgt +134902 vzmfbcv.pbc +dir znfw +$ cd lfnhb +$ ls +150844 lfnhb +202341 vngjfb.nlm +$ cd .. +$ cd znfw +$ ls +dir cdnh +dir ctpslqg +dir jrcgrvp +dir tmjnj +dir ttfczgwn +$ cd cdnh +$ ls +83983 bhlmzppw.gzp +dir fdvcmbt +14625 fphdhzbw.fnf +dir ndbztbq +217778 rzvzpn.gzv +$ cd fdvcmbt +$ ls +dir hzgmnswh +dir wtt +$ cd hzgmnswh +$ ls +dir wshrmd +$ cd wshrmd +$ ls +314723 vrsdff.rtc +$ cd .. +$ cd .. +$ cd wtt +$ ls +32262 tqsvdvfp.ggd +$ cd .. +$ cd .. +$ cd ndbztbq +$ ls +91717 sgvn.rss +$ cd .. +$ cd .. +$ cd ctpslqg +$ ls +249954 hnpc.cht +119625 vdjjgd.lnb +$ cd .. +$ cd jrcgrvp +$ ls +dir lfnhb +dir prrhq +$ cd lfnhb +$ ls +115317 ncdpc.mvm +$ cd .. +$ cd prrhq +$ ls +78208 mjqww.mhs +280559 qqhtc.tmr +275434 ttctlvjp +$ cd .. +$ cd .. +$ cd tmjnj +$ ls +20439 cgvctg.sqm +69239 ftlrq.pll +127427 gwgpwlg.dhd +dir snqqrvwd +dir vbqdpjp +$ cd snqqrvwd +$ ls +27706 mjsgdblr +64740 vdjjgd.lnb +$ cd .. +$ cd vbqdpjp +$ ls +dir pchgrt +$ cd pchgrt +$ ls +59640 hmtsjzf +$ cd .. +$ cd .. +$ cd .. +$ cd ttfczgwn +$ ls +85314 pmshlv +$ cd .. +$ cd .. +$ cd .. +$ cd vrsdff +$ ls +315614 jrcgrvp.vgn +$ cd .. +$ cd .. +$ cd jrcgrvp +$ ls +184058 wqmmcclb +$ cd .. +$ cd lfnhb +$ ls +201903 cplb +79091 jgbn.zhm +1778 tpjq.qpr +62410 wtvwvw.gwf +$ cd .. +$ cd .. +$ cd htc +$ ls +dir hhlvws +229278 jrcgrvp.phz +dir njh +$ cd hhlvws +$ ls +174639 lfnhb.wbt +174488 qrjsccz.mbm +107151 vrz.ctn +$ cd .. +$ cd njh +$ ls +dir vzhhrvqj +$ cd vzhhrvqj +$ ls +154428 rnhn.nwm +$ cd .. +$ cd .. +$ cd .. +$ cd lfnhb +$ ls +230816 mmq.fqh +dir nbwtcrpl +dir rlz +62597 rnmdwrw.ljf +552 rtw +232443 vdjjgd.lnb +dir vgvq +$ cd nbwtcrpl +$ ls +dir ftflrgzj +86404 mjqww.zqd +159575 mwpd.gwc +dir nsjfj +dir pfg +$ cd ftflrgzj +$ ls +dir glpnz +282475 vrsdff.ppc +$ cd glpnz +$ ls +dir cdw +dir hjntz +dir jdszmcd +250018 mjqww.gdv +$ cd cdw +$ ls +164522 jgbn.zhm +93952 jhdbcd.swb +$ cd .. +$ cd hjntz +$ ls +257626 vdjjgd.lnb +$ cd .. +$ cd jdszmcd +$ ls +dir lfnhb +dir nwmjhbt +$ cd lfnhb +$ ls +144608 jrcgrvp +$ cd .. +$ cd nwmjhbt +$ ls +81512 cnlwmv.pvq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd nsjfj +$ ls +158675 shsgq +$ cd .. +$ cd pfg +$ ls +98277 lfnhb.tjc +dir snqqrvwd +170691 vtmmz +$ cd snqqrvwd +$ ls +121715 ffr.zpv +105094 jgbn.zhm +$ cd .. +$ cd .. +$ cd .. +$ cd rlz +$ ls +247967 bmlqhfnm +270713 mtg +207128 wvblbnz +$ cd .. +$ cd vgvq +$ ls +209343 jrcgrvp +$ cd .. +$ cd .. +$ cd mcfdlh +$ ls +15958 pbtp.pmh +$ cd .. +$ cd mjqww +$ ls +dir jrcgrvp +dir lfnhb +55522 pmshlv +dir qvmhbp +dir zldldv +$ cd jrcgrvp +$ ls +189839 jrcgrvp +73108 pdzcm.gqm +$ cd .. +$ cd lfnhb +$ ls +dir fgcmvwd +42810 jgbn.zhm +dir jrcgrvp +dir vdpbmtf +$ cd fgcmvwd +$ ls +28530 mjqww.zdr +$ cd .. +$ cd jrcgrvp +$ ls +5386 gpgtds.sdh +$ cd .. +$ cd vdpbmtf +$ ls +284528 crwdp.hhm +54212 pmshlv +$ cd .. +$ cd .. +$ cd qvmhbp +$ ls +dir jrcgrvp +dir ptlmpl +dir vhql +160711 wwt +$ cd jrcgrvp +$ ls +dir ndmprm +254907 rqzhqpt.dbj +dir tvbrzjrq +226311 zjbwrbw +$ cd ndmprm +$ ls +dir jqrdvnbp +dir mjqww +$ cd jqrdvnbp +$ ls +299157 snqqrvwd +$ cd .. +$ cd mjqww +$ ls +dir mjqww +101780 snqqrvwd.fvp +$ cd mjqww +$ ls +40424 pmshlv +$ cd .. +$ cd .. +$ cd .. +$ cd tvbrzjrq +$ ls +172207 bbb.lmg +dir mjqww +dir snqqrvwd +218707 ttctlvjp +289582 vngjfb.nlm +$ cd mjqww +$ ls +dir vrsdff +$ cd vrsdff +$ ls +dir dbfqmmvq +$ cd dbfqmmvq +$ ls +19934 qghnzsv.rgc +$ cd .. +$ cd .. +$ cd .. +$ cd snqqrvwd +$ ls +27161 vdjjgd.lnb +$ cd .. +$ cd .. +$ cd .. +$ cd ptlmpl +$ ls +235908 hlwzt +171817 mbdsf.lvm +$ cd .. +$ cd vhql +$ ls +167713 ddzm.qnz +1725 ggnccf.sbd +dir gmstw +229981 jzp.ldj +80353 lfnhb.qzs +dir tnjnlj +286555 ttctlvjp +$ cd gmstw +$ ls +299744 jrcgrvp.lqt +dir jshshg +dir pmjmngss +145296 vrsdff +152354 vzrwgjpc.msq +$ cd jshshg +$ ls +169710 jgbn.zhm +309539 vnclc +$ cd .. +$ cd pmjmngss +$ ls +305357 mjqww.qph +$ cd .. +$ cd .. +$ cd tnjnlj +$ ls +dir jwtj +dir pghml +$ cd jwtj +$ ls +dir jjtbcdpv +101453 lfnhb +dir ppvbjrhr +dir tplsqph +$ cd jjtbcdpv +$ ls +247459 lprglf.pbt +8862 wjwf.btb +$ cd .. +$ cd ppvbjrhr +$ ls +83453 mjplqgvf.bzc +$ cd .. +$ cd tplsqph +$ ls +300026 nzfjn.plg +dir zwh +$ cd zwh +$ ls +160407 vngjfb.nlm +$ cd .. +$ cd .. +$ cd .. +$ cd pghml +$ ls +88913 bpjf.clf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zldldv +$ ls +160867 vngjfb.nlm +$ cd .. +$ cd .. +$ cd .. +$ cd tzqsbwnb +$ ls +dir lfnhb +dir stdnrj +dir wgfvcjcf +dir wrtnvm +$ cd lfnhb +$ ls +230926 wprbvfc.llh +$ cd .. +$ cd stdnrj +$ ls +118152 nrctwt.hpw +$ cd .. +$ cd wgfvcjcf +$ ls +12672 bmcscsw.tvj +$ cd .. +$ cd wrtnvm +$ ls +162743 jgbn.zhm +$ cd .. +$ cd .. +$ cd .. +$ cd mjqww +$ ls +dir bqpmsnv +dir cfzqvmlc +135084 mjqww.zpw +63486 srf +dir tfzbhps +171527 vdjjgd.lnb +dir vrsdff +$ cd bqpmsnv +$ ls +90710 jgbn.zhm +240953 plvbfgp.cvp +$ cd .. +$ cd cfzqvmlc +$ ls +dir vcfwwlb +$ cd vcfwwlb +$ ls +11321 vdjjgd.lnb +$ cd .. +$ cd .. +$ cd tfzbhps +$ ls +300432 brv +273987 jrcgrvp +dir mjqww +dir qjsjj +8449 rjqrnfct +dir rvm +dir vrsdff +117697 zhwbllv.lpj +$ cd mjqww +$ ls +dir mjqww +250614 mzp +dir rfwwp +dir vrsdff +89064 zqzmpqhd.sgm +$ cd mjqww +$ ls +82140 bqgbbwm +$ cd .. +$ cd rfwwp +$ ls +dir cgmzd +dir jrcgrvp +3536 njnpg +40653 vdjjgd.lnb +99587 vngjfb.nlm +$ cd cgmzd +$ ls +75395 jqnhv.qpl +218635 pmshlv +17021 vngjfb.nlm +$ cd .. +$ cd jrcgrvp +$ ls +58428 dhfqqwt.wtn +196643 jgbn.zhm +dir snqqrvwd +309352 vdjjgd.lnb +$ cd snqqrvwd +$ ls +238675 dzpvwv.ncp +69199 lfnhb.mrb +$ cd .. +$ cd .. +$ cd .. +$ cd vrsdff +$ ls +67256 jqmss.lhp +dir jrvsrhlf +101311 lhbmv.bwl +$ cd jrvsrhlf +$ ls +191305 snqqrvwd +$ cd .. +$ cd .. +$ cd .. +$ cd qjsjj +$ ls +dir bljbhwg +dir fbzg +73749 gth.wwq +dir lfnhb +296698 lfnhb.ccj +62939 mjqww +dir rcltts +$ cd bljbhwg +$ ls +7022 ttctlvjp +$ cd .. +$ cd fbzg +$ ls +290427 vlm.wtf +$ cd .. +$ cd lfnhb +$ ls +232147 hchjd.gvt +87988 pbdsbh.mtj +$ cd .. +$ cd rcltts +$ ls +271382 pmshlv +dir whthc +$ cd whthc +$ ls +248784 pvltmhwq.hww +$ cd .. +$ cd .. +$ cd .. +$ cd rvm +$ ls +dir fgblz +219799 tmdlnjw +280804 trs +198792 ttctlvjp +103869 vdjjgd.lnb +117484 vngjfb.nlm +dir vrsdff +$ cd fgblz +$ ls +146821 ftwzjf +34704 ttctlvjp +$ cd .. +$ cd vrsdff +$ ls +dir jfgdp +113986 rslfvqnj +$ cd jfgdp +$ ls +247425 vdjjgd.lnb +215872 vngjfb.nlm +$ cd .. +$ cd .. +$ cd .. +$ cd vrsdff +$ ls +dir rlbbqld +274950 vrsdff.brz +190523 vrsdff.sgs +$ cd rlbbqld +$ ls +dir mjqww +204582 ttctlvjp +$ cd mjqww +$ ls +dir fjpnsv +293683 jgbn.zhm +$ cd fjpnsv +$ ls +dir gssqhzr +dir tnbrwc +$ cd gssqhzr +$ ls +194501 rtqjsrh.qbr +208907 vdjjgd.lnb +$ cd .. +$ cd tnbrwc +$ ls +301363 vrsdff.bjs +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd vrsdff +$ ls +243129 tzftr.lnd +54940 vszlnw.nnz +$ cd .. +$ cd .. +$ cd ntczgz +$ ls +dir brzscmg +dir fzcp +$ cd brzscmg +$ ls +253980 jsnwqhts +$ cd .. +$ cd fzcp +$ ls +133626 qpdlplzt.ccr +$ cd .. +$ cd .. +$ cd qvfnt +$ ls +197353 bnmw +dir glzzbcfr +dir rbw +278771 tjsqs.lqr +258759 vdjjgd.lnb +$ cd glzzbcfr +$ ls +205953 jgbn.zhm +207362 snqqrvwd +$ cd .. +$ cd rbw +$ ls +164242 mjqww.lqb +$ cd .. +$ cd .. +$ cd tvmv +$ ls +80194 lpntbv.phh +$ cd .. +$ cd vrsdff +$ ls +dir bgmfwb +dir dvqtdsr +118820 jrcgrvp.nsr +dir pggh +132530 stj.ldg +3436 vwpdb.gmf +dir zlzjmjvn +$ cd bgmfwb +$ ls +dir bqzdswtj +6018 jrcgrvp +276452 jwpms.snh +dir njv +173910 pmshlv +144465 qwqstp +186879 rqchbwl.mwm +dir vrsdff +$ cd bqzdswtj +$ ls +dir jzqcnnw +dir njccj +$ cd jzqcnnw +$ ls +dir fwt +dir rgvmcsb +235477 ttctlvjp +$ cd fwt +$ ls +20557 lfnhb.hqz +$ cd .. +$ cd rgvmcsb +$ ls +89387 snvcfdpf.hvf +$ cd .. +$ cd .. +$ cd njccj +$ ls +262201 lfnhb +200215 ttctlvjp +232220 vngjfb.nlm +$ cd .. +$ cd .. +$ cd njv +$ ls +dir vrsdff +$ cd vrsdff +$ ls +17060 nnvjbqgl +$ cd .. +$ cd .. +$ cd vrsdff +$ ls +dir bjsmnvpp +dir bsgdhgf +dir pgzj +dir snqqrvwd +dir vwn +$ cd bjsmnvpp +$ ls +172378 vngjfb.nlm +$ cd .. +$ cd bsgdhgf +$ ls +32538 dggftf +$ cd .. +$ cd pgzj +$ ls +1788 gsfqvvws.nsd +dir jrg +dir vrsdff +$ cd jrg +$ ls +116492 jgbn.zhm +$ cd .. +$ cd vrsdff +$ ls +dir tjngdssd +$ cd tjngdssd +$ ls +194563 snqqrvwd.gmw +$ cd .. +$ cd .. +$ cd .. +$ cd snqqrvwd +$ ls +dir dlwn +103245 pmshlv +dir pzcl +163325 vngjfb.nlm +40822 vrsdff.chz +$ cd dlwn +$ ls +dir ffhpr +119317 hnb.nzj +$ cd ffhpr +$ ls +131380 bcfwsgs.tzg +209987 jgbn.zhm +286370 pmshlv +$ cd .. +$ cd .. +$ cd pzcl +$ ls +dir mjqww +$ cd mjqww +$ ls +178542 vrsdff.sqs +$ cd .. +$ cd .. +$ cd .. +$ cd vwn +$ ls +268238 vrsdff.mcr +$ cd .. +$ cd .. +$ cd .. +$ cd dvqtdsr +$ ls +109637 gznfwq.tjf +26909 jrcgrvp.gzb +dir pqshn +dir qrdwn +299319 snqqrvwd.dlq +191068 ttctlvjp +dir zgqqb +32751 zzgd +$ cd pqshn +$ ls +292725 sjmctn.ddl +$ cd .. +$ cd qrdwn +$ ls +249329 fmzdmv +dir jrcgrvp +dir snmsbc +158902 vdjjgd.lnb +$ cd jrcgrvp +$ ls +114378 vdjjgd.lnb +$ cd .. +$ cd snmsbc +$ ls +dir ftqwmwh +64765 jgbn.zhm +dir qbcs +$ cd ftqwmwh +$ ls +dir bnqlv +$ cd bnqlv +$ ls +136350 cwlmqt.bbh +dir vrsdff +$ cd vrsdff +$ ls +141840 vngjfb.nlm +228473 vrsdff +$ cd .. +$ cd .. +$ cd .. +$ cd qbcs +$ ls +119659 pmshlv +$ cd .. +$ cd .. +$ cd .. +$ cd zgqqb +$ ls +76559 jgbn.zhm +51194 tfjjcvg.wcz +182300 vdjjgd.lnb +$ cd .. +$ cd .. +$ cd pggh +$ ls +dir bptq +141811 jfggzwlr.qfv +dir mjqww +280055 rvgjwv +47733 tzvslczc +$ cd bptq +$ ls +142261 djwzwblq +dir hzm +171045 jrcgrvp +dir jzdz +65989 pfdm +$ cd hzm +$ ls +dir lwzcrrn +$ cd lwzcrrn +$ ls +75543 rjbvvlns +$ cd .. +$ cd .. +$ cd jzdz +$ ls +29854 rdjhtht +$ cd .. +$ cd .. +$ cd mjqww +$ ls +76340 jrcgrvp.ppr +dir lfnhb +$ cd lfnhb +$ ls +244279 ttctlvjp +$ cd .. +$ cd .. +$ cd .. +$ cd zlzjmjvn +$ ls +116546 vngjfb.nlm +$ cd .. +$ cd .. +$ cd wndttgwm +$ ls +201916 pbjrts.vjz +14494 swbmqtg +$ cd .. +$ cd .. +$ cd vhbnn +$ ls +dir gwj +dir hnsphswl +dir sspz +dir zpgg +$ cd gwj +$ ls +299701 mghnhljr.tmp +$ cd .. +$ cd hnsphswl +$ ls +dir bmpsvbmv +dir ndb +dir pwmfc +dir qrrrt +$ cd bmpsvbmv +$ ls +dir hwpndl +$ cd hwpndl +$ ls +2660 mjqww.bjm +$ cd .. +$ cd .. +$ cd ndb +$ ls +16600 jqdswj.dvp +241104 jscnpf +32178 nwgsvh +$ cd .. +$ cd pwmfc +$ ls +16607 pmshlv +234937 ttctlvjp +127344 vdjjgd.lnb +95778 zgv.src +dir zzvg +$ cd zzvg +$ ls +dir blrd +dir fscnr +147045 smdlbzl +107844 snqqrvwd.gzg +$ cd blrd +$ ls +86042 lfnhb.hpq +$ cd .. +$ cd fscnr +$ ls +135422 zpdlcd +$ cd .. +$ cd .. +$ cd .. +$ cd qrrrt +$ ls +5908 cwwc +dir dgswrljc +dir dlhdg +5261 jgbn.zhm +310282 pmshlv +134603 vngjfb.nlm +202988 zcdtsqq.qfv +$ cd dgswrljc +$ ls +40499 lrttnqm.zbc +312009 pmshlv +$ cd .. +$ cd dlhdg +$ ls +66562 pmshlv +$ cd .. +$ cd .. +$ cd .. +$ cd sspz +$ ls +dir dfs +dir gzwlzc +139140 vngjfb.nlm +222854 vrsdff.bwn +$ cd dfs +$ ls +228281 jjbrp.mjz +204654 nsvv.mjt +309232 qwhfjsnt.ptj +$ cd .. +$ cd gzwlzc +$ ls +dir bsqbbfgz +$ cd bsqbbfgz +$ ls +14589 qgtmg.vgr +$ cd .. +$ cd .. +$ cd .. +$ cd zpgg +$ ls +125276 wfjfpb.wmh diff --git a/2022/Data/day7-test-input.txt b/2022/Data/day7-test-input.txt new file mode 100644 index 0000000..09a921e --- /dev/null +++ b/2022/Data/day7-test-input.txt @@ -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 diff --git a/2022/aoc2022/src/day7.rs b/2022/aoc2022/src/day7.rs new file mode 100644 index 0000000..9a73329 --- /dev/null +++ b/2022/aoc2022/src/day7.rs @@ -0,0 +1,202 @@ +use std::collections::HashMap; + +const INPUT: &'static str = include_str!("../../Data/day7-input.txt"); + +#[derive(Debug)] +struct DirectoryStack<'a> { + stack: Vec<&'a Directory>, +} + +impl<'a> DirectoryStack<'a> { + fn new() -> DirectoryStack<'a> { + DirectoryStack { stack: Vec::new() } + } + + fn clear(&mut self) { + self.stack.clear(); + } + + fn push<'b>(&mut self, dir: &'b Directory) + where + 'b: 'a, + { + self.stack.push(dir); + } + + fn pop(&mut self) -> Option<&Directory> { + self.stack.pop() + } + + fn peek(&mut self) -> Option<&Directory> { + self.stack.last().cloned() + } +} + +#[derive(Debug, PartialEq)] +struct File { + name: String, + size: u32, +} + +impl File { + fn new(name: &str, size: u32) -> File { + File { + name: name.to_string(), + size: size, + } + } +} + +#[derive(Debug, PartialEq)] +struct Directory { + name: String, + directories: HashMap, + files: Vec, +} + +impl Directory { + fn new(name: &str) -> Directory { + Directory { + name: name.to_string(), + directories: HashMap::new(), + files: Vec::new(), + } + } + + fn get_subdirectory(&mut self, name: &str) -> Option<&Directory> { + self.directories.get(name) + } + + fn add_subdirectory(&mut self, directory_name: &str) -> std::result::Result<(), String> { + let name = directory_name.to_string(); + if self.directories.contains_key(&name) { + return Err(format!( + "'{}' already contains subdirectory '{}'", + &self.name, directory_name + )); + } + + self.directories + .insert(name, Directory::new(directory_name)); + + Ok(()) + } + + fn add_file(&mut self, file: File) { + self.files.push(file); + } + + fn size(&self) -> u32 { + self.files.iter().map(|f| f.size).sum::() + + self.directories.values().map(|d| d.size()).sum::() + } +} + +pub fn main(_filename: &str) -> std::io::Result<()> { + let line_reader = INPUT.lines(); + + let root = Directory::new("/"); + let mut directory_stack = DirectoryStack::new(); + + for line in line_reader { + let (prompt, command) = line.split_at(2); + if prompt == "$ " { + let split_command: Vec<&str> = command.split(" ").collect(); + println!("split command: {:?}", split_command); + match split_command[0] { + "cd" => { + let directory_name = split_command[1]; + if directory_name == ".." { + directory_stack.pop(); + } else if directory_name == "/" { + directory_stack.clear(); + directory_stack.push(&root); + } else { + let cwd = directory_stack.peek().expect("No working directory!"); + let subdirectory = cwd + .get_subdirectory(directory_name) + .expect(&format!("No subdirectory named '{}'", directory_name)); + directory_stack.push(&subdirectory); + } + } + "ls" => {} + _ => {} + } + } else { + let split_output: Vec<&str> = line.split(" ").collect(); + println!("{:?}", split_output); + let directory_name = split_output[1]; + + if split_output[0] == "dir" { + dbg!(&directory_stack); + let cwd = directory_stack.peek().expect("No working directory!"); + println!("Creating subdirectory {:?}", directory_name); + cwd.add_subdirectory(directory_name); + } else if let Ok(size) = u32::from_str_radix(split_output[0], 10) { + let cwd = directory_stack.peek().expect("No working directory!"); + let file = File::new(directory_name, size); + println!("Appending file {:?} to {:?}", &file, cwd.name); + cwd.add_file(file); + } + } + } + + Ok(()) +} + +#[cfg(test)] +mod test { + use super::{Directory, DirectoryStack, File}; + + #[test] + fn size_of_empty_directory_is_zero() { + let root = Directory::new("/"); + assert!(root.size() == 0); + } + + #[test] + fn add_subdirectory() { + let mut root = Directory::new("/"); + assert!(root.add_subdirectory("abc").is_ok()); + } + + #[test] + fn add_file() { + let mut root = Directory::new("/"); + assert!(root.size() == 0); + + root.add_file(File::new("abc", 123)); + assert!(root.size() == 123); + } + + #[test] + fn init_directory_stack() { + let _ds = DirectoryStack::new(); + } + + #[test] + fn add_directory_to_stack() { + let mut ds = DirectoryStack::new(); + let dir = Directory::new("abc"); + ds.push(&dir); + } + + #[test] + fn add_directory_to_stack_and_pop() { + let mut ds = DirectoryStack::new(); + let dir = Directory::new("abc"); + ds.push(&dir); + ds.pop(); + } + + #[test] + fn peek_at_top_of_stack() { + let mut ds = DirectoryStack::new(); + let dir = Directory::new("abc"); + ds.push(&dir); + + let top = ds.peek(); + assert!(top.is_some()); + assert!(*top.unwrap() == dir); + } +} diff --git a/2022/aoc2022/src/main.rs b/2022/aoc2022/src/main.rs index 094d9e4..71c6d3d 100644 --- a/2022/aoc2022/src/main.rs +++ b/2022/aoc2022/src/main.rs @@ -17,6 +17,7 @@ fn main() { day4::main, day5::main, day6::main, + //day7::main, ]; let args: Vec = env::args().collect(); diff --git a/2022/day7.py b/2022/day7.py new file mode 100755 index 0000000..accdb36 --- /dev/null +++ b/2022/day7.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +# Eryn Wells + +''' +New script. +''' + +import argparse + +TOTAL_DISK_SIZE = 70000000 +SIZE_REQUIRED_FOR_UPDATE = 30000000 + +class File: + def __init__(self, name, size): + self.name = name + self.size = size + + def __repr__(self): + return f'{self.__class__.__name__}({self.name!r}, {self.size!r})' + +class Directory: + def __init__(self, name): + self.name = name + self.directories = {} + self.files = [] + self.parent = None + + def __repr__(self): + return f'{self.__class__.__name__}({self.name!r})' + + def add_subdirectory(self, subdirectory): + assert subdirectory.name not in self.directories + self.directories[subdirectory.name] = subdirectory + subdirectory.parent = self + + def add_file(self, file): + self.files.append(file) + + @property + def size(self): + size_of_directories = sum(d.size for d in self.directories.values()) + size_of_files = sum(f.size for f in self.files) + return size_of_directories + size_of_files + + def pretty_print(self, indent=0): + print(' ' * indent, self.name, f'({self.size})') + for d in self.directories.values(): + d.pretty_print(indent=indent+2) + for f in self.files: + print(' ' * (indent + 2), repr(f)) + +def parse_args(argv, *a, **kw): + parser = argparse.ArgumentParser(*a, **kw) + parser.add_argument('input') + args = parser.parse_args(argv) + return args + +def main(argv): + args = parse_args(argv[1:], prog=argv[0]) + + with open(args.input) as f: + lines = f.readlines() + + print(f'{len(lines)} total lines in input file {args.input}') + + root = Directory('/') + cwd = root + + for line in lines: + split_line = line.strip().split(' ') + if split_line[0] == '$': + if split_line[1] == 'cd': + dir_name = split_line[2].strip() + if dir_name == '/': + cwd = root + elif dir_name == '..': + cwd = cwd.parent + else: + cwd = cwd.directories[dir_name] + print(f'Set cwd to {cwd}') + elif split_line[1] == 'ls': + print(f'Nothing to do for `ls` in {cwd}') + # Nothing to do here. + pass + elif split_line[0] == 'dir': + # dir [name] + name = split_line[1] + print(f'Found subdirectory {name} in {cwd}') + cwd.add_subdirectory(Directory(name)) + else: + # [size] [name] + name = split_line[1] + size = int(split_line[0]) + print(f'Found file {name} with size {size} in {cwd}') + cwd.add_file(File(name, size)) + + root.pretty_print() + print(f'Part 0: total size of the entire tree: {root.size}') + + root_size = root.size + free_space = TOTAL_DISK_SIZE - root_size + minimum_size_of_directory_to_delete = SIZE_REQUIRED_FOR_UPDATE - free_space + + part1_sum = 0 + part2_directories = [] + dfs_stack = [root] + while len(dfs_stack): + d = dfs_stack.pop() + dfs_stack.extend(d.directories.values()) + dir_size = d.size + if dir_size <= 100000: + part1_sum += dir_size + if dir_size > minimum_size_of_directory_to_delete: + part2_directories.append(d) + + print(f'Part 1: total size of directories with size less than 100,000: {part1_sum}') + + directory_to_delete = min(part2_directories, key=lambda d: d.size) + print(f'Part 2: size of directory to delete: {directory_to_delete.size}') + + +if __name__ == '__main__': + import sys + result = main(sys.argv) + sys.exit(0 if not result else result)