Improve day 7

This commit is contained in:
2022-12-07 11:24:25 +01:00
committed by Pierre Jeanjean
parent e72d239eaa
commit accef506b5
2 changed files with 41 additions and 28 deletions

View File

@@ -6,40 +6,45 @@ import (
"strings" "strings"
) )
type FileBase interface {
GetSize() int
GetName() string
}
type File struct { type File struct {
name string name string
size int size int
} }
func (file File) GetSize() int { func (file *File) GetSize() int {
return file.size return file.size
} }
func (file File) GetName() string { func (file *File) GetName() string {
return file.name return file.name
} }
type Folder struct { type Folder struct {
name string name string
subfolders []*Folder content []FileBase
files []File
parent *Folder parent *Folder
} }
func (folder Folder) GetSize() int { func (folder *Folder) GetSize() int {
sum := 0 sum := 0
for _, folder := range folder.subfolders { for _, file := range folder.content {
sum += folder.GetSize()
}
for _, file := range folder.files {
sum += file.GetSize() sum += file.GetSize()
} }
return sum return sum
} }
func (folder *Folder) GetName() string {
return folder.name
}
func (folder Folder) GetSubfoldersUnderSize(size int) []*Folder { func (folder Folder) GetSubfoldersUnderSize(size int) []*Folder {
folders := []*Folder{} folders := []*Folder{}
for _, subfolder := range folder.subfolders { for _, subfolder := range folder.GetSubfolders() {
if subfolder.GetSize() <= size { if subfolder.GetSize() <= size {
folders = append(folders, subfolder) folders = append(folders, subfolder)
} }
@@ -50,7 +55,7 @@ func (folder Folder) GetSubfoldersUnderSize(size int) []*Folder {
func (folder Folder) GetSubfoldersOverSize(size int) []*Folder { func (folder Folder) GetSubfoldersOverSize(size int) []*Folder {
folders := []*Folder{} folders := []*Folder{}
for _, subfolder := range folder.subfolders { for _, subfolder := range folder.GetSubfolders() {
if subfolder.GetSize() >= size { if subfolder.GetSize() >= size {
folders = append(folders, subfolder) folders = append(folders, subfolder)
} }
@@ -59,42 +64,50 @@ func (folder Folder) GetSubfoldersOverSize(size int) []*Folder {
return folders return folders
} }
func (folder Folder) GetName() string { func (folder *Folder) GetSubfolders() []*Folder {
return folder.name subfolders := []*Folder{}
for _, file := range folder.content {
if folder, ok := file.(*Folder); ok {
subfolders = append(subfolders, folder)
}
}
return subfolders
} }
func (folder Folder) GetSubfolders() []*Folder { func (folder *Folder) GetFiles() []*File {
return folder.subfolders files := []*File{}
for _, file := range folder.content {
if file, ok := file.(*File); ok {
files = append(files, file)
} }
}
func (folder Folder) GetFilers() []File { return files
return folder.files
} }
func (folder *Folder) GetOrCreateFolder(name string) *Folder { func (folder *Folder) GetOrCreateFolder(name string) *Folder {
for _, subfolder := range folder.subfolders { for _, subfolder := range folder.GetSubfolders() {
if subfolder.GetName() == name { if subfolder.GetName() == name {
return subfolder return subfolder
} }
} }
newFolder := Folder{name, []*Folder{}, []File{}, folder} newFolder := Folder{name, []FileBase{}, folder}
folder.subfolders = append(folder.subfolders, &newFolder) folder.content = append(folder.content, &newFolder)
return &newFolder return &newFolder
} }
func (folder *Folder) GetOrCreateFile(name string, size int) File { func (folder *Folder) GetOrCreateFile(name string, size int) *File {
for _, file := range folder.files { for _, file := range folder.GetFiles() {
if file.GetName() == name { if file.GetName() == name {
return file return file
} }
} }
newFile := File{name, size} newFile := File{name, size}
folder.files = append(folder.files, newFile) folder.content = append(folder.content, &newFile)
return newFile return &newFile
} }
func Parse(scanner bufio.Scanner) Folder { func Parse(scanner bufio.Scanner) Folder {
rootFolder := Folder{"/", []*Folder{}, []File{}, nil} rootFolder := Folder{"/", []FileBase{}, nil}
var currentFolder *Folder var currentFolder *Folder
for scanner.Scan() { for scanner.Scan() {

View File

@@ -10,7 +10,7 @@ import (
func main() { func main() {
rootFolder := common.Parse(*bufio.NewScanner(os.Stdin)) 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 min := math.MaxInt32
for _, folder := range folders { for _, folder := range folders {