IISEBR52NLKVBJJEBSYWXI4LG2Y3E5GPNZJ66CA26K6IBXP3DOHQC
$ cd /
$ ls
dir dpbwg
dir dvwfscw
dir hccpl
dir jsgbg
dir lhjmzsl
63532 mwvbpw.mmg
239480 npj
dir pngs
dir qhs
303649 shvgmwn.vhv
236905 sjrrgd.phh
dir sntcp
dir sqs
$ cd dpbwg
$ ls
dir dgh
100731 dpbwg
dir rpwnv
$ cd dgh
$ ls
197049 lhjmzsl.hzj
$ cd ..
$ cd rpwnv
$ ls
10702 qsgv.fmf
$ cd ..
$ cd ..
$ cd dvwfscw
$ ls
dir bvg
dir fbfjs
115450 gjftb.mgd
dir gsmnprgz
dir hdwdcvv
dir mhjtrlqz
75437 qsctddrw
171722 qsgv.zqz
$ cd bvg
$ ls
56335 cgtzb.szt
139481 shvgmwn.vhv
255200 wzqlgr.mhl
$ cd ..
$ cd fbfjs
$ ls
252977 hmcj
256083 mbgfn.pmh
dir qsgv
$ cd qsgv
$ ls
271506 dchsdfz.bbg
202650 hmcj
32623 lqgmfcp
57614 mgp.fbn
220895 qwzqrrq.wjf
$ cd ..
$ cd ..
$ cd gsmnprgz
$ ls
dir dzcsldzw
dir hrjmfd
dir lcwv
dir sdp
62355 zrncdmd.lmj
$ cd dzcsldzw
$ ls
dir hmcj
$ cd hmcj
$ ls
151947 hgtzldbg
$ cd ..
$ cd ..
$ cd hrjmfd
$ ls
dir drjlhbqf
65599 npj
$ cd drjlhbqf
$ ls
263623 hzfmzs.mlj
13866 npj
173713 wtnf.qps
$ cd ..
$ cd ..
$ cd lcwv
$ ls
44150 hmcj.lds
200694 mpbb
$ cd ..
$ cd sdp
$ ls
dir gcwjj
dir qzdczvwn
$ cd gcwjj
$ ls
149603 qsgv.srr
$ cd ..
$ cd qzdczvwn
$ ls
dir gnvbm
291187 hmcj.rgm
dir msdt
dir mwvbpw
dir shpr
$ cd gnvbm
$ ls
259516 dpbwg
120868 mpbb
dir vqrcd
$ cd vqrcd
$ ls
306804 fqqg
34290 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd msdt
$ ls
168438 mpbb
67435 nbqcrdjs
$ cd ..
$ cd mwvbpw
$ ls
dir btzqzvbl
308719 npj
$ cd btzqzvbl
$ ls
177311 bdnrf.jtw
122356 qwhmd.vcd
169153 vzzzccg.hlb
$ cd ..
$ cd ..
$ cd shpr
$ ls
290591 nblzc.nmp
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd hdwdcvv
$ ls
96864 hmcj.tjn
$ cd ..
$ cd mhjtrlqz
$ ls
dir bzrbsfjp
238772 fpggqqj
dir hqzgs
20155 shvgmwn.vhv
$ cd bzrbsfjp
$ ls
313691 fnscbhfc
17630 llwfdzgg.bsp
dir lthr
$ cd lthr
$ ls
237053 bhbbzt.bmt
$ cd ..
$ cd ..
$ cd hqzgs
$ ls
295258 gllsgr.nnz
70743 ptpqd
dir rnmsdpmj
205022 rpqh.rpn
158287 tsm.tdq
154025 wmfwr.bcm
$ cd rnmsdpmj
$ ls
218043 dpbwg.mls
149072 mbgfn.pmh
89388 mwvbpw.qfm
57207 rszcvm.mqc
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd hccpl
$ ls
dir blqdjh
dir hfqw
dir qsgv
$ cd blqdjh
$ ls
dir fbpg
$ cd fbpg
$ ls
231357 dpbwg
$ cd ..
$ cd ..
$ cd hfqw
$ ls
210898 fjblghm.gtg
286252 hmcj.dgz
258768 mpbb
225743 qsgv.pqf
191717 shvgmwn.vhv
$ cd ..
$ cd qsgv
$ ls
dir bslqpr
dir dpbwg
dir lhjmzsl
210707 npj
64435 qhpnrbhq
dir rpj
301426 shvgmwn.vhv
dir stbgbrw
dir vhzmg
$ cd bslqpr
$ ls
4365 dpbwg
dir fpj
dir lhjmzsl
dir lncmt
dir mwvbpw
35725 ncbjtpcb.svf
dir njhsmb
dir rjzsddlw
41533 shvgmwn.vhv
$ cd fpj
$ ls
88146 dpbwg
$ cd ..
$ cd lhjmzsl
$ ls
57400 fzngdsh.sbn
198711 mnqz.npt
$ cd ..
$ cd lncmt
$ ls
192228 qsgv.jss
$ cd ..
$ cd mwvbpw
$ ls
65217 hmcj.drs
$ cd ..
$ cd njhsmb
$ ls
157177 dpbwg.wsl
10919 jhfs
$ cd ..
$ cd rjzsddlw
$ ls
dir cftp
dir flcfwml
dir vpdbl
$ cd cftp
$ ls
89075 dpbwg
57259 mbgfn.pmh
237771 zwglrhh
$ cd ..
$ cd flcfwml
$ ls
51498 pbbgmqn.gfg
$ cd ..
$ cd vpdbl
$ ls
98690 npj
$ cd ..
$ cd ..
$ cd ..
$ cd dpbwg
$ ls
dir wlmdbjh
$ cd wlmdbjh
$ ls
dir pmldd
245468 rdgldw.tzb
$ cd pmldd
$ ls
145032 mwvbpw.tpc
$ cd ..
$ cd ..
$ cd ..
$ cd lhjmzsl
$ ls
233642 dpbwg.tbq
dir frsggjl
dir hmcj
dir jmhzlq
dir jvdtpzd
251765 npj
169647 shvgmwn.vhv
$ cd frsggjl
$ ls
dir dshv
dir fqvpc
dir lhjmzsl
313045 npj
dir rngqmwgr
$ cd dshv
$ ls
dir pptfqn
85609 wpgz
dir zfmqls
$ cd pptfqn
$ ls
258817 mtctcdgd.nmb
39899 npj
$ cd ..
$ cd zfmqls
$ ls
119006 hlw.mzg
295107 wstvdqn.wgw
$ cd ..
$ cd ..
$ cd fqvpc
$ ls
dir pqpf
$ cd pqpf
$ ls
312566 mpbb
$ cd ..
$ cd ..
$ cd lhjmzsl
$ ls
157261 dpbwg.bgc
76700 mpbb
$ cd ..
$ cd rngqmwgr
$ ls
42626 dpbwg.dtt
78765 gjsnmzn.fzb
$ cd ..
$ cd ..
$ cd hmcj
$ ls
166183 jntzn
dir qsgv
254851 rbcgrdr.vqp
$ cd qsgv
$ ls
256449 dhj.mrm
49207 fbrhl
69922 lhjmzsl
121778 tpdvnb
$ cd ..
$ cd ..
$ cd jmhzlq
$ ls
dir bbpqsf
245813 ftw.jwq
$ cd bbpqsf
$ ls
169373 mwvbpw.tjt
$ cd ..
$ cd ..
$ cd jvdtpzd
$ ls
dir brfln
dir dpbwg
263586 fsqzfhj.bzh
85956 lhjmzsl
dir mwvbpw
dir tcgwhp
91473 vjgt.twz
200413 zlnnrrpn.qqd
$ cd brfln
$ ls
65066 fpvnm
$ cd ..
$ cd dpbwg
$ ls
dir jtqwgc
dir lrdjdqn
281885 mpbb
$ cd jtqwgc
$ ls
219022 spbqn
$ cd ..
$ cd lrdjdqn
$ ls
116830 hmcj.ptr
dir mwvbpw
$ cd mwvbpw
$ ls
251737 ccqlb
$ cd ..
$ cd ..
$ cd ..
$ cd mwvbpw
$ ls
226329 fztjpfb
$ cd ..
$ cd tcgwhp
$ ls
dir grmsl
$ cd grmsl
$ ls
dir hmcj
197995 wzqlr.fqj
$ cd hmcj
$ ls
239775 mbgfn.pmh
dir rrvccjp
95381 shvgmwn.vhv
$ cd rrvccjp
$ ls
dir qsgv
$ cd qsgv
$ ls
192956 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd rpj
$ ls
dir bwc
dir ctjwjlzc
dir dpbwg
dir lhjmzsl
249767 npj
dir wqmlz
$ cd bwc
$ ls
56181 hmcj.dhd
105111 hvw
63869 rqw.srq
8030 shvgmwn.vhv
dir stff
$ cd stff
$ ls
dir gsjsc
$ cd gsjsc
$ ls
514 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd ..
$ cd ctjwjlzc
$ ls
39823 qjgnjm.hzn
$ cd ..
$ cd dpbwg
$ ls
dir lhqrjr
$ cd lhqrjr
$ ls
179949 tmvl.zqf
$ cd ..
$ cd ..
$ cd lhjmzsl
$ ls
305735 shvgmwn.vhv
$ cd ..
$ cd wqmlz
$ ls
141757 fstftggh
$ cd ..
$ cd ..
$ cd stbgbrw
$ ls
196003 dpbwg.shs
dir gbr
104091 hmcj
232145 lhjmzsl.nnc
dir lhv
dir qqqbtpq
51208 qsgv.dbm
235090 vbpzgnr
dir vqmnsdrt
$ cd gbr
$ ls
101809 npj
121922 pcqrmmlt.ghh
125915 ptffhc
128293 wdz.nsd
$ cd ..
$ cd lhv
$ ls
75506 qtwlnvv.nbm
28413 rbwbp
$ cd ..
$ cd qqqbtpq
$ ls
96300 gdf
$ cd ..
$ cd vqmnsdrt
$ ls
146229 mwvbpw.qrc
189540 plldv.vtv
dir rtng
$ cd rtng
$ ls
42730 hrbs.zpc
$ cd ..
$ cd ..
$ cd ..
$ cd vhzmg
$ ls
dir dcmjvhtt
dir dpbwg
$ cd dcmjvhtt
$ ls
85508 hhlctr.bbs
296657 lhjmzsl.zjt
255803 mbgfn.pmh
170803 mtctcdgd.nmb
$ cd ..
$ cd dpbwg
$ ls
156142 hmcj
dir lhjmzsl
$ cd lhjmzsl
$ ls
13590 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd jsgbg
$ ls
202682 hmcj.tbl
$ cd ..
$ cd lhjmzsl
$ ls
197308 lhjmzsl
$ cd ..
$ cd pngs
$ ls
115979 hfpzqf.hjw
dir lhjmzsl
125414 mpbb
dir mwbffchr
$ cd lhjmzsl
$ ls
55108 hwhsjr
$ cd ..
$ cd mwbffchr
$ ls
249138 czv.lgd
$ cd ..
$ cd ..
$ cd qhs
$ ls
108106 ccmhjzp.ppf
197911 shvgmwn.vhv
$ cd ..
$ cd sntcp
$ ls
dir cvgtwsbw
dir dpbwg
dir dqbzfcq
dir gfvtsjmz
dir ljsmjsp
dir mwvbpw
dir phfqzwp
dir rpsnfndl
dir rrqwcbqm
dir rtv
dir vnvft
dir vqcvbncp
dir vsgjds
$ cd cvgtwsbw
$ ls
dir bprbr
dir bpw
dir dpbwg
dir jvjs
dir mwvbpw
dir nbfzn
dir pcr
dir rhgltw
$ cd bprbr
$ ls
126107 dpbwg.jqq
140931 ljhc.gsm
120326 pnjv
dir wbrb
$ cd wbrb
$ ls
28887 ccr.rvd
dir gwfpgws
77898 mwvbpw.qrc
280487 pbfbtb.qjp
$ cd gwfpgws
$ ls
205904 dgm
313203 vpgzr.jfw
$ cd ..
$ cd ..
$ cd ..
$ cd bpw
$ ls
dir lgstpgrn
173334 npj
$ cd lgstpgrn
$ ls
dir rngr
$ cd rngr
$ ls
291856 czjz.fzp
246123 mpbb
200301 qqfvpnz
$ cd ..
$ cd ..
$ cd ..
$ cd dpbwg
$ ls
265739 mtctcdgd.nmb
dir mwvbpw
76505 ntjn.mnp
227157 pqznms
312879 qzlmsht
$ cd mwvbpw
$ ls
144523 dpbwg.lgr
39441 mmtrnzqw.mnv
285772 mpbb
306936 rpmgcmqd.qht
$ cd ..
$ cd ..
$ cd jvjs
$ ls
51134 lsnvhd.gsj
$ cd ..
$ cd mwvbpw
$ ls
125428 hmcj.bvd
40162 npj
117658 pmzfj.crj
$ cd ..
$ cd nbfzn
$ ls
11429 mwvbpw.swl
5582 qsgv.jrm
$ cd ..
$ cd pcr
$ ls
dir dpbwg
95858 mtctcdgd.nmb
$ cd dpbwg
$ ls
dir wmsb
$ cd wmsb
$ ls
154498 npj
$ cd ..
$ cd ..
$ cd ..
$ cd rhgltw
$ ls
188447 qsgv.rzs
$ cd ..
$ cd ..
$ cd dpbwg
$ ls
261326 cjfszwr
88528 glp.fgc
dir lhjmzsl
270470 shvgmwn.vhv
310081 vdhmgb
dir wsc
$ cd lhjmzsl
$ ls
245410 dnnfljbs
$ cd ..
$ cd wsc
$ ls
dir lhjmzsl
311302 mbs.tqc
309985 mpbb
dir qgpqzr
20812 vhcc.wpw
$ cd lhjmzsl
$ ls
dir dpbwg
$ cd dpbwg
$ ls
273340 fmvbcphl.crp
$ cd ..
$ cd ..
$ cd qgpqzr
$ ls
dir fdwgdhrf
$ cd fdwgdhrf
$ ls
275421 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd dqbzfcq
$ ls
30930 njnz
$ cd ..
$ cd gfvtsjmz
$ ls
290134 mbgfn.pmh
154689 vql
$ cd ..
$ cd ljsmjsp
$ ls
59894 hwggw.rpd
26336 mbgfn.pmh
dir mvzchpq
dir mwvbpw
122061 zlcr.jsw
$ cd mvzchpq
$ ls
294618 lhjmzsl.bqm
dir mwvbpw
204294 nljhbh.cfc
79337 ntvt.dbw
$ cd mwvbpw
$ ls
dir njwcqcjh
309971 nqdv.vmp
$ cd njwcqcjh
$ ls
155159 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd ..
$ cd mwvbpw
$ ls
43451 lhjmzsl.vjt
$ cd ..
$ cd ..
$ cd mwvbpw
$ ls
3144 phvjzs.prf
$ cd ..
$ cd phfqzwp
$ ls
dir hmcj
dir hnnrw
196279 lhjmzsl
90948 mwvbpw.hvm
275082 shvgmwn.vhv
$ cd hmcj
$ ls
4346 mtctcdgd.nmb
$ cd ..
$ cd hnnrw
$ ls
dir lhjmzsl
103070 qsbrf.tpv
dir rdf
$ cd lhjmzsl
$ ls
158692 dpbwg.bvl
$ cd ..
$ cd rdf
$ ls
dir gpj
dir lbgpm
$ cd gpj
$ ls
136508 shvgmwn.vhv
$ cd ..
$ cd lbgpm
$ ls
154457 ccpvr
232065 lhjmzsl
43787 npj
189920 rpgmvv
96362 tlmvpc
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd rpsnfndl
$ ls
dir pcbtmcwf
$ cd pcbtmcwf
$ ls
dir qsgv
$ cd qsgv
$ ls
45662 npj
$ cd ..
$ cd ..
$ cd ..
$ cd rrqwcbqm
$ ls
dir vjm
$ cd vjm
$ ls
263137 npj
$ cd ..
$ cd ..
$ cd rtv
$ ls
dir lhjmzsl
dir pcwsn
dir qsgv
dir vvzbsg
$ cd lhjmzsl
$ ls
dir qzsjhsfn
$ cd qzsjhsfn
$ ls
26909 mbgfn.pmh
$ cd ..
$ cd ..
$ cd pcwsn
$ ls
160033 ftz.nbg
145165 wgdjsgsb.hhm
$ cd ..
$ cd qsgv
$ ls
dir jqm
136209 mbgfn.pmh
79664 mghdlnh.chv
$ cd jqm
$ ls
222831 npj
$ cd ..
$ cd ..
$ cd vvzbsg
$ ls
84246 dpbwg.tsq
$ cd ..
$ cd ..
$ cd vnvft
$ ls
dir crqrl
dir scdvzsd
$ cd crqrl
$ ls
13185 dpbwg.twz
109021 qcdqnhg.jjj
$ cd ..
$ cd scdvzsd
$ ls
dir hmcj
$ cd hmcj
$ ls
252155 npj
$ cd ..
$ cd ..
$ cd ..
$ cd vqcvbncp
$ ls
72128 crnhb
dir ddz
dir dvhzvdn
dir ffsbcmg
dir gfs
dir jghlb
dir llq
dir pvn
dir rvqmmjgr
$ cd ddz
$ ls
232302 gdfqpnj.nhf
274940 lhjmzsl.mzv
286217 mpbb
$ cd ..
$ cd dvhzvdn
$ ls
273183 cfnqn.qpz
$ cd ..
$ cd ffsbcmg
$ ls
6544 mtctcdgd.nmb
52511 wndzt.lqb
$ cd ..
$ cd gfs
$ ls
228312 mwvbpw.tdj
dir rqjrfzgt
62100 shc.rtj
313984 szsplzq.dpd
dir tqtnp
$ cd rqjrfzgt
$ ls
296460 bvp
272324 mbgfn.pmh
221044 npj
110232 qvcszzv
$ cd ..
$ cd tqtnp
$ ls
98376 tzwh
212247 wzjj.scp
$ cd ..
$ cd ..
$ cd jghlb
$ ls
dir ddrmsv
$ cd ddrmsv
$ ls
252143 mbgfn.pmh
$ cd ..
$ cd ..
$ cd llq
$ ls
dir lhjmzsl
67341 mbgfn.pmh
155159 npj
dir qsgv
dir vcvnzc
$ cd lhjmzsl
$ ls
151930 ssldrsf.mzm
$ cd ..
$ cd qsgv
$ ls
233702 ztdmtqb.mhf
$ cd ..
$ cd vcvnzc
$ ls
168179 lhjmzsl.cwf
$ cd ..
$ cd ..
$ cd pvn
$ ls
240160 lbd.slf
$ cd ..
$ cd rvqmmjgr
$ ls
24809 gwgcrzp.zhj
dir hmcj
dir lhjmzsl
dir mwvbpw
121997 nbmf
77886 ntp
dir qcqrgdm
$ cd hmcj
$ ls
126073 dpbwg.lhh
dir jchccghv
dir lhjmzsl
144075 qsgv.lbw
288076 swrngbsq.qzw
$ cd jchccghv
$ ls
310277 mpbb
$ cd ..
$ cd lhjmzsl
$ ls
193576 bwsz.crv
16002 mbgfn.pmh
57961 mtctcdgd.nmb
$ cd ..
$ cd ..
$ cd lhjmzsl
$ ls
dir bsfwmcz
dir dpbwg
121640 mwvbpw
dir pmrfvzw
dir qsgv
$ cd bsfwmcz
$ ls
dir fjqqblz
51952 gqbj.fwd
dir hmcj
dir lctt
81316 lhjmzsl.qqr
6372 mbgfn.pmh
22669 shvgmwn.vhv
130990 zgq.fpv
$ cd fjqqblz
$ ls
26064 zrqrnb.nwf
$ cd ..
$ cd hmcj
$ ls
14385 mwvbpw.vzq
$ cd ..
$ cd lctt
$ ls
137397 fbgbs.fjf
dir jgbzqzq
dir qrr
272639 qsgv.vwm
$ cd jgbzqzq
$ ls
135320 mpbb
$ cd ..
$ cd qrr
$ ls
dir dpbwg
dir mwvbpw
54143 pnsl.bbm
dir wbpzpg
$ cd dpbwg
$ ls
250653 shvgmwn.vhv
$ cd ..
$ cd mwvbpw
$ ls
2682 fhdh.hmt
$ cd ..
$ cd wbpzpg
$ ls
dir bqshqpvm
141398 mtctcdgd.nmb
130729 vtnfmjqm.mgp
$ cd bqshqpvm
$ ls
252449 shvgmwn.vhv
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd dpbwg
$ ls
82216 gwjwmcbf.gwl
$ cd ..
$ cd pmrfvzw
$ ls
dir mwvbpw
dir wtzgjspz
dir zmb
$ cd mwvbpw
$ ls
16736 wbzjzz.mqq
$ cd ..
$ cd wtzgjspz
$ ls
dir vjb
$ cd vjb
$ ls
301763 drchphtm
$ cd ..
$ cd ..
$ cd zmb
$ ls
201978 mdj
dir qgnffw
147889 qzbmwpnm.gjp
$ cd qgnffw
$ ls
17740 cwz.dhs
222345 mbgfn.pmh
81554 npj
206597 tsnlnzh
$ cd ..
$ cd ..
$ cd ..
$ cd qsgv
$ ls
dir mmsnzr
$ cd mmsnzr
$ ls
160502 tgrztm
$ cd ..
$ cd ..
$ cd ..
$ cd mwvbpw
$ ls
40049 qmmdv
313418 qsgv.srp
$ cd ..
$ cd qcqrgdm
$ ls
202848 wtl.qbj
$ cd ..
$ cd ..
$ cd ..
$ cd vsgjds
$ ls
138690 npj
22984 tpfbnz.sgj
$ cd ..
$ cd ..
$ cd sqs
$ ls
dir zms
$ cd zms
$ ls
152096 cvtqph.wwp
dir mmwzg
$ cd mmwzg
$ ls
100870 qsgv
const std = @import("std");
const PATH = "input/day07.txt";
const Str = []const u8;
const MAX_DIR_SIZE = 100_000;
const TOTAL = 70_000_000;
const NEED = 30_000_000;
pub fn first(allocator: std.mem.Allocator) !usize {
var arena = std.heap.ArenaAllocator.init(allocator);
defer arena.deinit();
var root = try parseInput(arena.allocator(), @embedFile(PATH));
var sizes = std.ArrayList(usize).init(arena.allocator());
defer sizes.deinit();
_ = try root.size(&sizes);
var sum: usize = 0;
for (sizes.items) |s| {
if (s <= MAX_DIR_SIZE) sum += s;
}
return sum;
}
pub fn second(allocator: std.mem.Allocator) !usize {
var arena = std.heap.ArenaAllocator.init(allocator);
defer arena.deinit();
var root = try parseInput(arena.allocator(), @embedFile(PATH));
var sizes = std.ArrayList(usize).init(arena.allocator());
defer sizes.deinit();
_ = try root.size(&sizes);
const diff = NEED - (TOTAL - sizes.items[sizes.items.len - 1]);
std.sort.sort(usize, sizes.items, {}, std.sort.asc(usize));
for (sizes.items) |s| {
if (s > diff) {
return s;
}
}
unreachable;
}
test "day07a" {
try std.testing.expectEqual(@as(usize, 1350966), try first(std.testing.allocator));
}
test "day07b" {
try std.testing.expectEqual(@as(usize, 6296435), try second(std.testing.allocator));
}
const Dir = struct {
parent: ?*Dir = null,
files: ?std.ArrayList(File) = null,
subdirs: ?std.ArrayList(Dir) = null,
fn size(self: @This(), ret: *std.ArrayList(usize)) !usize {
var sum: usize = 0;
if (self.files != null) {
for (self.files.?.items) |file| {
sum += file.size;
}
}
if (self.subdirs != null) {
for (self.subdirs.?.items) |dir| {
sum += try dir.size(ret);
}
}
try ret.append(sum);
return sum;
}
};
const File = struct {
size: usize,
name: Str,
};
fn parseInput(allocator: std.mem.Allocator, in: Str) !*Dir {
var curr = try allocator.create(Dir);
curr.* = Dir{};
var lines = std.mem.tokenize(u8, in, "\n");
while (lines.next()) |line| {
// std.debug.print("{s}\n", .{line});
switch (line[0]) {
'$' => {
switch (line[2]) {
'c' => {
// $ cd
var words = std.mem.tokenize(u8, line, " ");
_ = words.next(); // $
_ = words.next(); // cd
const dest = words.next().?;
switch (dest[0]) {
'/' => {
while (curr.parent) |p| {
curr = p;
}
},
'.' => {
curr = curr.parent.?;
},
else => {
if (curr.subdirs == null) {
curr.subdirs = std.ArrayList(Dir).init(allocator);
}
try curr.subdirs.?.append(.{ .parent = curr });
curr = &curr.subdirs.?.items[curr.subdirs.?.items.len - 1];
},
}
},
'l' => {}, // ls
else => {
unreachable;
},
}
},
'd' => {},
'0'...'9' => {
var words = std.mem.tokenize(u8, line, " ");
const size = try std.fmt.parseUnsigned(usize, words.next().?, 10);
const name = words.next().?;
const f: File = .{ .size = size, .name = name };
if (curr.files == null) {
curr.files = std.ArrayList(File).init(allocator);
}
try curr.files.?.append(f);
},
else => unreachable,
}
}
// rewind to root
while (curr.parent) |p| {
curr = p;
}
return curr;
}
const test_input =
\\$ 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
;