feat: day 7 (30 mins)

This commit is contained in:
Ashhhleyyy 2022-12-07 13:28:19 +00:00
parent 096052aec9
commit 26a6cf22c3
Signed by: ash
GPG key ID: 83B789081A0878FB
3 changed files with 1099 additions and 0 deletions

964
.aoc-cache/7.txt Normal file
View file

@ -0,0 +1,964 @@
$ cd /
$ ls
dir cmwrq
dir ftrccld
dir jjlbmtw
dir jpncfpb
dir mddr
dir mthvntdd
55644 pjts.dzh
dir ptzsl
dir wmqc
$ cd cmwrq
$ ls
dir dtbzzl
dir pjnghbm
16144 rvs
50956 swngfrsj.pcj
dir vhvn
dir vrt
dir zgrjmtcq
$ cd dtbzzl
$ ls
42503 ljhpmvd.zqf
dir wwpnn
$ cd wwpnn
$ ls
58541 jjdgzwnq
dir lwqgsbg
dir nztw
dir rdtjztmt
101609 sqqpcvq.llm
dir ssdlqcrw
$ cd lwqgsbg
$ ls
207528 cpqhb.jsf
38543 cqjgspw
dir dtbzzl
106337 dtbzzl.njz
302201 pdv.ppg
dir pjts
175215 pvczm.cfw
dir sbvljdh
$ cd dtbzzl
$ ls
252091 vhvn.zqv
$ cd ..
$ cd pjts
$ ls
155681 bdbfjbgt.rwg
219192 dtcz.gqt
$ cd ..
$ cd sbvljdh
$ ls
dir rdrqc
dir rtfpcswj
$ cd rdrqc
$ ls
242263 pjts.mbt
$ cd ..
$ cd rtfpcswj
$ ls
228044 ssgcjt.twr
$ cd ..
$ cd ..
$ cd ..
$ cd nztw
$ ls
30777 vqfsh.smp
$ cd ..
$ cd rdtjztmt
$ ls
276602 pvczm.cfw
dir rzbb
305089 ssdlqcrw.dgb
$ cd rzbb
$ ls
155253 pvczm.cfw
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
22423 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd pjnghbm
$ ls
189296 ctqfg.ljd
dir dtbzzl
dir pjts
205394 ssdlqcrw.lgv
$ cd dtbzzl
$ ls
239152 fbb.gtn
dir hlw
39308 hsnbffzf.qvc
211316 nhm.zhz
dir nztw
dir pvsjpn
230237 twjq
$ cd hlw
$ ls
dir lfqqrp
dir nztw
$ cd lfqqrp
$ ls
dir mbmfpz
dir mdhfdlw
dir pjts
dir qzs
dir ssdlqcrw
$ cd mbmfpz
$ ls
dir fsrbwl
dir lsmpw
$ cd fsrbwl
$ ls
154657 ftlc.zbr
dir ltsj
228929 pvczm.cfw
dir ssdlqcrw
234216 tdl
$ cd ltsj
$ ls
51204 vmq.sjg
$ cd ..
$ cd ssdlqcrw
$ ls
64928 nztw.gpn
$ cd ..
$ cd ..
$ cd lsmpw
$ ls
61867 dtbzzl.dgj
$ cd ..
$ cd ..
$ cd mdhfdlw
$ ls
92462 dtbzzl.jmq
239442 tczcgf.zwj
$ cd ..
$ cd pjts
$ ls
144464 dtbzzl.lnz
dir pjts
118500 swgt.smz
$ cd pjts
$ ls
173783 dvztnn
103088 jlv.pgh
39332 nhm.zhz
266947 pppfcg
$ cd ..
$ cd ..
$ cd qzs
$ ls
11155 cpqhb.jsf
$ cd ..
$ cd ssdlqcrw
$ ls
192414 gcwqcwrf.vmb
$ cd ..
$ cd ..
$ cd nztw
$ ls
313009 nwt
$ cd ..
$ cd ..
$ cd nztw
$ ls
280535 dtbzzl.grj
269725 ssdlqcrw.tqs
$ cd ..
$ cd pvsjpn
$ ls
105150 jvjb.mdd
142501 nztw.cvp
$ cd ..
$ cd ..
$ cd pjts
$ ls
dir btc
dir tpwcmvch
259357 vqfsh.smp
$ cd btc
$ ls
5264 gdjpql.wqr
$ cd ..
$ cd tpwcmvch
$ ls
141657 jjdgzwnq
15650 nhm.zhz
dir nlrq
182100 qgf.qgj
302332 qshf
244799 vhvn
dir wvnqzjf
$ cd nlrq
$ ls
dir dtbzzl
207207 gnd.vmb
$ cd dtbzzl
$ ls
271143 wjbzmc
$ cd ..
$ cd ..
$ cd wvnqzjf
$ ls
64128 mtzc.rqb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd vhvn
$ ls
187526 vqfsh.smp
$ cd ..
$ cd vrt
$ ls
dir drrnm
dir fqr
270995 nztw.mfg
137476 vqfsh.smp
$ cd drrnm
$ ls
250912 pvczm.cfw
$ cd ..
$ cd fqr
$ ls
229272 nszfcq
dir nztw
170643 phh.pdl
$ cd nztw
$ ls
dir bqf
$ cd bqf
$ ls
9998 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd zgrjmtcq
$ ls
109025 vhvn
$ cd ..
$ cd ..
$ cd ftrccld
$ ls
dir dtbzzl
dir fvmh
dir fwztt
22306 jngjc.mpd
190320 lnr.jhn
dir lsvvn
295676 nztw
135025 nztw.ssc
dir pjts
dir qglhlggq
dir rslphgp
247764 ssdlqcrw.jnm
dir vhvn
$ cd dtbzzl
$ ls
dir fgwh
$ cd fgwh
$ ls
dir dpdvswq
$ cd dpdvswq
$ ls
dir jsstq
248465 vhvn
$ cd jsstq
$ ls
252517 nztw
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd fvmh
$ ls
dir djcn
dir dtbzzl
303052 fbnnfsbp.zzg
77238 mdpcghq.nls
dir mvppnhr
238683 ptw
dir zdqlwnc
$ cd djcn
$ ls
8600 jjdgzwnq
$ cd ..
$ cd dtbzzl
$ ls
dir sppdjcm
dir vtnzqtvj
$ cd sppdjcm
$ ls
237925 dvfctpg.zbn
dir fghb
dir pfjdsm
dir pjts
314661 zfchfq
$ cd fghb
$ ls
280081 cpqhb.jsf
88448 wbcpnnvs.sjc
$ cd ..
$ cd pfjdsm
$ ls
256877 bssmgf
127978 drwttw
103674 hznr.hjg
$ cd ..
$ cd pjts
$ ls
191709 qhwwpzn.dsc
$ cd ..
$ cd ..
$ cd vtnzqtvj
$ ls
dir rrl
$ cd rrl
$ ls
281036 jjdgzwnq
dir lzlswv
dir sjsqnvq
245082 ssdlqcrw.smq
$ cd lzlswv
$ ls
dir dmh
$ cd dmh
$ ls
41234 hlhgn.mvr
233542 tgv.csn
$ cd ..
$ cd ..
$ cd sjsqnvq
$ ls
221327 qjncmbn
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mvppnhr
$ ls
dir ldwv
176153 nztw
dir rmdjdqvl
dir tmj
dir vhvn
$ cd ldwv
$ ls
161179 mjsm
$ cd ..
$ cd rmdjdqvl
$ ls
dir gnztqmhv
dir lpmhfr
dir tphjm
$ cd gnztqmhv
$ ls
176043 qlds.mpq
$ cd ..
$ cd lpmhfr
$ ls
dir jrrdsd
$ cd jrrdsd
$ ls
114477 vqfsh.smp
$ cd ..
$ cd ..
$ cd tphjm
$ ls
74809 dcfmjn
$ cd ..
$ cd ..
$ cd tmj
$ ls
252001 cpqhb.jsf
49666 pqpq
139885 qpj.wpb
116339 vqfsh.smp
$ cd ..
$ cd vhvn
$ ls
89397 dtbzzl.hvp
105454 pvczm.cfw
280352 zdzm
$ cd ..
$ cd ..
$ cd zdqlwnc
$ ls
dir fbhcv
8676 jjdgzwnq
99885 nhm.zhz
234563 pjts.gdj
dir rsdltnvc
$ cd fbhcv
$ ls
71695 hrzzgwqt
296401 vqfsh.smp
$ cd ..
$ cd rsdltnvc
$ ls
41623 gcvtqf
233747 wdcssvgh.vfs
$ cd ..
$ cd ..
$ cd ..
$ cd fwztt
$ ls
96594 jjdgzwnq
245415 mtp.szl
129782 pjts.jjr
308104 pvczm.cfw
dir ssdlqcrw
155109 vhvn.smj
dir vvzsr
$ cd ssdlqcrw
$ ls
dir bzd
292228 dtbzzl.tdb
107505 ssdlqcrw
181384 tfnrpsd
$ cd bzd
$ ls
84648 brdc
171457 vhvn
$ cd ..
$ cd ..
$ cd vvzsr
$ ls
dir bcdqrs
147437 jjdgzwnq
dir ssdlqcrw
197054 ssdlqcrw.dpz
dir vhvn
dir wthshgg
$ cd bcdqrs
$ ls
297401 pspd.dlq
136072 pvczm.cfw
$ cd ..
$ cd ssdlqcrw
$ ls
293104 dtbzzl.pdh
$ cd ..
$ cd vhvn
$ ls
178932 gvrht.cbm
$ cd ..
$ cd wthshgg
$ ls
dir dppwvtmp
dir ljgszd
88822 pcmw.bbq
255776 pvczm.cfw
163501 ssdlqcrw
dir vbjsmgp
dir vzqc
dir zmpdrpd
$ cd dppwvtmp
$ ls
45608 dtbzzl.lfq
164648 gdch.bzp
65225 nhm.zhz
$ cd ..
$ cd ljgszd
$ ls
125627 vqfsh.smp
$ cd ..
$ cd vbjsmgp
$ ls
236951 zpbgb.zmv
$ cd ..
$ cd vzqc
$ ls
234565 fjfpbjjp
254986 jjdgzwnq
164495 nztw.qhz
dir vhvn
$ cd vhvn
$ ls
199196 nztw
$ cd ..
$ cd ..
$ cd zmpdrpd
$ ls
123210 bznqq.dbv
141163 jjdgzwnq
302352 wjf.tdv
92016 wljnwsh
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd lsvvn
$ ls
282867 phv.ncc
$ cd ..
$ cd pjts
$ ls
40866 jjdgzwnq
$ cd ..
$ cd qglhlggq
$ ls
19577 dtbzzl.ngb
21171 jjdgzwnq
136074 pvczm.cfw
212428 rlpjjf.lvh
dir vhvn
274669 wcqlws.ndv
dir wpvq
$ cd vhvn
$ ls
183301 cbppfp.vbc
84069 cqnz
dir dtbzzl
dir mdng
126627 pjts.pvp
dir ptqq
47594 pvczm.cfw
154978 qlnnfbvd
$ cd dtbzzl
$ ls
50385 ccgbrdmb.hrr
22427 rzlwl.jbt
$ cd ..
$ cd mdng
$ ls
dir gdqqtvnp
224013 gtv.tbz
121884 jjdgzwnq
dir nrmhpblm
142950 nztw
9710 pvczm.cfw
dir vhvn
$ cd gdqqtvnp
$ ls
292349 vhvn.nfr
$ cd ..
$ cd nrmhpblm
$ ls
52703 jbvd.mlc
78268 pfns.lpr
$ cd ..
$ cd vhvn
$ ls
274549 pjts
$ cd ..
$ cd ..
$ cd ptqq
$ ls
257967 jqppq.lgb
166450 nhm.zhz
$ cd ..
$ cd ..
$ cd wpvq
$ ls
173437 vqfsh.smp
$ cd ..
$ cd ..
$ cd rslphgp
$ ls
29192 pvczm.cfw
18984 ttpfnqvn.cdr
302301 vqfsh.smp
291211 vsvtc.wwf
$ cd ..
$ cd vhvn
$ ls
dir ssdlqcrw
$ cd ssdlqcrw
$ ls
76864 jpwvws.fwv
26365 nztw.css
185966 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd jjlbmtw
$ ls
211239 ctfhmm.ssv
230020 nztw
109641 sqtjn
$ cd ..
$ cd jpncfpb
$ ls
dir hjgwcmh
286054 pcffhsw.bdm
260831 pvczm.cfw
dir vhvn
$ cd hjgwcmh
$ ls
92277 bbjhc
dir fmst
dir gzjq
$ cd fmst
$ ls
105833 cpqhb.jsf
315858 nhm.zhz
233459 nztw
$ cd ..
$ cd gzjq
$ ls
dir prjqfwf
dir ssdlqcrw
$ cd prjqfwf
$ ls
151003 jnmgdb.rhn
$ cd ..
$ cd ssdlqcrw
$ ls
103688 cpqhb.jsf
$ cd ..
$ cd ..
$ cd ..
$ cd vhvn
$ ls
14901 cpqhb.jsf
98212 tztzq
$ cd ..
$ cd ..
$ cd mddr
$ ls
dir qpfjp
$ cd qpfjp
$ ls
dir cfhv
$ cd cfhv
$ ls
dir ssdlqcrw
$ cd ssdlqcrw
$ ls
134280 vvnpvrqb.hdv
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mthvntdd
$ ls
dir bcdcz
dir cngbf
62389 cwtvl
dir mqjjbq
dir nhblb
6743 pvczm.cfw
dir ssdlqcrw
dir ttvgr
dir vdmm
dir wnhnwjm
dir zdvbsb
$ cd bcdcz
$ ls
213688 dtbzzl.hsv
dir lbvbc
100222 nndbhrf
115627 rqnsfbz.rmf
dir tvgclpsc
258672 vqfsh.smp
163927 whgmd
$ cd lbvbc
$ ls
224836 fpfpwtf.zfz
103806 nztw
$ cd ..
$ cd tvgclpsc
$ ls
76900 cpqhb.jsf
282820 qtffdmsg
$ cd ..
$ cd ..
$ cd cngbf
$ ls
dir hstph
12089 jqvnttq.dsh
38052 nztw.sqj
dir qrnpjz
$ cd hstph
$ ls
172788 pjts.qmt
$ cd ..
$ cd qrnpjz
$ ls
dir blzc
dir rvl
dir zvhtzqqc
$ cd blzc
$ ls
108342 nhm.zhz
$ cd ..
$ cd rvl
$ ls
dir bcrf
dir sjbr
$ cd bcrf
$ ls
182498 cpqhb.jsf
dir dcb
14228 ggsq
dir gnhvtgm
$ cd dcb
$ ls
dir zlgjzcjv
$ cd zlgjzcjv
$ ls
18316 cpqhb.jsf
$ cd ..
$ cd ..
$ cd gnhvtgm
$ ls
110236 nhm.zhz
$ cd ..
$ cd ..
$ cd sjbr
$ ls
133009 cscbp
315907 vtpmnwt
$ cd ..
$ cd ..
$ cd zvhtzqqc
$ ls
dir fglfpn
dir gtzrq
dir hfgdcf
274977 ltbzhjn
dir msc
dir ssdlqcrw
$ cd fglfpn
$ ls
39153 dvhjpfc
$ cd ..
$ cd gtzrq
$ ls
60625 sqljdlpz.wpw
$ cd ..
$ cd hfgdcf
$ ls
36016 qdvnn.pbt
$ cd ..
$ cd msc
$ ls
56601 cpqhb.jsf
dir hrz
dir vlhllqz
$ cd hrz
$ ls
241511 fhngt.mlb
286505 nhm.zhz
$ cd ..
$ cd vlhllqz
$ ls
157880 nhm.zhz
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
121507 dssrvr
295897 lvtwlb.whn
12047 pjts.gqc
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mqjjbq
$ ls
157818 blbmb.fcv
119103 ccppbmqb.pbt
141463 cpqhb.jsf
197900 drhmws.fdd
dir fmvp
dir rhldnjlt
175029 vqfsh.smp
$ cd fmvp
$ ls
dir dhnn
dir dlcvwqw
131432 hnv.tlr
dir jzqt
98127 nhm.zhz
dir nvsdbjj
dir pjts
9179 pvczm.cfw
121310 vqfsh.smp
$ cd dhnn
$ ls
173921 qcjsdg.zfg
58654 vhvn.csb
$ cd ..
$ cd dlcvwqw
$ ls
285116 zjb
$ cd ..
$ cd jzqt
$ ls
104478 clmzwnf
299622 cpqhb.jsf
301236 jjdgzwnq
dir nsvlqq
136737 vhvn
dir vmp
12932 wrd.jsz
$ cd nsvlqq
$ ls
111712 dtbzzl.htn
213593 hvzlmtj.ztr
$ cd ..
$ cd vmp
$ ls
104275 jjdgzwnq
$ cd ..
$ cd ..
$ cd nvsdbjj
$ ls
180999 jjdgzwnq
219819 vhvn
$ cd ..
$ cd pjts
$ ls
111715 npzn
$ cd ..
$ cd ..
$ cd rhldnjlt
$ ls
dir ffhcbvmf
dir vprlq
$ cd ffhcbvmf
$ ls
247668 cpqhb.jsf
$ cd ..
$ cd vprlq
$ ls
168090 jmmtz.fzt
68360 nhm.zhz
304580 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd nhblb
$ ls
154794 hrgsrbnj.tch
dir nfwl
dir ptc
dir rng
50110 swtt.tct
dir vhvn
dir vlj
$ cd nfwl
$ ls
dir lqs
dir mlvnlz
$ cd lqs
$ ls
dir mbcft
dir ntmvt
dir nztw
$ cd mbcft
$ ls
78188 bdnr
194668 pjts
$ cd ..
$ cd ntmvt
$ ls
75647 nhm.zhz
186651 scsvrqpf.jhb
$ cd ..
$ cd nztw
$ ls
164920 vqfsh.smp
$ cd ..
$ cd ..
$ cd mlvnlz
$ ls
289891 wjf
$ cd ..
$ cd ..
$ cd ptc
$ ls
190002 pjts.vmh
$ cd ..
$ cd rng
$ ls
39093 nhm.zhz
$ cd ..
$ cd vhvn
$ ls
275854 hbv
$ cd ..
$ cd vlj
$ ls
dir qqqrm
203390 ssdlqcrw
$ cd qqqrm
$ ls
dir wcpllh
$ cd wcpllh
$ ls
dir pwg
$ cd pwg
$ ls
19102 dtbzzl.qvp
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
181610 vqfsh.smp
$ cd ..
$ cd ttvgr
$ ls
dir vpcpd
$ cd vpcpd
$ ls
28102 mbb.szv
304017 rshrzjhn
$ cd ..
$ cd ..
$ cd vdmm
$ ls
95079 tssjcd.lfg
$ cd ..
$ cd wnhnwjm
$ ls
67931 mmhcgsc.zjf
22062 nqpzsf.ccc
219285 trr.vcn
$ cd ..
$ cd zdvbsb
$ ls
293736 dtbzzl.ftj
$ cd ..
$ cd ..
$ cd ptzsl
$ ls
26404 jnsdzmbd
$ cd ..
$ cd wmqc
$ ls
dir dtbzzl
dir hdzmzc
dir nmmpwqvz
dir qjnm
$ cd dtbzzl
$ ls
dir hpzgnb
$ cd hpzgnb
$ ls
189696 sbmdrbm
$ cd ..
$ cd ..
$ cd hdzmzc
$ ls
143510 dtbzzl.dmp
$ cd ..
$ cd nmmpwqvz
$ ls
276725 nhm.zhz
$ cd ..
$ cd qjnm
$ ls
202264 cpqhb.jsf

112
src/bin/day_7.rs Normal file
View file

@ -0,0 +1,112 @@
use std::collections::HashMap;
use aoc_2022::prelude::*;
enum Entry {
Directory(String),
File(usize, String),
}
type Input = HashMap<String, Vec<Entry>>;
fn parse(s: &str) -> Result<Input> {
let mut lines = s.lines().peekable();
let mut current_dir = "/".to_owned();
let mut dirs = HashMap::<String, Vec<Entry>>::new();
while let Some(line) = lines.next() {
if line.starts_with("$ ") {
let tokens = line.split_ascii_whitespace().collect::<Vec<_>>();
match &tokens[1..] {
["ls"] => {
let mut entries = vec![];
while matches!(lines.peek(), Some(line) if !line.starts_with('$')) {
if let Some(line) = lines.next() {
let (size, name) = line.split_once(' ').unwrap();
let entry = match size {
"dir" => Entry::Directory(name.to_owned()),
size => Entry::File(size.parse().unwrap(), name.to_owned()),
};
entries.push(entry);
} else {
break;
}
}
dirs.insert(current_dir.clone(), entries);
}
["cd", dir] => {
// parse cd
match dir {
&".." => {
current_dir = current_dir[..current_dir.rfind('/').unwrap()].to_owned();
}
dir => {
if dir.starts_with('/') {
current_dir = dir.to_string();
} else {
current_dir = format!("{current_dir}/{dir}");
}
}
}
}
_ => panic!("invalid input"),
}
} else {
panic!("invalid command input: {line}");
}
}
Ok(dirs)
}
fn dir_size(dirs: &HashMap<String, Vec<Entry>>, start_name: &str) -> usize {
let dir = dirs.get(start_name).unwrap();
let mut total_size = 0;
for entry in dir {
match entry {
Entry::File(size, _) => {
total_size += size;
}
Entry::Directory(name) => {
total_size += dir_size(dirs, &format!("{start_name}/{name}"));
}
}
}
total_size
}
#[aoc(day = 7, parse = parse, test_cases = ["day_7.txt"])]
fn day_7(input: Input) -> Result<()> {
// Part 1
let mut total_size = 0;
let dir_names = input.keys().map(|k| k.clone()).collect::<Vec<_>>();
for dir in &dir_names {
let size = dir_size(&input, dir);
if size <= 100000 {
total_size += size;
}
}
println!("Part one: {total_size}");
// Part 2
let space_available = 70000000 - dir_size(&input, "/");
let required_space = 30000000 - space_available;
println!("we need {required_space}");
let mut min_space = 70000000;
for dir in &dir_names {
let size = dir_size(&input, dir);
if size > required_space {
println!("{size}");
}
if size > required_space && size < min_space {
min_space = size;
}
}
println!("Part two: {min_space}");
Ok(())
}

23
test_cases/day_7.txt Normal file
View file

@ -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