From 4003217f59caa835675452b1daad615109590ce4 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Wed, 7 Dec 2022 16:00:48 +0100 Subject: [PATCH] 2022 rust day 7 part 1 --- 2022/rust/inputs/day07.txt | 1015 ++++++++++++++++++++++++++++++ 2022/rust/src/main.rs | 4 +- 2022/rust/src/solutions/day06.rs | 1 + 2022/rust/src/solutions/day07.rs | 130 +++- 4 files changed, 1140 insertions(+), 10 deletions(-) create mode 100644 2022/rust/inputs/day07.txt diff --git a/2022/rust/inputs/day07.txt b/2022/rust/inputs/day07.txt new file mode 100644 index 0000000..bb97661 --- /dev/null +++ b/2022/rust/inputs/day07.txt @@ -0,0 +1,1015 @@ +$ cd / +$ ls +dir dpllhlcv +284723 hznrlfhh.tnz +dir mgjdlmrz +dir njstc +dir nzwbc +dir qzzfvdh +dir smvhphf +$ cd dpllhlcv +$ ls +11223 bplz.rdp +dir gpmlznd +dir pgcctrb +dir wmsl +$ cd gpmlznd +$ ls +dir lwzcss +83678 nzwbc.rgv +dir rhdllvm +94635 wpglzlrf.htl +$ cd lwzcss +$ ls +dir bttplh +$ cd bttplh +$ ls +dir rzj +$ cd rzj +$ ls +59866 nzwbc.psj +$ cd .. +$ cd .. +$ cd .. +$ cd rhdllvm +$ ls +dir mvqfrq +$ cd mvqfrq +$ ls +41266 prvl +$ cd .. +$ cd .. +$ cd .. +$ cd pgcctrb +$ ls +dir dgpfcftj +$ cd dgpfcftj +$ ls +101757 tzjthwc +$ cd .. +$ cd .. +$ cd wmsl +$ ls +215238 bvlvn.pgf +dir hhtztpm +197563 hznrlfhh.tnz +dir tzjthwc +$ cd hhtztpm +$ ls +196378 djfbm.djl +203856 ltnwbvg.rqz +266242 mjrlm +dir ngjd +dir wmsl +$ cd ngjd +$ ls +289546 mjrlm +$ cd .. +$ cd wmsl +$ ls +153439 qqb.qmd +25326 tzjthwc +$ cd .. +$ cd .. +$ cd tzjthwc +$ ls +dir lhccf +235335 nzwbc +dir wgnhhl +dir wmsl +$ cd lhccf +$ ls +dir nzwbc +100347 rrrj.wzl +dir zfwffjn +$ cd nzwbc +$ ls +dir wmsl +$ cd wmsl +$ ls +102053 nzwbc.qbd +$ cd .. +$ cd .. +$ cd zfwffjn +$ ls +dir mrd +23992 rrrj.jcz +dir vnwpddtf +$ cd mrd +$ ls +139407 qqwlrbsw.zfn +$ cd .. +$ cd vnwpddtf +$ ls +287771 dgpfcftj.wpm +59212 qqb.qmd +$ cd .. +$ cd .. +$ cd .. +$ cd wgnhhl +$ ls +120460 rrrj +$ cd .. +$ cd wmsl +$ ls +17612 rlsswjw.wbr +132954 ttbswbhs.ffs +dir zpldfrj +$ cd zpldfrj +$ ls +180679 qljrrlm.clw +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd mgjdlmrz +$ ls +79173 dng.qrc +dir fnfw +dir hwb +dir nfqzjs +dir qdgplmrt +dir znrnj +$ cd fnfw +$ ls +dir bhjm +263282 bplz.rdp +dir dhsvtfc +dir hlh +dir nzwbc +177780 ttbswbhs.ffs +28452 tzjthwc.wlq +19548 wmsl.rmd +$ cd bhjm +$ ls +dir bpl +57561 dgpfcftj +dir glplnd +170692 hwsjhwvf.rmv +dir rrrj +dir tlltjd +dir tzjthwc +dir wmsl +$ cd bpl +$ ls +dir btpglc +275227 fmbpzn +9798 mjztf.nlg +190388 nzwbc +dir tzjthwc +$ cd btpglc +$ ls +276105 rrrj.rhl +$ cd .. +$ cd tzjthwc +$ ls +dir hqmw +280196 hznrlfhh.tnz +51545 mjrlm +228230 wmsl +$ cd hqmw +$ ls +163168 mchnt.pls +$ cd .. +$ cd .. +$ cd .. +$ cd glplnd +$ ls +147261 bplz.rdp +267191 hznrlfhh.tnz +$ cd .. +$ cd rrrj +$ ls +dir dgpfcftj +dir fwdw +277548 hnz +164103 nvcsdq.tpj +265477 qzwsg.ccl +dir tnpjsgnq +dir tpvttzv +209300 wmsl.wtq +$ cd dgpfcftj +$ ls +dir dqtbltwp +$ cd dqtbltwp +$ ls +27856 tzjthwc.gnr +$ cd .. +$ cd .. +$ cd fwdw +$ ls +166347 fgtfj.pnc +140486 mspn.wcw +26602 nzwbc.dhb +81490 qqb.qmd +$ cd .. +$ cd tnpjsgnq +$ ls +dir gbddb +dir gpqssnq +$ cd gbddb +$ ls +1587 qqb.qmd +$ cd .. +$ cd gpqssnq +$ ls +33979 fmjpw.mtp +$ cd .. +$ cd .. +$ cd tpvttzv +$ ls +dir bqvzmb +$ cd bqvzmb +$ ls +79211 fdhjztlv +72991 wgvqvdp.pzp +$ cd .. +$ cd .. +$ cd .. +$ cd tlltjd +$ ls +58096 swqcsnw +$ cd .. +$ cd tzjthwc +$ ls +66628 pzrdpc.fpc +$ cd .. +$ cd wmsl +$ ls +43111 hznrlfhh.tnz +114356 rrrj.rlf +169873 zpwhgzvc.wql +$ cd .. +$ cd .. +$ cd dhsvtfc +$ ls +dir cwbq +201361 dgpfcftj +291508 jjjjwcw +445 pfdvf.pmj +135732 qpc.gsw +115597 wlgrtn.mjb +dir wmsl +$ cd cwbq +$ ls +dir ccgdn +dir gcfbqh +173860 hznrlfhh.tnz +97790 mjrlm +dir qtfhz +dir tpgj +dir tph +$ cd ccgdn +$ ls +dir blnzrjm +46502 fgmntg.crb +dir fwdpw +dir nbldsrfq +11175 nwj.fht +208129 qqb.qmd +dir wpj +$ cd blnzrjm +$ ls +121398 gvs +201215 pdppzscr.vph +dir pwj +3861 smwrnw.hqp +dir tzjthwc +220659 wzccnw.lsc +$ cd pwj +$ ls +279141 bwj.ntc +15325 jvqwhwmh.brq +$ cd .. +$ cd tzjthwc +$ ls +25191 jdgphj +70354 rrrj.szq +256692 wmsl +$ cd .. +$ cd .. +$ cd fwdpw +$ ls +28780 prhjf +$ cd .. +$ cd nbldsrfq +$ ls +57352 dcrhr +$ cd .. +$ cd wpj +$ ls +51243 jmdn.bzh +$ cd .. +$ cd .. +$ cd gcfbqh +$ ls +92250 crmpsc.rbf +284234 tzjthwc +$ cd .. +$ cd qtfhz +$ ls +164311 hznrlfhh.tnz +137031 mjrlm +$ cd .. +$ cd tpgj +$ ls +210570 jdpv.fpw +$ cd .. +$ cd tph +$ ls +dir hptp +dir rrrj +$ cd hptp +$ ls +272964 qqb.qmd +147435 svrcpb +$ cd .. +$ cd rrrj +$ ls +145269 btzl.vcs +156500 tzjthwc.ddw +236073 vsrghnhl.wdc +$ cd .. +$ cd .. +$ cd .. +$ cd wmsl +$ ls +62697 mjrlm +dir psndpb +33688 tzjthwc.hjc +100902 tzjthwc.rnm +$ cd psndpb +$ ls +dir dbm +dir fbmfpndf +dir fstgbcrc +272771 lszgqt +136189 mjrlm +166606 qqb.qmd +dir vptjzdt +$ cd dbm +$ ls +dir nzwbc +dir tzjthwc +$ cd nzwbc +$ ls +dir ffmrngmj +$ cd ffmrngmj +$ ls +299742 nrwrptz.cmp +$ cd .. +$ cd .. +$ cd tzjthwc +$ ls +268152 pln +$ cd .. +$ cd .. +$ cd fbmfpndf +$ ls +186758 bplz.rdp +$ cd .. +$ cd fstgbcrc +$ ls +4975 hznrlfhh.tnz +59093 mjrlm +dir nzwbc +279246 qqb.qmd +$ cd nzwbc +$ ls +152443 nzwbc +$ cd .. +$ cd .. +$ cd vptjzdt +$ ls +117403 ttbswbhs.ffs +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hlh +$ ls +96676 rrrj.mfv +$ cd .. +$ cd nzwbc +$ ls +192533 njwsbs.srq +$ cd .. +$ cd .. +$ cd hwb +$ ls +44576 dshmsgj.cnd +70710 tdcgvdv.phs +$ cd .. +$ cd nfqzjs +$ ls +18103 tfwmgdj +$ cd .. +$ cd qdgplmrt +$ ls +163549 mjrlm +$ cd .. +$ cd znrnj +$ ls +dir dgpfcftj +53146 mzbpjgd.lmp +202250 vmtdc +$ cd dgpfcftj +$ ls +dir cdgrjlz +238240 fmtclb.vfq +$ cd cdgrjlz +$ ls +89863 dpnzsq.dbd +259686 mjrlm +50165 qqb.qmd +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd njstc +$ ls +70592 bplz.rdp +100122 ccdp.lpw +dir jnffc +dir jnrrwt +21922 lcr.mqp +dir mdts +9581 rwdnfc.zqq +dir zchc +$ cd jnffc +$ ls +54279 vbvpzw.rst +147514 vzshqq.qpb +$ cd .. +$ cd jnrrwt +$ ls +51615 bplz.rdp +dir fvmgmn +dir wjrqnlr +$ cd fvmgmn +$ ls +159538 sntlcs.vms +$ cd .. +$ cd wjrqnlr +$ ls +dir dvcqnv +dir jnjzlhhw +135325 mjrlm +94135 qqb.qmd +$ cd dvcqnv +$ ls +66408 mjrlm +$ cd .. +$ cd jnjzlhhw +$ ls +89668 bplz.rdp +dir btcjthr +$ cd btcjthr +$ ls +dir sbcwwvj +dir tzjthwc +280405 zjf.fqt +$ cd sbcwwvj +$ ls +dir wmsl +$ cd wmsl +$ ls +31258 vfwqsw +$ cd .. +$ cd .. +$ cd tzjthwc +$ ls +dir dgpfcftj +$ cd dgpfcftj +$ ls +281485 lhnnjrcq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd mdts +$ ls +191614 ttbswbhs.ffs +$ cd .. +$ cd zchc +$ ls +dir rrrj +$ cd rrrj +$ ls +102230 ttbswbhs.ffs +$ cd .. +$ cd .. +$ cd .. +$ cd nzwbc +$ ls +30185 bplz.rdp +dir dgpfcftj +238614 hfg.tsw +215453 lzvmwg.crp +dir mfbhtb +dir nbdn +dir nzw +77355 qqb.qmd +114201 wmsl +dir zcv +$ cd dgpfcftj +$ ls +258786 dhdmsqfs.jhs +dir ltrg +dir nzwbc +18568 qqb.qmd +$ cd ltrg +$ ls +dir nzwbc +dir wmsl +$ cd nzwbc +$ ls +72334 fhd +$ cd .. +$ cd wmsl +$ ls +dir rvt +$ cd rvt +$ ls +232235 nzwbc +$ cd .. +$ cd .. +$ cd .. +$ cd nzwbc +$ ls +29531 rnl +$ cd .. +$ cd .. +$ cd mfbhtb +$ ls +21538 sjrwtjcq +$ cd .. +$ cd nbdn +$ ls +120432 bplz.rdp +180737 hjsv +295982 mjrlm +dir rscwnwt +13218 vzjtg.hhp +1332 zjwf.spw +$ cd rscwnwt +$ ls +268727 fnvfrbzg.wmw +155540 jgfvpmp +242598 rrrj +47339 vqqqmg.dss +$ cd .. +$ cd .. +$ cd nzw +$ ls +135129 hfbptj.rsq +dir nhzg +dir qshfn +$ cd nhzg +$ ls +219375 tzjthwc.gsl +$ cd .. +$ cd qshfn +$ ls +dir pnjhczqg +dir tzjthwc +279385 whsdfns +141044 wmsl.tpl +$ cd pnjhczqg +$ ls +141321 rlgtn.jvh +dir wrh +$ cd wrh +$ ls +143304 sfvrld.nsz +$ cd .. +$ cd .. +$ cd tzjthwc +$ ls +dir lnhmfb +168870 qqb.qmd +178464 rrrj.qml +201521 rwdwv.gnn +21171 vznflldw.zrf +$ cd lnhmfb +$ ls +dir dzzdvmtl +dir ttnm +$ cd dzzdvmtl +$ ls +dir mrg +$ cd mrg +$ ls +174378 rrrj.lnh +$ cd .. +$ cd .. +$ cd ttnm +$ ls +272667 hznrlfhh.tnz +251551 wmsl.ggr +97289 wmsl.phl +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd zcv +$ ls +dir cwsqwt +dir dgpfcftj +256838 dntqvr.snf +dir nbq +dir nzbdsvt +293181 rrrj.lvd +$ cd cwsqwt +$ ls +141770 bbrgtfh.zmf +100359 mjrlm +96547 qqb.qmd +176620 ttbswbhs.ffs +$ cd .. +$ cd dgpfcftj +$ ls +82245 pqjjnjrw +295247 rrrj.lfw +$ cd .. +$ cd nbq +$ ls +132140 bwdvjv.gwq +dir gbjtzhj +dir mfsr +dir nzwbc +248867 rrrj +226784 sjtsjgrb +94475 tjh.vft +dir tzjthwc +149501 tzjthwc.rgb +$ cd gbjtzhj +$ ls +43689 rrrj.msh +$ cd .. +$ cd mfsr +$ ls +30068 sntz.lqw +dir tch +dir zzgtsqvh +$ cd tch +$ ls +dir tzjthwc +$ cd tzjthwc +$ ls +289238 sjwjdmd +$ cd .. +$ cd .. +$ cd zzgtsqvh +$ ls +289069 tzjthwc.mql +$ cd .. +$ cd .. +$ cd nzwbc +$ ls +138407 hgtr.hst +$ cd .. +$ cd tzjthwc +$ ls +173287 tclm.zqt +$ cd .. +$ cd .. +$ cd nzbdsvt +$ ls +89301 ttbswbhs.ffs +$ cd .. +$ cd .. +$ cd .. +$ cd qzzfvdh +$ ls +102585 dgpfcftj.fbr +dir nzwbc +dir rrrj +dir tzjthwc +dir vgnlftjr +dir vjqzf +dir zhmgmmv +$ cd nzwbc +$ ls +252665 ffq.sjv +87232 hznrlfhh.tnz +dir lfpltbmd +dir lmnvgrm +223794 mjrlm +dir qnfp +dir wdn +$ cd lfpltbmd +$ ls +dir dgpfcftj +59516 frtspbh +$ cd dgpfcftj +$ ls +264780 bplz.rdp +169819 nmwvbqlr.dpd +9212 whtcbl.zzb +$ cd .. +$ cd .. +$ cd lmnvgrm +$ ls +12367 nwc.qbd +dir rrrj +dir wmsl +$ cd rrrj +$ ls +269510 tctgzc +$ cd .. +$ cd wmsl +$ ls +138765 bdgpp.fwd +298221 fljmgctv +90883 hwmwtln +2731 jnhrtbqs +$ cd .. +$ cd .. +$ cd qnfp +$ ls +78470 ddbcjwg.wqc +dir ldq +dir ljv +dir nzwbc +254734 qrwct.rvp +dir wmsl +95613 wmsl.wgv +$ cd ldq +$ ls +268677 ttbswbhs.ffs +dir wmsl +$ cd wmsl +$ ls +dir wfqbv +$ cd wfqbv +$ ls +268503 tgrlfscv.vbn +222733 vwlcnm.wqq +$ cd .. +$ cd .. +$ cd .. +$ cd ljv +$ ls +184758 gjddvvbs.zjq +278919 mjrlm +241428 nzwbc.fsf +dir wdfwp +$ cd wdfwp +$ ls +100960 jnhpmp +204739 sfhjbnq.jpr +110857 twrzzn.tpm +$ cd .. +$ cd .. +$ cd nzwbc +$ ls +171647 glrd +$ cd .. +$ cd wmsl +$ ls +39475 frptpcd.cbf +dir mnd +258387 tzjthwc +$ cd mnd +$ ls +dir wmsl +$ cd wmsl +$ ls +dir rrrj +$ cd rrrj +$ ls +124041 rmrqhf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd wdn +$ ls +220196 gpp.qdd +71184 jsjcvvmd.mdc +228140 rrrj.cqm +$ cd .. +$ cd .. +$ cd rrrj +$ ls +165549 qgd.pgt +206913 rrrj.whw +56087 ttbswbhs.ffs +$ cd .. +$ cd tzjthwc +$ ls +dir cjrtl +dir cmqzqrc +dir dgpfcftj +dir gmlgztg +16349 hgjnnw.nwp +dir qflmtrgh +dir snjv +118210 ttbswbhs.ffs +dir vsq +211036 zsflzpg +$ cd cjrtl +$ ls +157605 frfb.flq +182254 gqtprzlg +dir lldcwcf +86395 ttbswbhs.ffs +dir wmsl +$ cd lldcwcf +$ ls +279487 bplz.rdp +229071 djzs +$ cd .. +$ cd wmsl +$ ls +dir dnfztwvj +$ cd dnfztwvj +$ ls +211224 hznrlfhh.tnz +$ cd .. +$ cd .. +$ cd .. +$ cd cmqzqrc +$ ls +dir bsfqcv +dir dgpfcftj +dir nzwbc +$ cd bsfqcv +$ ls +62520 ltzblpc +$ cd .. +$ cd dgpfcftj +$ ls +144915 bdv.snn +170427 rrrj.qfg +287416 tzjthwc +$ cd .. +$ cd nzwbc +$ ls +223973 zvssq.lch +$ cd .. +$ cd .. +$ cd dgpfcftj +$ ls +dir pzfnlzbj +$ cd pzfnlzbj +$ ls +190720 dgpfcftj.ffm +$ cd .. +$ cd .. +$ cd gmlgztg +$ ls +234781 bplz.rdp +29314 nzwbc.mgl +86928 qqb.qmd +262374 rrrj.qlm +$ cd .. +$ cd qflmtrgh +$ ls +dir rrrj +dir wrm +$ cd rrrj +$ ls +dir wftzbw +$ cd wftzbw +$ ls +dir chzs +$ cd chzs +$ ls +dir dfhzcft +$ cd dfhzcft +$ ls +93504 mjrlm +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd wrm +$ ls +13708 jzgqvthh +138652 mlwflb +145161 szfzs.clj +297793 ttbswbhs.ffs +$ cd .. +$ cd .. +$ cd snjv +$ ls +dir grq +92025 nzwbc +dir rrrj +dir wmsl +$ cd grq +$ ls +189188 jzccjh.lsl +dir nzwbc +97611 pngngj +dir tzjthwc +dir wjcjqc +$ cd nzwbc +$ ls +12818 vzc +$ cd .. +$ cd tzjthwc +$ ls +dir cfwvmwr +54762 dgpfcftj +179432 gbt.whg +dir njsfv +220002 whr.jqn +$ cd cfwvmwr +$ ls +227691 pfgmbsjd +$ cd .. +$ cd njsfv +$ ls +39114 fpjqqcsp.czm +289813 mjrlm +279549 qqb.qmd +$ cd .. +$ cd .. +$ cd wjcjqc +$ ls +258155 ttbswbhs.ffs +$ cd .. +$ cd .. +$ cd rrrj +$ ls +277036 bdgws +dir dgpfcftj +269322 dgpfcftj.zgt +dir fsqdnl +33872 qqb.qmd +$ cd dgpfcftj +$ ls +172038 mzjmmddr.fnl +$ cd .. +$ cd fsqdnl +$ ls +250732 zczcgq.lbb +$ cd .. +$ cd .. +$ cd wmsl +$ ls +84076 nzwbc.pmp +196119 rrrj.gph +104986 ttbswbhs.ffs +dir zmvrrdps +$ cd zmvrrdps +$ ls +170723 wmsl.mpg +$ cd .. +$ cd .. +$ cd .. +$ cd vsq +$ ls +136431 hznrlfhh.tnz +195767 mrrc.tst +$ cd .. +$ cd .. +$ cd vgnlftjr +$ ls +29769 mjrlm +53024 wmsl.nhr +123863 wps.hhq +$ cd .. +$ cd vjqzf +$ ls +dir dgpfcftj +dir gnnstzc +45701 lgrst.fhc +265249 spdrmtbd.pnd +182349 ttbswbhs.ffs +$ cd dgpfcftj +$ ls +47874 mvlb.gbn +$ cd .. +$ cd gnnstzc +$ ls +105525 lbqh.pst +13456 rrrj.hlm +62170 vll.cft +$ cd .. +$ cd .. +$ cd zhmgmmv +$ ls +dir fvwm +165656 qtjnmzrd.grm +$ cd fvwm +$ ls +dir dgpfcftj +$ cd dgpfcftj +$ ls +214069 qqb.qmd +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd smvhphf +$ ls +202817 dvtblw.wsr diff --git a/2022/rust/src/main.rs b/2022/rust/src/main.rs index 18fa7d1..851ef30 100644 --- a/2022/rust/src/main.rs +++ b/2022/rust/src/main.rs @@ -1,7 +1,9 @@ +extern crate core; + mod utils; mod solutions; fn main() { - solutions::day06::run(); + solutions::day07::run(); } diff --git a/2022/rust/src/solutions/day06.rs b/2022/rust/src/solutions/day06.rs index fbf9055..d667b51 100644 --- a/2022/rust/src/solutions/day06.rs +++ b/2022/rust/src/solutions/day06.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use std::collections::HashSet; use crate::utils; diff --git a/2022/rust/src/solutions/day07.rs b/2022/rust/src/solutions/day07.rs index e97084f..7f6ab62 100644 --- a/2022/rust/src/solutions/day07.rs +++ b/2022/rust/src/solutions/day07.rs @@ -1,26 +1,127 @@ +use std::collections::{HashMap, HashSet}; +use std::ops::{Deref, DerefMut}; use crate::utils; pub fn run() -> () { - let data = parse_data(utils::read_lines(utils::Source::Scratch)); + let data = parse_data(utils::read_lines(utils::Source::Day(7))); - println!("Day 5"); + println!("Day 7"); println!("Part 1: {}", solve1(&data)); println!("Part 2: {}", solve2(&data)); } -fn solve1(data: &()) -> i32 { - 1 +enum CliEntry { + Cd(String), + Ls, + Dir(String), + File(String, i32), } -fn solve2(data: &()) -> i32 { +struct FileNode<'data> { + name: &'data str, + size: i32, +} + +struct Node<'data> { + name: &'data str, + parent: Option<*mut Node<'data>>, + files: Vec>, + subdirs: Vec>>, +} + +fn cli_to_tree(data: &[CliEntry]) -> Box { + let mut root = Box::new(Node { + name: "/", + parent: None, + files: vec![], + subdirs: vec![], + }); + + let mut current: &mut Node = root.as_mut(); + for command in data { + match command { + CliEntry::Cd(name) => { + if name == ".." { + // We don't care, input has to be valid + unsafe { + current = &mut *current.parent.unwrap() + }; + } + else { + current = current.subdirs.iter_mut() + .find(|next| next.name == name) + .unwrap() + .deref_mut(); + } + }, + CliEntry::Ls => {}, + CliEntry::Dir(name) => { + let current_ptr = current as *mut Node; + current.subdirs.push(Box::new(Node { + name, + parent: Some(current_ptr), + files: vec![], + subdirs: vec![] + })); + }, + CliEntry::File(name, size) => { + current.files.push(FileNode { name, size: *size }) + }, + } + }; + root +} + +fn find_sizes(root: &Box) -> (i32, Vec) { + let mut acc: i32 = root.files.iter().map(|f| f.size).sum(); + let mut sizes: Vec = vec![]; + root.subdirs.iter().for_each(|subdir| { + let (sub_size, sub_sizes) = find_sizes(subdir); + sizes.extend_from_slice(&sub_sizes); + acc += sub_size; + }); + sizes.push(acc); + (acc, sizes) +} + +fn solve1(data: &[CliEntry]) -> i32 { + let tree = cli_to_tree(&data[1..]); + let (_, sizes) = find_sizes(&tree); + + sizes.into_iter() + .filter_map(|size| size + .le(&100000) + .then_some(size) + ) + .sum() +} + +fn solve2(data: &[CliEntry]) -> i32 { 2 } -fn parse_data(data: Vec) -> () { - () +fn parse_data(data: Vec) -> Vec { + data.into_iter() + .map(|s| { + let mut parts = s.split_whitespace().into_iter(); + if s.starts_with('$') { + match parts.nth(1).unwrap() { + "cd" => { CliEntry::Cd(parts.next().unwrap().into()) }, + "ls" => { CliEntry::Ls }, + _ => panic!(), + } + } + else { + match parts.next().unwrap() { + "dir" => CliEntry::Dir(parts.next().unwrap().into()), + other => CliEntry::File(parts.next().unwrap().into(), other.parse().unwrap()) + } + } + }) + .collect() } @@ -29,14 +130,25 @@ mod tests { use super::*; fn data() -> Vec { - vec![""] + vec![ + "$ 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", + ] .into_iter().map(String::from).collect() } #[test] fn part1() { let data = parse_data(data()); - assert_eq!(1, solve1(&data)); + assert_eq!(95437, solve1(&data)); } #[test]