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 {
|
mod test {
|
||||||
const EXAMPLE01: &'static str = include_str!("input/day03/example01");
|
const EXAMPLE01: &'static str = include_str!("input/day03/example01");
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_first() {
|
fn test_first() {
|
||||||
assert_eq!(super::solve_task01(EXAMPLE01), 157);
|
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) {
|
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);
|
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 day04;
|
||||||
mod day05;
|
mod day05;
|
||||||
mod day06;
|
mod day06;
|
||||||
|
mod day07;
|
||||||
|
|
||||||
const CONTENT01: &'static str = include_str!("input/day01/input01");
|
const CONTENT01: &'static str = include_str!("input/day01/input01");
|
||||||
const CONTENT02: &'static str = include_str!("input/day02/input01");
|
const CONTENT02: &'static str = include_str!("input/day02/input01");
|
||||||
|
Loading…
Reference in New Issue
Block a user