solved 19

This commit is contained in:
Fabian Schmidt 2024-09-16 12:42:55 +02:00
parent 8fb00273ca
commit 0222de086d

81
src/bin/problem_19.rs Normal file
View File

@ -0,0 +1,81 @@
use std::cmp::PartialEq;
fn main() {
let mut sum_sundays = 0;
let mut first_day = Day::Monday;
for month in 0..12 {
let last_day = get_last_day(1900, month, first_day);
first_day = last_day.next();
}
for year in 1901..2001 {
for month in 0..12 {
let last_day = get_last_day(year, month, first_day);
first_day = last_day.next();
if first_day == Day::Sunday {
sum_sundays += 1;
}
}
}
println!("{sum_sundays}");
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
enum Day {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
}
impl Day {
fn next(self) -> Day {
match self {
Day::Monday => Day::Tuesday,
Day::Tuesday => Day::Wednesday,
Day::Wednesday => Day::Thursday,
Day::Thursday => Day::Friday,
Day::Friday => Day::Saturday,
Day::Saturday => Day::Sunday,
Day::Sunday => Day::Monday,
}
}
fn day_num_in_week(self) -> usize {
match self {
Day::Monday => 0,
Day::Tuesday => 1,
Day::Wednesday => 2,
Day::Thursday => 3,
Day::Friday => 4,
Day::Saturday => 5,
Day::Sunday => 6,
}
}
fn from_day_num(num: usize) -> Day {
match num {
0 => Day::Monday,
1 => Day::Tuesday,
2 => Day::Wednesday,
3 => Day::Thursday,
4 => Day::Friday,
5 => Day::Saturday,
6 => Day::Sunday,
_ => panic!("day_num cannot be higher than 6 (counting days in week from 0)"),
}
}
}
fn is_leap_year(year: usize) -> bool {
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
}
fn get_last_day(year: usize, month: usize, first_day: Day) -> Day {
let days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let day_num = first_day.day_num_in_week();
let days_in_month = if month == 1 && is_leap_year(year) { 29 } else { days_per_month[month] } + day_num;
Day::from_day_num((days_in_month - 1) % 7)
}