solved 19
This commit is contained in:
parent
8fb00273ca
commit
0222de086d
81
src/bin/problem_19.rs
Normal file
81
src/bin/problem_19.rs
Normal 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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user