diff --git a/day07/common/filesystem.go b/day07/common/filesystem.go index 9189ed8..e61fa44 100644 --- a/day07/common/filesystem.go +++ b/day07/common/filesystem.go @@ -6,40 +6,45 @@ import ( "strings" ) +type FileBase interface { + GetSize() int + GetName() string +} + type File struct { name string size int } -func (file File) GetSize() int { +func (file *File) GetSize() int { return file.size } -func (file File) GetName() string { +func (file *File) GetName() string { return file.name } type Folder struct { name string - subfolders []*Folder - files []File + content []FileBase parent *Folder } -func (folder Folder) GetSize() int { +func (folder *Folder) GetSize() int { sum := 0 - for _, folder := range folder.subfolders { - sum += folder.GetSize() - } - for _, file := range folder.files { + for _, file := range folder.content { sum += file.GetSize() } return sum } +func (folder *Folder) GetName() string { + return folder.name +} + func (folder Folder) GetSubfoldersUnderSize(size int) []*Folder { folders := []*Folder{} - for _, subfolder := range folder.subfolders { + for _, subfolder := range folder.GetSubfolders() { if subfolder.GetSize() <= size { folders = append(folders, subfolder) } @@ -50,7 +55,7 @@ func (folder Folder) GetSubfoldersUnderSize(size int) []*Folder { func (folder Folder) GetSubfoldersOverSize(size int) []*Folder { folders := []*Folder{} - for _, subfolder := range folder.subfolders { + for _, subfolder := range folder.GetSubfolders() { if subfolder.GetSize() >= size { folders = append(folders, subfolder) } @@ -59,42 +64,50 @@ func (folder Folder) GetSubfoldersOverSize(size int) []*Folder { return folders } -func (folder Folder) GetName() string { - return folder.name +func (folder *Folder) GetSubfolders() []*Folder { + subfolders := []*Folder{} + for _, file := range folder.content { + if folder, ok := file.(*Folder); ok { + subfolders = append(subfolders, folder) + } + } + return subfolders } -func (folder Folder) GetSubfolders() []*Folder { - return folder.subfolders -} - -func (folder Folder) GetFilers() []File { - return folder.files +func (folder *Folder) GetFiles() []*File { + files := []*File{} + for _, file := range folder.content { + if file, ok := file.(*File); ok { + files = append(files, file) + } + } + return files } func (folder *Folder) GetOrCreateFolder(name string) *Folder { - for _, subfolder := range folder.subfolders { + for _, subfolder := range folder.GetSubfolders() { if subfolder.GetName() == name { return subfolder } } - newFolder := Folder{name, []*Folder{}, []File{}, folder} - folder.subfolders = append(folder.subfolders, &newFolder) + newFolder := Folder{name, []FileBase{}, folder} + folder.content = append(folder.content, &newFolder) return &newFolder } -func (folder *Folder) GetOrCreateFile(name string, size int) File { - for _, file := range folder.files { +func (folder *Folder) GetOrCreateFile(name string, size int) *File { + for _, file := range folder.GetFiles() { if file.GetName() == name { return file } } newFile := File{name, size} - folder.files = append(folder.files, newFile) - return newFile + folder.content = append(folder.content, &newFile) + return &newFile } func Parse(scanner bufio.Scanner) Folder { - rootFolder := Folder{"/", []*Folder{}, []File{}, nil} + rootFolder := Folder{"/", []FileBase{}, nil} var currentFolder *Folder for scanner.Scan() { diff --git a/day07/ex2/main.go b/day07/ex2/main.go index cc3e057..79df0d9 100644 --- a/day07/ex2/main.go +++ b/day07/ex2/main.go @@ -10,7 +10,7 @@ import ( func main() { rootFolder := common.Parse(*bufio.NewScanner(os.Stdin)) - folders := append(rootFolder.GetSubfoldersOverSize(8381165), &rootFolder) + folders := append(rootFolder.GetSubfoldersOverSize(30000000 - (70000000 - rootFolder.GetSize())), &rootFolder) min := math.MaxInt32 for _, folder := range folders {