2022 Day 7
This commit is contained in:
parent
9d11afb01d
commit
c90fee8cc2
1 changed files with 93 additions and 0 deletions
93
2022/day7.swift
Normal file
93
2022/day7.swift
Normal file
|
@ -0,0 +1,93 @@
|
|||
import Foundation
|
||||
|
||||
class Directory {
|
||||
var parent: Directory? = nil
|
||||
var children: [String: Directory] = [:]
|
||||
var size: Int = 0
|
||||
|
||||
init(parent: Directory? = nil) {
|
||||
self.parent = parent
|
||||
}
|
||||
|
||||
func child(_ name: String) -> Directory {
|
||||
if let child = children[name] {
|
||||
return child
|
||||
}
|
||||
|
||||
let new = Directory(parent: self)
|
||||
children[name] = new
|
||||
return new
|
||||
}
|
||||
|
||||
func totalSize() -> Int {
|
||||
return size + children.values.reduce(0) { $0 + $1.totalSize() }
|
||||
}
|
||||
|
||||
func all(_ callback: (Directory) -> Void) {
|
||||
callback(self)
|
||||
for child in children.values {
|
||||
child.all(callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let input = try String(contentsOf: URL(fileURLWithPath: "day7.input"))
|
||||
let scanner = Scanner(string: input)
|
||||
|
||||
let root = Directory()
|
||||
var current: Directory? = nil
|
||||
|
||||
while !scanner.isAtEnd {
|
||||
guard scanner.scanString("$") != nil else {
|
||||
fatalError("Expected $")
|
||||
}
|
||||
|
||||
if scanner.scanString("cd") != nil, let dir = scanner.scanUpToString("\n") {
|
||||
switch dir {
|
||||
case "/":
|
||||
current = root
|
||||
|
||||
case "..":
|
||||
current = current!.parent
|
||||
|
||||
default:
|
||||
current = current!.child(dir)
|
||||
}
|
||||
} else if scanner.scanString("ls") != nil {
|
||||
while true {
|
||||
if let size = scanner.scanInt() {
|
||||
current!.size += size
|
||||
} else if scanner.scanString("dir") != nil {
|
||||
|
||||
} else {
|
||||
break
|
||||
}
|
||||
_ = scanner.scanUpToString("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var sum = 0
|
||||
root.all {
|
||||
let size = $0.totalSize()
|
||||
if size < 100000 {
|
||||
sum += size
|
||||
}
|
||||
}
|
||||
|
||||
print("Part 1: Sum of size of all directories < 100000:", sum)
|
||||
|
||||
let diskSize = 70000000
|
||||
let freeSpace = diskSize - root.totalSize()
|
||||
let requiredSize = 30000000
|
||||
let toFree = requiredSize - freeSpace
|
||||
|
||||
var smallest = Int.max
|
||||
root.all {
|
||||
let size = $0.totalSize()
|
||||
if size >= toFree && size < smallest {
|
||||
smallest = size
|
||||
}
|
||||
}
|
||||
|
||||
print("Part 2: Smallest folder to delete:", smallest)
|
Loading…
Add table
Reference in a new issue