day 07 complete!!!
This commit is contained in:
parent
1df04702a2
commit
abdebddd8f
|
@ -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 {
|
impl NodeRef {
|
||||||
pub fn add_node(&mut self, mut node: Node) -> Result<NodeRef, FileTreeError> {
|
pub fn add_node(&mut self, mut node: Node) -> Result<NodeRef, FileTreeError> {
|
||||||
node.set_parent(self);
|
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 {
|
impl Display for Node {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "- {} {}", self.name, self.contents)
|
write!(f, "- {} {}", self.name, self.contents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Contents {
|
|
||||||
Size(usize),
|
|
||||||
Children(Vec<NodeRef>),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for Contents {
|
impl Display for Contents {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
|
|
|
@ -1028,4 +1028,3 @@ $ cd nwqgchw
|
||||||
$ ls
|
$ ls
|
||||||
21374 lhfsc.lrh
|
21374 lhfsc.lrh
|
||||||
121726 wdcsgg.cjt
|
121726 wdcsgg.cjt
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#![allow(unused)]
|
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::{cell::RefCell, rc::Rc};
|
use std::rc::Rc;
|
||||||
|
|
||||||
use crate::file_tree::*;
|
use crate::file_tree::*;
|
||||||
use once_cell::sync::Lazy;
|
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));
|
.unwrap_or_else(|| panic!("invalid line {}", line));
|
||||||
ret.push(match &captures[1] {
|
ret.push(match &captures[1] {
|
||||||
"dir" => LsEntry::Dir(captures[2].to_string()),
|
"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)),
|
size: str::parse(&captures[1]).unwrap_or_else(|_| panic!("invalid line {}", line)),
|
||||||
name: captures[2].to_string(),
|
name: captures[2].to_string(),
|
||||||
}),
|
}),
|
||||||
|
@ -76,8 +75,8 @@ fn parse_ls(lines: &mut std::iter::Peekable<std::str::Lines<'_>>) -> Vec<LsEntry
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(input: &str) -> Node {
|
pub fn parse(input: &str) -> NodeRef {
|
||||||
unimplemented!()
|
commands_to_tree(parse_to_commands(input))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn commands_to_tree(input: Vec<Command>) -> NodeRef {
|
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) => {
|
Command::Ls(ls) => {
|
||||||
for entry in ls {
|
for entry in ls {
|
||||||
match entry {
|
match entry {
|
||||||
LsEntry::Dir(d) => {
|
LsEntry::Dir(_) => {
|
||||||
//dirs dont exist until you cd into them.
|
//dirs dont exist until you cd into them.
|
||||||
}
|
}
|
||||||
LsEntry::File(f) => {
|
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::file_tree::*;
|
||||||
use crate::parser::*;
|
|
||||||
|
|
||||||
pub fn part1() -> usize {
|
pub fn part1(input: NodeRef) -> usize {
|
||||||
unimplemented!()
|
let dirs = input.get_all_dirs();
|
||||||
|
dirs.iter()
|
||||||
|
.map(|d| d.borrow().get_total_size())
|
||||||
|
.filter(|s| *s <= 100000)
|
||||||
|
.sum()
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[cfg(test)]
|
#[cfg(test)]
|
||||||
// mod tests {
|
mod tests {
|
||||||
// use super::*;
|
use std::{ops::Deref, rc::Rc};
|
||||||
//
|
|
||||||
// #[test]
|
use super::*;
|
||||||
// fn test_part1() {
|
|
||||||
// assert_eq!(part1(), 0);
|
#[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::file_tree::*;
|
||||||
use crate::parser::*;
|
|
||||||
|
|
||||||
pub fn part2() -> usize {
|
const TOTAL_SPACE: usize = 70000000;
|
||||||
unimplemented!()
|
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)]
|
#[cfg(test)]
|
||||||
// mod tests {
|
mod tests {
|
||||||
// use super::*;
|
use std::{ops::Deref, rc::Rc};
|
||||||
//
|
|
||||||
// #[test]
|
use super::*;
|
||||||
// fn test_part2() {
|
|
||||||
// assert_eq!(part2(), 0);
|
#[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 part1;
|
||||||
mod part2;
|
mod part2;
|
||||||
mod parser;
|
mod parser;
|
||||||
|
@ -9,8 +12,8 @@ fn main() {
|
||||||
let structured_input = parser::parse(input);
|
let structured_input = parser::parse(input);
|
||||||
|
|
||||||
println!("Part One");
|
println!("Part One");
|
||||||
println!("Result: {}", part1::part1());
|
println!("Result: {}", part1::part1(NodeRef(Rc::clone(&structured_input))));
|
||||||
|
|
||||||
println!("Part Two");
|
println!("Part Two");
|
||||||
println!("Result: {}", part2::part2());
|
println!("Result: {}", part2::part2(NodeRef(Rc::clone(&structured_input))));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue