Improve day 7
This commit is contained in:
@@ -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 {
|
||||||
func (folder Folder) GetFilers() []File {
|
files = append(files, file)
|
||||||
return folder.files
|
}
|
||||||
|
}
|
||||||
|
return 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() {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user