day 07 complete!!!
This commit is contained in:
		
							parent
							
								
									1df04702a2
								
							
						
					
					
						commit
						abdebddd8f
					
				
					 6 changed files with 97 additions and 49 deletions
				
			
		| 
						 | 
				
			
			@ -44,12 +44,6 @@ impl From<NodeRef> for Rc<RefCell<Node>> {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Display for NodeRef {
 | 
			
		||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
        write!(f, "{}", self.borrow())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl NodeRef {
 | 
			
		||||
    pub fn add_node(&mut self, mut node: Node) -> Result<NodeRef, FileTreeError> {
 | 
			
		||||
        node.set_parent(self);
 | 
			
		||||
| 
						 | 
				
			
			@ -183,18 +177,24 @@ impl Node {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
enum Contents {
 | 
			
		||||
    Size(usize),
 | 
			
		||||
    Children(Vec<NodeRef>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Display for NodeRef {
 | 
			
		||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
        write!(f, "{}", self.borrow())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Display for Node {
 | 
			
		||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
        write!(f, "- {} {}", self.name, self.contents)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub enum Contents {
 | 
			
		||||
    Size(usize),
 | 
			
		||||
    Children(Vec<NodeRef>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Display for Contents {
 | 
			
		||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
        match self {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1028,4 +1028,3 @@ $ cd nwqgchw
 | 
			
		|||
$ ls
 | 
			
		||||
21374 lhfsc.lrh
 | 
			
		||||
121726 wdcsgg.cjt
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
#![allow(unused)]
 | 
			
		||||
use std::ops::Deref;
 | 
			
		||||
use std::{cell::RefCell, rc::Rc};
 | 
			
		||||
use std::rc::Rc;
 | 
			
		||||
 | 
			
		||||
use crate::file_tree::*;
 | 
			
		||||
use once_cell::sync::Lazy;
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +65,7 @@ fn parse_ls(lines: &mut std::iter::Peekable<std::str::Lines<'_>>) -> Vec<LsEntry
 | 
			
		|||
            .unwrap_or_else(|| panic!("invalid line {}", line));
 | 
			
		||||
        ret.push(match &captures[1] {
 | 
			
		||||
            "dir" => LsEntry::Dir(captures[2].to_string()),
 | 
			
		||||
            s => LsEntry::File(ParseFile {
 | 
			
		||||
            _ => LsEntry::File(ParseFile {
 | 
			
		||||
                size: str::parse(&captures[1]).unwrap_or_else(|_| panic!("invalid line {}", line)),
 | 
			
		||||
                name: captures[2].to_string(),
 | 
			
		||||
            }),
 | 
			
		||||
| 
						 | 
				
			
			@ -76,8 +75,8 @@ fn parse_ls(lines: &mut std::iter::Peekable<std::str::Lines<'_>>) -> Vec<LsEntry
 | 
			
		|||
    ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn parse(input: &str) -> Node {
 | 
			
		||||
    unimplemented!()
 | 
			
		||||
pub fn parse(input: &str) -> NodeRef {
 | 
			
		||||
    commands_to_tree(parse_to_commands(input))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn commands_to_tree(input: Vec<Command>) -> NodeRef {
 | 
			
		||||
| 
						 | 
				
			
			@ -91,11 +90,11 @@ pub fn commands_to_tree(input: Vec<Command>) -> NodeRef {
 | 
			
		|||
            Command::Ls(ls) => {
 | 
			
		||||
                for entry in ls {
 | 
			
		||||
                    match entry {
 | 
			
		||||
                        LsEntry::Dir(d) => {
 | 
			
		||||
                        LsEntry::Dir(_) => {
 | 
			
		||||
                            //dirs dont exist until you cd into them.
 | 
			
		||||
                        }
 | 
			
		||||
                        LsEntry::File(f) => {
 | 
			
		||||
                            cursor.add_file(f.name, f.size);
 | 
			
		||||
                            cursor.add_file(f.name, f.size).unwrap();
 | 
			
		||||
                        }
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,37 @@
 | 
			
		|||
#![allow(unused)]
 | 
			
		||||
use crate::file_tree::*;
 | 
			
		||||
use crate::parser::*;
 | 
			
		||||
 | 
			
		||||
pub fn part1() -> usize {
 | 
			
		||||
    unimplemented!()
 | 
			
		||||
pub fn part1(input: NodeRef) -> usize {
 | 
			
		||||
    let dirs = input.get_all_dirs();
 | 
			
		||||
    dirs.iter()
 | 
			
		||||
        .map(|d| d.borrow().get_total_size())
 | 
			
		||||
        .filter(|s| *s <= 100000)
 | 
			
		||||
        .sum()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// #[cfg(test)]
 | 
			
		||||
// mod tests {
 | 
			
		||||
//     use super::*;
 | 
			
		||||
//
 | 
			
		||||
//     #[test]
 | 
			
		||||
//     fn test_part1() {
 | 
			
		||||
//         assert_eq!(part1(), 0);
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use std::{ops::Deref, rc::Rc};
 | 
			
		||||
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part1() {
 | 
			
		||||
        let mut root = NodeRef::new_dir("/".to_string());
 | 
			
		||||
        let mut cursor = root.add_node(Node::new_dir("a".to_string())).unwrap();
 | 
			
		||||
        cursor = cursor.add_dir("e".to_string()).unwrap();
 | 
			
		||||
        cursor.add_file("i".to_string(), 584).unwrap();
 | 
			
		||||
        cursor = Rc::clone(cursor.deref()).borrow().get_parent().unwrap();
 | 
			
		||||
        cursor.add_file("f".to_string(), 29116).unwrap();
 | 
			
		||||
        cursor.add_file("g".to_string(), 2557).unwrap();
 | 
			
		||||
        cursor.add_file("h.lst".to_string(), 62596).unwrap();
 | 
			
		||||
        cursor = Rc::clone(cursor.deref()).borrow().get_parent().unwrap();
 | 
			
		||||
        cursor.add_file("b.txt".to_string(), 14848514).unwrap();
 | 
			
		||||
        cursor.add_file("c.dat".to_string(), 8504156).unwrap();
 | 
			
		||||
        cursor = cursor.add_dir("d".to_string()).unwrap();
 | 
			
		||||
        cursor.add_file("j".to_string(), 4060174).unwrap();
 | 
			
		||||
        cursor.add_file("d.log".to_string(), 8033020).unwrap();
 | 
			
		||||
        cursor.add_file("d.ext".to_string(), 5626152).unwrap();
 | 
			
		||||
        cursor.add_file("k".to_string(), 7214296).unwrap();
 | 
			
		||||
        assert_eq!(part1(root), 95437);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,44 @@
 | 
			
		|||
#![allow(unused)]
 | 
			
		||||
use crate::file_tree::*;
 | 
			
		||||
use crate::parser::*;
 | 
			
		||||
 | 
			
		||||
pub fn part2() -> usize {
 | 
			
		||||
    unimplemented!()
 | 
			
		||||
const TOTAL_SPACE: usize = 70000000;
 | 
			
		||||
const NEEDED_SPACE: usize = 30000000;
 | 
			
		||||
 | 
			
		||||
pub fn part2(input: NodeRef) -> usize {
 | 
			
		||||
    let used_space = input.borrow().get_total_size();
 | 
			
		||||
    let unused_space = TOTAL_SPACE - used_space;
 | 
			
		||||
    let space_to_free = NEEDED_SPACE - unused_space;
 | 
			
		||||
    let dirs = input.get_all_dirs();
 | 
			
		||||
    dirs.iter()
 | 
			
		||||
        .map(|d| d.borrow().get_total_size())
 | 
			
		||||
        .filter(|s| *s >= space_to_free)
 | 
			
		||||
        .min()
 | 
			
		||||
        .unwrap()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// #[cfg(test)]
 | 
			
		||||
// mod tests {
 | 
			
		||||
//     use super::*;
 | 
			
		||||
//
 | 
			
		||||
//     #[test]
 | 
			
		||||
//     fn test_part2() {
 | 
			
		||||
//         assert_eq!(part2(), 0);
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use std::{ops::Deref, rc::Rc};
 | 
			
		||||
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_part2() {
 | 
			
		||||
        let mut root = NodeRef::new_dir("/".to_string());
 | 
			
		||||
        let mut cursor = root.add_node(Node::new_dir("a".to_string())).unwrap();
 | 
			
		||||
        cursor = cursor.add_dir("e".to_string()).unwrap();
 | 
			
		||||
        cursor.add_file("i".to_string(), 584).unwrap();
 | 
			
		||||
        cursor = Rc::clone(cursor.deref()).borrow().get_parent().unwrap();
 | 
			
		||||
        cursor.add_file("f".to_string(), 29116).unwrap();
 | 
			
		||||
        cursor.add_file("g".to_string(), 2557).unwrap();
 | 
			
		||||
        cursor.add_file("h.lst".to_string(), 62596).unwrap();
 | 
			
		||||
        cursor = Rc::clone(cursor.deref()).borrow().get_parent().unwrap();
 | 
			
		||||
        cursor.add_file("b.txt".to_string(), 14848514).unwrap();
 | 
			
		||||
        cursor.add_file("c.dat".to_string(), 8504156).unwrap();
 | 
			
		||||
        cursor = cursor.add_dir("d".to_string()).unwrap();
 | 
			
		||||
        cursor.add_file("j".to_string(), 4060174).unwrap();
 | 
			
		||||
        cursor.add_file("d.log".to_string(), 8033020).unwrap();
 | 
			
		||||
        cursor.add_file("d.ext".to_string(), 5626152).unwrap();
 | 
			
		||||
        cursor.add_file("k".to_string(), 7214296).unwrap();
 | 
			
		||||
        assert_eq!(part2(root), 24933642);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,7 @@
 | 
			
		|||
#![allow(dead_code)]
 | 
			
		||||
use std::rc::Rc;
 | 
			
		||||
 | 
			
		||||
use crate::file_tree::NodeRef;
 | 
			
		||||
 | 
			
		||||
mod part1;
 | 
			
		||||
mod part2;
 | 
			
		||||
mod parser;
 | 
			
		||||
| 
						 | 
				
			
			@ -9,8 +12,8 @@ fn main() {
 | 
			
		|||
    let structured_input = parser::parse(input);
 | 
			
		||||
 | 
			
		||||
    println!("Part One");
 | 
			
		||||
    println!("Result: {}", part1::part1());
 | 
			
		||||
    println!("Result: {}", part1::part1(NodeRef(Rc::clone(&structured_input))));
 | 
			
		||||
 | 
			
		||||
    println!("Part Two");
 | 
			
		||||
    println!("Result: {}", part2::part2());
 | 
			
		||||
    println!("Result: {}", part2::part2(NodeRef(Rc::clone(&structured_input))));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue