From 24a619b9e8eb2d92944e9e116edbe0a027e42eba Mon Sep 17 00:00:00 2001 From: Mariano Riefolo Date: Wed, 7 Aug 2024 14:11:20 +0200 Subject: [PATCH] Wrote program for Day 13 --- README.md | 2 +- .../day13/Cargo.toml | 6 +++ .../day13/src/lib.rs | 28 +++++++++++++ .../day13/src/main.rs | 41 +++++++++++++++++++ .../day13/tests/examples.rs | 11 +++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 Week-02/Day-13_Need-Help-With-Packing/day13/Cargo.toml create mode 100644 Week-02/Day-13_Need-Help-With-Packing/day13/src/lib.rs create mode 100644 Week-02/Day-13_Need-Help-With-Packing/day13/src/main.rs create mode 100644 Week-02/Day-13_Need-Help-With-Packing/day13/tests/examples.rs diff --git a/README.md b/README.md index 0caab63..176ae6e 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ We encourage you to share your progress and ask questions in the Discussions sec | Day #10 | [Unique Binary Search Tree](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-10_Unique-Binary-Search-Trees) | :white_check_mark: | | Day #11 | [Restore IP Addresses](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-11_Restore-IP-Addresses) | :white_check_mark: | | Day #12 | [Mountains or Valleys](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-12_Mountains_And_Valleys) | :white_check_mark: | -| Day #13 | [Need Help With Your Packing](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-13_Need-Help-With-Packing) | :white_large_square: | +| Day #13 | [Need Help With Your Packing](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-13_Need-Help-With-Packing) | :white_check_mark: | | Day #14 | [The Karacas Encryption Algorithm](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-02/Day-14_Karacas-Encryption-Algorithm) | :white_large_square: | | Day #15 | [Valid Anagram](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-15_Valid-Anagram) | :white_large_square: | | Day #16 | [Nim Game](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-03/Day-16_Nim-Game) | :white_large_square: | diff --git a/Week-02/Day-13_Need-Help-With-Packing/day13/Cargo.toml b/Week-02/Day-13_Need-Help-With-Packing/day13/Cargo.toml new file mode 100644 index 0000000..adb45f4 --- /dev/null +++ b/Week-02/Day-13_Need-Help-With-Packing/day13/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day13" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/Week-02/Day-13_Need-Help-With-Packing/day13/src/lib.rs b/Week-02/Day-13_Need-Help-With-Packing/day13/src/lib.rs new file mode 100644 index 0000000..b9c5d25 --- /dev/null +++ b/Week-02/Day-13_Need-Help-With-Packing/day13/src/lib.rs @@ -0,0 +1,28 @@ +use std::collections::VecDeque; + +pub fn can_fit(weights: &[usize], bags: usize) -> bool { + bags >= min_bags(&mut VecDeque::from(weights.to_vec()), 0) +} + +fn min_bags(weights: &mut VecDeque, current_weight: usize) -> usize { + if weights.is_empty() { + return if current_weight > 0 { 1 } else { 0 }; + } + + let mut min = usize::MAX; + + for _ in 0..weights.len() { + let w = match weights.pop_front() { + Some(x) => x, + None => panic!("At the disco"), + }; + if current_weight + w > 10 { + min = std::cmp::min(min, min_bags(weights, w)) + 1; + } else { + min = std::cmp::min(min, min_bags(weights, current_weight + w)); + } + weights.push_back(w); + } + + min +} diff --git a/Week-02/Day-13_Need-Help-With-Packing/day13/src/main.rs b/Week-02/Day-13_Need-Help-With-Packing/day13/src/main.rs new file mode 100644 index 0000000..33f2cd7 --- /dev/null +++ b/Week-02/Day-13_Need-Help-With-Packing/day13/src/main.rs @@ -0,0 +1,41 @@ +use std::io::{self, Write}; + +use day13::can_fit; + +fn main() { + let mut buffer = String::new(); + + print!("Insert the weights separated by spaces: "); + io::stdout().flush().expect("Failed to flush stdout."); + + io::stdin() + .read_line(&mut buffer) + .expect("Failed to read from stdin."); + + let weights: Vec = buffer + .trim() + .split(' ') + .filter(|x| !x.is_empty()) + .map(|x| { + x.parse() + .expect("Only whole numbers and spaces are allowed.") + }) + .collect(); + + buffer = String::new(); + + print!("Insert how many bags are available: "); + io::stdout().flush().expect("Failed to flush stdout."); + + io::stdin() + .read_line(&mut buffer) + .expect("Failed to read from stdin."); + + let bags = buffer.trim().parse().expect("Integer expected."); + + if can_fit(&weights, bags) { + println!("There are enough bags."); + } else { + println!("more bags are needed."); + } +} diff --git a/Week-02/Day-13_Need-Help-With-Packing/day13/tests/examples.rs b/Week-02/Day-13_Need-Help-With-Packing/day13/tests/examples.rs new file mode 100644 index 0000000..ca7f385 --- /dev/null +++ b/Week-02/Day-13_Need-Help-With-Packing/day13/tests/examples.rs @@ -0,0 +1,11 @@ +use day13::can_fit; + +#[test] +fn example1() { + assert!(can_fit(&[2, 1, 2, 5, 4, 3, 6, 1, 1, 9, 3, 2], 4)); +} + +#[test] +fn example2() { + assert!(!can_fit(&[2, 7, 1, 3, 3, 4, 7, 4, 1, 8, 2], 4)) +}