// Copyright 2022 Christian Ulrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // usage: ./part2 < input pub mod common; use common::{FileSystem, Node}; const DISK_SIZE: usize = 70000000; const SPACE_REQUIRED: usize = 30000000; fn main() -> Result<(), &'static str> { let fs = FileSystem::from_stdin()?; let total_size = fs.root().size(); let free_space = DISK_SIZE - total_size; if free_space >= SPACE_REQUIRED { return Err("Sufficient free space, nothing to be done!"); } // we need to find a directory of at least this size let min_directory_size = SPACE_REQUIRED - free_space; let mut result = total_size; for node in fs.root().walk() { if let Node::Directory { name: _, children: _, } = node { let size = node.size(); if size >= min_directory_size && size < result { result = size; } } } println!("{result}"); Ok(()) }