Advertisement
Guest User

day7

a guest
Dec 8th, 2022
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.78 KB | None | 0 0
  1. use std::borrow::{Borrow, BorrowMut};
  2. use std::collections::{HashMap, HashSet};
  3. use std::fs::File;
  4. use std::ops::Deref;
  5.  
  6. #[derive(Clone, Debug)]
  7. pub struct directory{
  8.     name: &'static str,
  9.    directories: HashMap<&'static str, directory>,
  10.     files: Vec<file>,
  11.     path: Vec<&'static str>
  12. }
  13.  
  14. #[derive(Clone, Debug)]
  15. pub struct file{
  16.    name: &'static str,
  17.     size: usize
  18. }
  19.  
  20.  
  21. fn getSizeMap() -> HashMap<String, usize>
  22. {
  23.     let mut root: directory = directory{ name: "/", directories: Default::default(), files: vec![], path: vec![] };
  24.     let mut current = &mut root;
  25.     let (_, input) = include_str!("../../input7").split_at(6);
  26.  
  27.     for l in input.split("\n$ ").skip(1)
  28.     {
  29.         if l.starts_with("ls") {
  30.             if current.files.is_empty()
  31.             {
  32.                 for item in l.lines().skip(1)
  33.                 {
  34.                     if item.starts_with("dir ") {
  35.                         // we dont care about directories until we cd into them
  36.                     } else {
  37.                         let (sizeStr, fileName) = item.split_once(" ").unwrap();
  38.                         current.files.push(file{ name: fileName, size: sizeStr.parse().unwrap() } );
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.         else if l.starts_with("cd ..") {
  44.             let path = current.path.clone();
  45.             let mut newCurrent = &mut root;
  46.             for dir in path.iter().skip(1) {
  47.                 newCurrent = newCurrent.directories.get_mut(dir).unwrap();
  48.             }
  49.             current = newCurrent;
  50.         }
  51.         else if l.starts_with("cd ") {
  52.             let (_, dirName) = l.trim().split_at(3);
  53.  
  54.             current = if current.directories.contains_key(dirName) {
  55.                 current.directories.get_mut(dirName).unwrap()
  56.             }
  57.                 else {
  58.                     let mut newPath = current.path.clone();
  59.                     newPath.push(current.name);
  60.                     current.directories.insert(dirName, directory {
  61.                         name: dirName,
  62.                         directories: Default::default(),
  63.                         files: vec![],
  64.                         path: newPath
  65.                     });
  66.                     current.directories.get_mut(dirName).unwrap()
  67.                 }
  68.  
  69.         }
  70.     }
  71.     //Find sizes
  72.     let mut sizeMap: HashMap<String, usize> = Default::default();
  73.     struct GetSize<'s> { f: &'s dyn Fn(&GetSize, directory, String, &mut HashMap<String, usize>) -> usize }
  74.     let getSize = GetSize {
  75.         f:& |getSize:&GetSize, dir: directory, fullName: String, map:&mut HashMap<String, usize>| {
  76.             if map.contains_key(&*fullName) {
  77.                 map.get(&*fullName).unwrap().to_owned()
  78.             }
  79.             else {
  80.                 let mut currSize = dir.files.iter().map(|x| x.size).sum::<usize>();
  81.                 for directory in dir.directories {
  82.                     currSize += (getSize.f)(getSize, directory.1, (fullName.to_owned() + "/" + directory.0), map);
  83.                 }
  84.                 map.insert(fullName, currSize);
  85.                 currSize
  86.             }
  87.         }
  88.     };
  89.  
  90.     (getSize.f)(&getSize, root, "".to_string(), &mut sizeMap);
  91.     sizeMap
  92. }
  93.  
  94.  
  95. pub fn day7_1(){
  96.     let sizeMap = getSizeMap();
  97.     let mut total = 0;
  98.     for (_, size) in sizeMap {
  99.         if size <= 100000
  100.         {
  101.             total += size;
  102.         }
  103.     }
  104.     println!("ANS: {}",  total);
  105. }
  106.  
  107. pub fn day7_2(){
  108.     let sizeMap = getSizeMap();
  109.     let freeSize = 70000000 - sizeMap[""];
  110.     let neededFreed = 30000000 - freeSize;
  111.     let mut smallest = usize::MAX;
  112.     for (_, size) in sizeMap {
  113.         if size >= neededFreed && size < smallest
  114.         {
  115.             smallest = size;
  116.         }
  117.     }
  118.     println!("ANS: {}",  smallest);
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement