6 "adventofcode2022/utils"
12 subdir map[string]*dir
17 func Part1(input string) int {
18 root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
21 find_dirs_part1(&root, 100000, &sum)
25 func Part2(input string) int {
26 root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
28 unused := 70000000 - root.size
29 need := 30000000 - unused
31 find_dirs_part2(&root, need, &dir_size)
35 func find_dirs_part1(d *dir, size int, sum *int) {
36 // recurse into subdir
37 for _, subdir := range d.subdir {
38 if (subdir.size) <= size {
41 find_dirs_part1(subdir, size, sum)
45 func find_dirs_part2(d *dir, size int, sum *int) {
46 // recurse into subdir
47 for _, subdir := range d.subdir {
48 if (subdir.size) >= size && (*sum == 0 || (subdir.size) < *sum) {
51 find_dirs_part2(subdir, size, sum)
55 func (root *dir) parse(input string) {
58 for _, line := range strings.Split(input, "\n") {
59 pieces := strings.Split(line, " ")
61 if pieces[1] == "cd" {
62 if pieces[2] == ".." {
64 } else if pieces[2] == "/" {
67 c = c.addDirectoryIfMissing(pieces[2])
69 } else if pieces[1] == "ls" {
70 // no need to do anything
74 } else if pieces[0] == "dir" {
75 c.addDirectoryIfMissing(pieces[1])
77 c.addFileIfMissing(pieces[1], utils.MustAtoi(pieces[0]))
82 func (d *dir) addDirectoryIfMissing(name string) *dir {
83 t, ok := d.subdir[name]
87 files: map[string]int{},
88 subdir: map[string]*dir{},
96 func (d *dir) addFileIfMissing(name string, size int) {
97 t, ok := d.files[name]
106 for current.name != "/" {
108 current = current.parent