|
@@ -16,8 +16,8 @@ type item struct {
|
|
type dir struct {
|
|
type dir struct {
|
|
name string
|
|
name string
|
|
parent *dir
|
|
parent *dir
|
|
- dirs []dir
|
|
|
|
- files []item
|
|
|
|
|
|
+ dirs []*dir
|
|
|
|
+ files []*item
|
|
}
|
|
}
|
|
|
|
|
|
func cd(line string, current *dir, dirsRead map[string]*dir, root *dir) *dir {
|
|
func cd(line string, current *dir, dirsRead map[string]*dir, root *dir) *dir {
|
|
@@ -36,7 +36,7 @@ func cd(line string, current *dir, dirsRead map[string]*dir, root *dir) *dir {
|
|
current, _ = dirsRead[name]
|
|
current, _ = dirsRead[name]
|
|
if current == nil {
|
|
if current == nil {
|
|
newDir := dir{name: name, parent: parent}
|
|
newDir := dir{name: name, parent: parent}
|
|
- parent.dirs = append(parent.dirs, newDir)
|
|
|
|
|
|
+ parent.dirs = append(parent.dirs, &newDir)
|
|
current = &newDir
|
|
current = &newDir
|
|
dirsRead[name] = current
|
|
dirsRead[name] = current
|
|
}
|
|
}
|
|
@@ -76,7 +76,7 @@ func readInput(file *os.File) dir {
|
|
log.Fatal("Can't parse cd:", err)
|
|
log.Fatal("Can't parse cd:", err)
|
|
}
|
|
}
|
|
|
|
|
|
- current.files = append(current.files, newFile)
|
|
|
|
|
|
+ current.files = append(current.files, &newFile)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -85,6 +85,35 @@ func readInput(file *os.File) dir {
|
|
return root
|
|
return root
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func getSizes(root dir, sizes []int) (int, []int) {
|
|
|
|
+ size := 0
|
|
|
|
+ for i := range root.files {
|
|
|
|
+ size += root.files[i].size
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for i := range root.dirs {
|
|
|
|
+ var c int
|
|
|
|
+ c, sizes = getSizes(*root.dirs[i], sizes)
|
|
|
|
+ size += c
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ sizes = append(sizes, size)
|
|
|
|
+ return size, sizes
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func part1(root dir) int {
|
|
|
|
+ _, sizes := getSizes(root, []int{})
|
|
|
|
+
|
|
|
|
+ sum := 0
|
|
|
|
+ for i := range sizes {
|
|
|
|
+ if sizes[i] < 100000 {
|
|
|
|
+ sum += sizes[i]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return sum
|
|
|
|
+}
|
|
|
|
+
|
|
func main() {
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
if len(os.Args) < 2 {
|
|
log.Fatal("You need to specify a file!")
|
|
log.Fatal("You need to specify a file!")
|
|
@@ -98,5 +127,5 @@ func main() {
|
|
}
|
|
}
|
|
|
|
|
|
root := readInput(file)
|
|
root := readInput(file)
|
|
- fmt.Println(root)
|
|
|
|
|
|
+ fmt.Println("Part1:", part1(root))
|
|
}
|
|
}
|