init
This commit is contained in:
194
d07/src/a1.rs
Normal file
194
d07/src/a1.rs
Normal file
@ -0,0 +1,194 @@
|
||||
use std::char::MAX;
|
||||
|
||||
const MAX_SIZE :i32 = 100001;
|
||||
static mut g_sum :i32 = 0;
|
||||
|
||||
struct File {
|
||||
name :String,
|
||||
size :i32
|
||||
}
|
||||
|
||||
struct Folder {
|
||||
name :String,
|
||||
files :Vec<File>,
|
||||
subdirs :Vec<Folder>
|
||||
}
|
||||
|
||||
|
||||
impl Folder {
|
||||
|
||||
fn new(name :impl Into<String>) -> Self {
|
||||
Folder { name: name.into(), files: vec![], subdirs: vec![] }
|
||||
}
|
||||
|
||||
fn add_folder(&mut self, path :&Vec<String>, folder :Folder) {
|
||||
|
||||
let sub_folder = self.get_folder(path);
|
||||
|
||||
sub_folder.subdirs.push(folder);
|
||||
}
|
||||
|
||||
fn add_file(&mut self, path :&Vec<String>, name :impl Into<String>, size :i32) {
|
||||
|
||||
let folder = self.get_folder(path);
|
||||
|
||||
folder.files.push(File{name: name.into(), size: size});
|
||||
}
|
||||
|
||||
fn get_folder(&mut self, path :&Vec<String>) -> &mut Folder {
|
||||
|
||||
unsafe {
|
||||
let mut folder_ptr :*mut Folder = self;
|
||||
for p in path {
|
||||
|
||||
for sd in &mut (*folder_ptr).subdirs {
|
||||
if sd.name.eq(p) {
|
||||
folder_ptr = sd;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return &mut *folder_ptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn get_folder_size(&self) -> i32{
|
||||
let mut sum :i32 = 0;
|
||||
for f in &self.files {
|
||||
sum += f.size;
|
||||
}
|
||||
|
||||
for sd in &self.subdirs {
|
||||
sum += sd.get_folder_size();
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
fn parse_command(inp :&String) -> Vec<&str> {
|
||||
return inp.split(' ').collect();
|
||||
}
|
||||
|
||||
fn evaluate_command(cmd :&Vec<&str>, current_dir :&mut Vec<String>, fs :&mut Folder) {
|
||||
|
||||
match cmd[1] {
|
||||
"cd" => {
|
||||
|
||||
match cmd[2] {
|
||||
".." => {
|
||||
current_dir.pop();
|
||||
}
|
||||
|
||||
_ => {
|
||||
current_dir.push(cmd[2].to_owned());
|
||||
fs.add_folder(¤t_dir, Folder::new(cmd[2]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn save_element(cmd :&Vec<&str>, current_dir :&Vec<String>, fs :&mut Folder) {
|
||||
|
||||
match cmd[0] {
|
||||
"dir" => { /* Do Nothing */ }
|
||||
_ => {
|
||||
// add file to Folder at current-dir path
|
||||
fs.add_file(current_dir, cmd[1], cmd[0].parse::<i32>().unwrap());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn calc_task_specific_size(folder :&Folder) {
|
||||
|
||||
let f_size = folder.get_folder_size();
|
||||
|
||||
if f_size < MAX_SIZE {
|
||||
unsafe {
|
||||
g_sum += f_size;
|
||||
}
|
||||
}
|
||||
|
||||
for sd in &folder.subdirs {
|
||||
calc_task_specific_size(sd);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn dbg_print(f :&Folder) {
|
||||
println!("Folder: {}", f.name);
|
||||
|
||||
print!("Subfolders: ");
|
||||
for dir in &f.subdirs {
|
||||
print!("{}, ", dir.name);
|
||||
}
|
||||
println!();
|
||||
|
||||
print!("Files: ");
|
||||
for file in &f.files {
|
||||
print!("({}, {}), ", file.name, file.size);
|
||||
}
|
||||
println!();
|
||||
|
||||
for subdir in &f.subdirs {
|
||||
dbg_print(subdir);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn run(inp_raw :Vec<String>) {
|
||||
let mut inp = inp_raw;
|
||||
inp.remove(0);
|
||||
// Iterate through and save Filesystem
|
||||
|
||||
let mut fs :Folder = Folder::new("/");
|
||||
|
||||
let mut current_dir :Vec<String> = vec![];
|
||||
|
||||
for cmd in inp {
|
||||
let parsed_cmd = parse_command(&cmd);
|
||||
|
||||
if parsed_cmd[0].eq("$") {
|
||||
// evaluate directory comand
|
||||
evaluate_command(&parsed_cmd, &mut current_dir, &mut fs);
|
||||
} else {
|
||||
// look for files & subdirectories
|
||||
|
||||
|
||||
save_element(&parsed_cmd, ¤t_dir, &mut fs);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//dbg_print(&fs);
|
||||
let mut sum :i32 = 0;
|
||||
// Iterate through and add up Files
|
||||
//for sf in fs.subdirs {
|
||||
calc_task_specific_size(&fs);
|
||||
|
||||
//}
|
||||
unsafe {
|
||||
println!("a1: {}", g_sum);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
- Maybe check for already existing folder in adFolder
|
||||
|
||||
*/
|
||||
|
||||
}
|
195
d07/src/a2.rs
Normal file
195
d07/src/a2.rs
Normal file
@ -0,0 +1,195 @@
|
||||
use std::char::MAX;
|
||||
|
||||
const MAX_SIZE :i32 = 30000000;
|
||||
static mut min_dir :i32 = MAX_SIZE * 10;
|
||||
|
||||
struct File {
|
||||
name :String,
|
||||
size :i32
|
||||
}
|
||||
|
||||
struct Folder {
|
||||
name :String,
|
||||
files :Vec<File>,
|
||||
subdirs :Vec<Folder>
|
||||
}
|
||||
|
||||
|
||||
impl Folder {
|
||||
|
||||
fn new(name :impl Into<String>) -> Self {
|
||||
Folder { name: name.into(), files: vec![], subdirs: vec![] }
|
||||
}
|
||||
|
||||
fn add_folder(&mut self, path :&Vec<String>, folder :Folder) {
|
||||
|
||||
let sub_folder = self.get_folder(path);
|
||||
|
||||
sub_folder.subdirs.push(folder);
|
||||
}
|
||||
|
||||
fn add_file(&mut self, path :&Vec<String>, name :impl Into<String>, size :i32) {
|
||||
|
||||
let folder = self.get_folder(path);
|
||||
|
||||
folder.files.push(File{name: name.into(), size: size});
|
||||
}
|
||||
|
||||
fn get_folder(&mut self, path :&Vec<String>) -> &mut Folder {
|
||||
|
||||
unsafe {
|
||||
let mut folder_ptr :*mut Folder = self;
|
||||
for p in path {
|
||||
|
||||
for sd in &mut (*folder_ptr).subdirs {
|
||||
if sd.name.eq(p) {
|
||||
folder_ptr = sd;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return &mut *folder_ptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn get_folder_size(&self) -> i32{
|
||||
let mut sum :i32 = 0;
|
||||
for f in &self.files {
|
||||
sum += f.size;
|
||||
}
|
||||
|
||||
for sd in &self.subdirs {
|
||||
sum += sd.get_folder_size();
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
fn parse_command(inp :&String) -> Vec<&str> {
|
||||
return inp.split(' ').collect();
|
||||
}
|
||||
|
||||
fn evaluate_command(cmd :&Vec<&str>, current_dir :&mut Vec<String>, fs :&mut Folder) {
|
||||
|
||||
match cmd[1] {
|
||||
"cd" => {
|
||||
|
||||
match cmd[2] {
|
||||
".." => {
|
||||
current_dir.pop();
|
||||
}
|
||||
|
||||
_ => {
|
||||
current_dir.push(cmd[2].to_owned());
|
||||
fs.add_folder(¤t_dir, Folder::new(cmd[2]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn save_element(cmd :&Vec<&str>, current_dir :&Vec<String>, fs :&mut Folder) {
|
||||
|
||||
match cmd[0] {
|
||||
"dir" => { /* Do Nothing */ }
|
||||
_ => {
|
||||
// add file to Folder at current-dir path
|
||||
fs.add_file(current_dir, cmd[1], cmd[0].parse::<i32>().unwrap());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn calc_task_specific_size(needed_space :i32, folder :&Folder) {
|
||||
|
||||
let f_size = folder.get_folder_size();
|
||||
|
||||
unsafe {
|
||||
if f_size + needed_space >= MAX_SIZE && f_size < min_dir {
|
||||
min_dir = f_size;
|
||||
}
|
||||
}
|
||||
|
||||
for sd in &folder.subdirs {
|
||||
calc_task_specific_size(needed_space, sd);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn dbg_print(f :&Folder) {
|
||||
println!("Folder: {}", f.name);
|
||||
|
||||
print!("Subfolders: ");
|
||||
for dir in &f.subdirs {
|
||||
print!("{}, ", dir.name);
|
||||
}
|
||||
println!();
|
||||
|
||||
print!("Files: ");
|
||||
for file in &f.files {
|
||||
print!("({}, {}), ", file.name, file.size);
|
||||
}
|
||||
println!();
|
||||
|
||||
for subdir in &f.subdirs {
|
||||
dbg_print(subdir);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn run(inp_raw :Vec<String>) {
|
||||
let mut inp = inp_raw;
|
||||
inp.remove(0);
|
||||
// Iterate through and save Filesystem
|
||||
|
||||
let mut fs :Folder = Folder::new("/");
|
||||
|
||||
let mut current_dir :Vec<String> = vec![];
|
||||
|
||||
for cmd in inp {
|
||||
let parsed_cmd = parse_command(&cmd);
|
||||
|
||||
if parsed_cmd[0].eq("$") {
|
||||
// evaluate directory comand
|
||||
evaluate_command(&parsed_cmd, &mut current_dir, &mut fs);
|
||||
} else {
|
||||
// look for files & subdirectories
|
||||
|
||||
|
||||
save_element(&parsed_cmd, ¤t_dir, &mut fs);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//dbg_print(&fs);
|
||||
let mut sum :i32 = 0;
|
||||
// Iterate through and add up Files
|
||||
//for sf in fs.subdirs {
|
||||
let free_space = 70000000 - fs.get_folder_size();
|
||||
calc_task_specific_size(free_space, &fs);
|
||||
|
||||
//}
|
||||
unsafe {
|
||||
println!("a2: {}", min_dir);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
- Maybe check for already existing folder in adFolder
|
||||
|
||||
*/
|
||||
|
||||
}
|
41
d07/src/main.rs
Normal file
41
d07/src/main.rs
Normal file
@ -0,0 +1,41 @@
|
||||
use std::io::BufRead;
|
||||
|
||||
mod a1;
|
||||
mod a2;
|
||||
|
||||
fn read_file(path :&str) -> Vec<String> {
|
||||
|
||||
let file = std::fs::File::open(path);
|
||||
|
||||
return match file {
|
||||
|
||||
Ok(handle) => {
|
||||
|
||||
let reader = std::io::BufReader::new(handle);
|
||||
|
||||
let mut vec : Vec<String> = vec![];
|
||||
|
||||
reader.lines().for_each(|elem| {
|
||||
vec.push(elem.unwrap());
|
||||
});
|
||||
|
||||
vec
|
||||
|
||||
}
|
||||
|
||||
Err(_) => vec![]
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
let inp :Vec<String> = read_file("input.txt");
|
||||
|
||||
a1::run(inp.clone());
|
||||
|
||||
a2::run(inp);
|
||||
|
||||
}
|
Reference in New Issue
Block a user