From 7aa2025dffa7dcb9d8ac8f3ffb48b16ea1964295 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Wed, 7 Dec 2022 22:07:18 -0500 Subject: [PATCH] day 7 part 1 in rust! --- 07/main.go | 24 ++++++++++++--------- 07/main.rs | 63 ++++++++++++++++-------------------------------------- 2 files changed, 33 insertions(+), 54 deletions(-) diff --git a/07/main.go b/07/main.go index 84c6aee..ec4f5a9 100644 --- a/07/main.go +++ b/07/main.go @@ -36,7 +36,6 @@ func makeScanner(test bool) *bufio.Scanner { type Folder struct { name string - parent *Folder files map[string]int folders map[string]*Folder size int @@ -79,7 +78,6 @@ func partOne() { name := strings.Split(line, " ")[1] stack[len(stack)-1].folders[name] = &Folder{ name: name, - parent: stack[len(stack)-1], files: map[string]int{}, folders: map[string]*Folder{}, } @@ -87,12 +85,16 @@ func partOne() { stack[len(stack)-1].files[strings.Split(line, " ")[1]] = mustAtoi(strings.Split(line, " ")[0]) } } - // compute root size - for _, size := range root.files { - root.size += size - } - for _, f := range root.folders { - root.size += f.size + // finish computing directory sizes + for len(stack) > 0 { + curr := stack[len(stack)-1] + for _, size := range curr.files { + curr.size += size + } + for _, f := range curr.folders { + curr.size += f.size + } + stack = stack[0 : len(stack)-1] } fmt.Println(sum) } @@ -105,7 +107,7 @@ func partTwo() { files: map[string]int{}, folders: map[string]*Folder{}, } - spaceToFree := 30000000 - (70000000 - 49192532) + spaceToFree := 30000000 - (70000000 - 49192532) // size of all files, precomputed toDelete := 70000000 stack := []*Folder{&root} for scanner.Scan() { @@ -135,7 +137,6 @@ func partTwo() { name := strings.Split(line, " ")[1] stack[len(stack)-1].folders[name] = &Folder{ name: name, - parent: stack[len(stack)-1], files: map[string]int{}, folders: map[string]*Folder{}, } @@ -152,6 +153,9 @@ func partTwo() { for _, f := range curr.folders { curr.size += f.size } + if curr.size > spaceToFree && curr.size < toDelete { + toDelete = curr.size + } stack = stack[0 : len(stack)-1] } fmt.Println(toDelete) diff --git a/07/main.rs b/07/main.rs index 05ed050..840f8eb 100644 --- a/07/main.rs +++ b/07/main.rs @@ -7,18 +7,11 @@ use std::path::Path; use std::time::Instant; #[derive(Debug, Clone)] -struct ElfFile { - name: String, +struct Folder { + folders: HashMap, size: u32, } -#[derive(Debug, Clone)] -struct Folder<'a> { - name: String, - files: HashMap, - folders: HashMap>, -} - fn main() { let now = Instant::now(); part_one(); @@ -41,58 +34,40 @@ where Ok(io::BufReader::new(file).lines()) } -fn ElfFile_FromStr(s: &str) -> ElfFile { - let mut f = s.split(" "); - return ElfFile { - size: f.next().unwrap().parse::().unwrap(), - name: f.next().unwrap().to_string(), - }; -} - -fn newFolder(s: &str) -> Folder { - return Folder { - name: s.to_string(), - files: HashMap::new(), - folders: HashMap::new(), - }; -} - fn part_one() { if let Ok(lines) = read_lines("./inputs/input") { - let mut tree = Folder { - name: "/".to_string(), - files: HashMap::new(), - folders: HashMap::new(), - }; - let mut stack: Vec<&mut Folder> = vec![&mut tree]; + let mut sum = 0; + let mut stack: Vec = vec![0]; for line in lines { if let Ok(command) = line { match command.as_str() { - "$ cd /" => continue, // skip start + "$ cd /" => continue, // skip start "$ ls" => continue, // we can assume this if we're not moving between directories + s if s.starts_with("dir ") => continue, // we'll get there when we `cd` "$ cd .." => { - // stack.pop(); + let f = stack.pop().unwrap(); + if f < 100000 { + sum += f + } + let mut p = stack.pop().unwrap(); + p += f; + stack.push(p); } s if s.starts_with("$ cd ") => { - println!("push {}\n", s.split(" ").nth(2).unwrap()) - } - s if s.starts_with("dir ") => { - let f = stack.pop().unwrap(); - let ef = newFolder(s.split(" ").nth(1).unwrap()); - f.folders.insert(ef.name.clone(), &ef); - stack.push(f); + stack.push(0); } s => { // otherwise it must be a file - let f = stack.pop().unwrap(); - let ef = ElfFile_FromStr(s); - f.files.insert(ef.name.clone(), ef); + let mut f = stack.pop().unwrap(); + let mut sp = s.split(" "); + let size = sp.next().unwrap().parse::().unwrap(); + f += size; stack.push(f); } }; } } - println!("{:?}", tree); + println!("{:?}", sum); } }