feat: start with day 7
This commit is contained in:
parent
9ee13cc480
commit
f27b6274ce
@ -52,7 +52,6 @@ pub fn convert_char_to_prio(c: char) -> u8 {
|
||||
mod test {
|
||||
const EXAMPLE01: &'static str = include_str!("input/day03/example01");
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_first() {
|
||||
assert_eq!(super::solve_task01(EXAMPLE01), 157);
|
||||
|
@ -99,7 +99,9 @@ fn move_in_port_currently(port: &mut Vec<LinkedList<String>>, from: &str, to: &s
|
||||
}
|
||||
|
||||
fn move_in_port_once(port: &mut Vec<LinkedList<String>>, from: &str, to: &str) {
|
||||
let tmp: String = port.get_mut((from.parse::<usize>().unwrap()) -1).unwrap().pop_back().unwrap();
|
||||
let tmp: String = port.get_mut(
|
||||
|
||||
(from.parse::<usize>().unwrap()) -1).unwrap().pop_back().unwrap();
|
||||
port.get_mut((to.parse::<usize>().unwrap()) -1).unwrap().push_back(tmp);
|
||||
}
|
||||
|
||||
|
144
src/day07.rs
Normal file
144
src/day07.rs
Normal file
@ -0,0 +1,144 @@
|
||||
use crate::utils;
|
||||
|
||||
#[derive(Debug,Clone)]
|
||||
struct File {
|
||||
name: String,
|
||||
size: i32,
|
||||
}
|
||||
|
||||
#[derive(Debug,Clone)]
|
||||
struct Folder{
|
||||
root: Option<Box<Folder>>,
|
||||
name: String,
|
||||
folder: Vec<Folder>,
|
||||
files: Vec<File>,
|
||||
}
|
||||
|
||||
impl Folder {
|
||||
fn add_folder(&mut self, folder: Folder) {
|
||||
self.folder.push(folder);
|
||||
}
|
||||
|
||||
fn add_file(&mut self, file: File) {
|
||||
self.files.push(file);
|
||||
}
|
||||
|
||||
fn get_size(self) -> i32 {
|
||||
let file_sum: i32 = self.files.into_iter().map(|file| file.size).sum();
|
||||
let folder_sum: i32 = self.folder.into_iter().map(|folder| folder.get_size()).sum();
|
||||
|
||||
return file_sum + folder_sum;
|
||||
}
|
||||
|
||||
fn flat_folder(self) -> Vec<Folder> {
|
||||
let mut sub_folder = vec![];
|
||||
for folder in self.folder {
|
||||
sub_folder.push(folder);
|
||||
sub_folder.extend(folder.flat_folder());
|
||||
}
|
||||
|
||||
return sub_folder;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn execute_task01(content: &str) {
|
||||
let line = solve_task01(content);
|
||||
|
||||
println!("Day07 - Task01 - Sum of total Size: {}", line);
|
||||
}
|
||||
|
||||
pub fn execute_task02(content: &str) {
|
||||
let line = solve_task02(content);
|
||||
|
||||
println!("Day07 - Task02 - Last Item Str Line: {}", line);
|
||||
}
|
||||
|
||||
fn solve_task01(content: &str) -> i32 {
|
||||
|
||||
let root: &Folder = parse_tree(content);
|
||||
|
||||
let full_size: i32 = root.flat_folder()
|
||||
.into_iter()
|
||||
.map(|folder| folder.get_size())
|
||||
.filter(|size| size.clone() <= 100000)
|
||||
.sum();
|
||||
|
||||
return full_size;
|
||||
}
|
||||
|
||||
fn solve_task02(content: &str) -> i32 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn parse_tree(content: &str) -> &Folder {
|
||||
let vector = utils::convert_to_string_slice(&content);
|
||||
|
||||
let root: &Folder = &Folder{
|
||||
root: None,
|
||||
name: "".parse().unwrap(),
|
||||
folder: vec![],
|
||||
files: vec![],
|
||||
};
|
||||
let mut current: &Folder = &root;
|
||||
|
||||
for line in vector.into_iter() {
|
||||
if line.starts_with("$") {
|
||||
if line.starts_with("$ cd") {
|
||||
let select = line.split(" ").collect::<Vec<&str>>()[3..].join("");
|
||||
|
||||
if select == "/" {
|
||||
current = &root;
|
||||
} else if select == ".." {
|
||||
current = ¤t.root.unwrap();
|
||||
} else {
|
||||
for child_folder in current.folder {
|
||||
if child_folder.name == select {
|
||||
current = &child_folder;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if line.starts_with("$ ls") {
|
||||
continue
|
||||
} else {
|
||||
let parts: Vec<&str> = line.split(" ").collect();
|
||||
let part1 = *parts.get(0).unwrap();
|
||||
let part2 = *parts.get(1).unwrap();
|
||||
|
||||
if part1 == "dir" {
|
||||
current.add_folder(Folder {
|
||||
root: Some(Box::new(*current)),
|
||||
name: part2.parse().unwrap(),
|
||||
folder: vec![],
|
||||
files: vec![],
|
||||
});
|
||||
} else {
|
||||
current.add_file(File{
|
||||
name: part2.parse().unwrap(),
|
||||
size: part1.parse::<i32>().unwrap(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
|
||||
const EXAMPLE01: &'static str = include_str!("input/day07/example01");
|
||||
|
||||
#[test]
|
||||
fn test_first() {
|
||||
assert_eq!(super::solve_task01(EXAMPLE01), 95437);
|
||||
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_second() {
|
||||
|
||||
}
|
||||
}
|
23
src/input/day07/example01
Normal file
23
src/input/day07/example01
Normal file
@ -0,0 +1,23 @@
|
||||
$ cd /
|
||||
$ ls
|
||||
dir a
|
||||
14848514 b.txt
|
||||
8504156 c.dat
|
||||
dir d
|
||||
$ cd a
|
||||
$ ls
|
||||
dir e
|
||||
29116 f
|
||||
2557 g
|
||||
62596 h.lst
|
||||
$ cd e
|
||||
$ ls
|
||||
584 i
|
||||
$ cd ..
|
||||
$ cd ..
|
||||
$ cd d
|
||||
$ ls
|
||||
4060174 j
|
||||
8033020 d.log
|
||||
5626152 d.ext
|
||||
7214296 k
|
1030
src/input/day07/input01
Normal file
1030
src/input/day07/input01
Normal file
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,7 @@ mod day03;
|
||||
mod day04;
|
||||
mod day05;
|
||||
mod day06;
|
||||
mod day07;
|
||||
|
||||
const CONTENT01: &'static str = include_str!("input/day01/input01");
|
||||
const CONTENT02: &'static str = include_str!("input/day02/input01");
|
||||
|
Loading…
Reference in New Issue
Block a user