solved 19
This commit is contained in:
		
							
								
								
									
										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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user