add a draft solution for day 7
This commit is contained in:
parent
964119473d
commit
671e0ee18d
1 changed files with 90 additions and 5 deletions
|
@ -1,14 +1,99 @@
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::fs::File;
|
|
||||||
use std::io::{BufReader,Lines};
|
|
||||||
use crate::util::read_lines;
|
use crate::util::read_lines;
|
||||||
|
use std::cell::{Ref, RefCell};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufReader, Lines};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::rc::{Rc, Weak};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum FsNodeType {
|
||||||
|
File,
|
||||||
|
Directory,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct FsNode {
|
||||||
|
vname: String,
|
||||||
|
vsize: u64,
|
||||||
|
vtype: FsNodeType,
|
||||||
|
parent: RefCell<Weak<FsNode>>,
|
||||||
|
childs: RefCell<Vec<Rc<FsNode>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FsNode {
|
||||||
|
fn new() -> Rc<FsNode> {
|
||||||
|
Rc::new(FsNode {
|
||||||
|
vname: String::new(),
|
||||||
|
vsize: (0),
|
||||||
|
vtype: (FsNodeType::File),
|
||||||
|
parent: RefCell::new(Weak::new()),
|
||||||
|
childs: (RefCell::new(Vec::new())),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_file(fname: &str, size: u64) -> Rc<FsNode> {
|
||||||
|
Rc::new(FsNode {
|
||||||
|
vname: (fname.to_string()),
|
||||||
|
vsize: (size),
|
||||||
|
vtype: (FsNodeType::File),
|
||||||
|
parent: RefCell::new(Weak::new()),
|
||||||
|
childs: (RefCell::new(Vec::new())),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_dir(fname: &str) -> Rc<FsNode> {
|
||||||
|
Rc::new(FsNode {
|
||||||
|
vname: (fname.to_string()),
|
||||||
|
vsize: (0),
|
||||||
|
vtype: (FsNodeType::Directory),
|
||||||
|
parent: RefCell::new(Weak::new()),
|
||||||
|
childs: (RefCell::new(Vec::new())),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_parent(&self, new_parent: &Rc<FsNode>) {
|
||||||
|
*self.parent.borrow_mut() = Rc::downgrade(new_parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_child_node(&self, cf: Rc<FsNode>) {
|
||||||
|
match self.vtype {
|
||||||
|
FsNodeType::File => {}
|
||||||
|
FsNodeType::Directory => self.childs.borrow_mut().push(cf),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_size(&self) ->u64{
|
||||||
|
self.vsize
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_size_of_tree(&self) -> u64{
|
||||||
|
let mut csize:u64 = self.vsize;
|
||||||
|
for c in self.childs.borrow().iter(){
|
||||||
|
csize += c.get_size_of_tree();
|
||||||
|
}
|
||||||
|
csize
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_parent(&self) -> Option<Rc<FsNode>> {
|
||||||
|
self.parent.borrow().upgrade()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_child(&self) -> Ref<Vec<Rc<FsNode>>> {
|
||||||
|
self.childs.borrow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn part1(lines: Lines<BufReader<File>>) {
|
fn part1(lines: Lines<BufReader<File>>) {
|
||||||
|
let tnode1: Rc<FsNode> = FsNode::new_dir("test");
|
||||||
|
let tnode2: Rc<FsNode> = FsNode::new_file("test", 10);
|
||||||
|
tnode2.set_parent(&tnode1);
|
||||||
|
tnode1.add_child_node(tnode2);
|
||||||
|
tnode1.add_child_node(FsNode::new_file("tesd234", 55));
|
||||||
|
println!("{:?}", tnode1.get_size_of_tree())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn subcmd_day007(file: &Option<PathBuf>, alt: &bool) {
|
pub fn subcmd_day007(file: &Option<PathBuf>, alt: &bool) {
|
||||||
if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) {
|
if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) {
|
||||||
|
part1(lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue