Wrote program for Day 63
This commit is contained in:
parent
09dccbbc8a
commit
72ad5ee38a
@ -109,7 +109,7 @@ We encourage you to share your progress and ask questions in the Discussions sec
|
||||
| Day #60 | [A Game Of Threes](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-09/Day-60_A-Game-Of-Thrones) | :white_check_mark: |
|
||||
| Day #61 | [Write A Web Crawler](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-09/Day-61_Write-A-Web-Crawler) | :white_check_mark: |
|
||||
| Day #62 | [Funny Plant](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-09/Day-62_Funny-Plant) | :white_check_mark: |
|
||||
| Day #63 | [The Rabbit Problem](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-09/Day-63_The-Rabbit-Problem) | :white_large_square: |
|
||||
| Day #63 | [The Rabbit Problem](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-09/Day-63_The-Rabbit-Problem) | :white_check_mark: |
|
||||
| Day #64 | [First Recurring Character](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-10/Day-64_First-Recurring-Character) | :white_large_square: |
|
||||
| Day #65 | [ISBN Validator](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-10/Day-65_ISBN-Validator) | :white_large_square: |
|
||||
| Day #66 | [ISBN Generator](https://github.com/LiveGray/100-Days-Of-Rust/tree/main/Week-10/Day-66_ISBN-Generator) | :white_large_square: |
|
||||
|
6
Week-09/Day-63_The-Rabbit-Problem/day63/Cargo.toml
Normal file
6
Week-09/Day-63_The-Rabbit-Problem/day63/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day63"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
47
Week-09/Day-63_The-Rabbit-Problem/day63/src/lib.rs
Normal file
47
Week-09/Day-63_The-Rabbit-Problem/day63/src/lib.rs
Normal file
@ -0,0 +1,47 @@
|
||||
pub fn rabbit_problem(male: usize, female: usize, needed: usize) -> Result<(usize, usize), String> {
|
||||
if female == 0 {
|
||||
return Err("The number of initial female rabbits must be positive".to_owned());
|
||||
}
|
||||
let mut females = [0usize; 97];
|
||||
let mut males = [0usize; 97];
|
||||
let mut count = male + female;
|
||||
let mut months = 1;
|
||||
let mut deaths = 0;
|
||||
females[3] = female;
|
||||
males[3] = male;
|
||||
while count < needed {
|
||||
let mut males_newborns = 0;
|
||||
let mut females_newborns = 0;
|
||||
let mut current_month_deaths = 0;
|
||||
|
||||
for i in (0..97).rev() {
|
||||
if i >= 4 {
|
||||
males_newborns += 5 * females[i];
|
||||
females_newborns += 9 * females[i];
|
||||
}
|
||||
if i == 96 {
|
||||
current_month_deaths = males[i] + females[i];
|
||||
males[i] = 0;
|
||||
females[i] = 0;
|
||||
continue;
|
||||
}
|
||||
males[i + 1] = males[i];
|
||||
females[i + 1] = females[i];
|
||||
}
|
||||
|
||||
count = match count.checked_add(
|
||||
match males_newborns.checked_add(females_newborns - current_month_deaths) {
|
||||
Some(x) => x,
|
||||
None => needed,
|
||||
},
|
||||
) {
|
||||
Some(x) => x,
|
||||
None => needed,
|
||||
};
|
||||
deaths += current_month_deaths;
|
||||
females[0] = females_newborns;
|
||||
males[0] = males_newborns;
|
||||
months += 1;
|
||||
}
|
||||
Ok((months, deaths))
|
||||
}
|
56
Week-09/Day-63_The-Rabbit-Problem/day63/src/main.rs
Normal file
56
Week-09/Day-63_The-Rabbit-Problem/day63/src/main.rs
Normal file
@ -0,0 +1,56 @@
|
||||
use std::{
|
||||
io::{self, Write},
|
||||
num::ParseIntError,
|
||||
process::exit,
|
||||
};
|
||||
|
||||
use day63::rabbit_problem;
|
||||
|
||||
fn read_usize() -> Result<usize, ParseIntError> {
|
||||
let mut buffer = String::new();
|
||||
io::stdin().read_line(&mut buffer).unwrap();
|
||||
buffer.trim().parse()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
print!("Enter the number of male rabbits: ");
|
||||
io::stdout().flush().unwrap();
|
||||
let male = match read_usize() {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
eprintln!("{e}");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
print!("Enter the number of female rabbits: ");
|
||||
io::stdout().flush().unwrap();
|
||||
let female = match read_usize() {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
eprintln!("{e}");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
print!("Enter the needed number of rabbits: ");
|
||||
io::stdout().flush().unwrap();
|
||||
let needed = match read_usize() {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
eprintln!("{e}");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
let (months, dead) = match rabbit_problem(male, female, needed) {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
eprintln!("{e}");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
println!(
|
||||
"After {months} months the rabbits dominated the world, during which {dead} rabbits died"
|
||||
);
|
||||
}
|
14
Week-09/Day-63_The-Rabbit-Problem/day63/tests/examples.rs
Normal file
14
Week-09/Day-63_The-Rabbit-Problem/day63/tests/examples.rs
Normal file
@ -0,0 +1,14 @@
|
||||
#[cfg(test)]
|
||||
mod examples {
|
||||
use day63::rabbit_problem;
|
||||
|
||||
#[test]
|
||||
fn example1() {
|
||||
assert_eq!(rabbit_problem(2, 4, 1000000000).unwrap().0, 32)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example2() {
|
||||
assert_eq!(rabbit_problem(2, 4, 15000000000).unwrap().0, 36)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user