This commit is contained in:
Tim Nope
2022-12-11 18:06:33 +01:00
commit 6b6fc8d486
1361 changed files with 19939 additions and 0 deletions

194
d07/src/a1.rs Normal file
View 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(&current_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, &current_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
View 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(&current_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, &current_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
View 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);
}