DEV Community

Discussion on: Daily Challenge #252 - Everybody hates Mondays

Collapse
pmkroeker profile image
Peter

Rust, likely a better way to do this.

use std::convert::TryInto;
use chrono::prelude::*; // 0.4.11

pub struct Mondays {}

impl Mondays {
    pub fn count(birth: chrono::NaiveDate, curr_date: chrono::NaiveDate) -> i64 {
        // start work at age 22
        let start_work = birth + chrono::Duration::days(22 * 365);
        // retire at age 78
        let retire = birth + chrono::Duration::days(78 * 365);
        // check if they have retired or not
        let end_work = if curr_date > retire { retire } else { curr_date };
        // check days from monday, if 0 set to 7
        let start_from_monday = match start_work.weekday().num_days_from_monday() {
            0 => 7,
            x => x,
        };
        // get first monday
        let first_monday = start_work + chrono::Duration::days((7 - start_from_monday).try_into().unwrap());
        // get last monday
        let last_monday = end_work - chrono::Duration::days((end_work.weekday().num_days_from_monday()).try_into().unwrap());
        // count days between mondays
        let between_mondays = last_monday.signed_duration_since(first_monday).num_days();
        // if more than 7 days, div by 7
        if between_mondays > 7 {
            between_mondays / 7
        } else if between_mondays >= 0 {
           1 
        } else {
            0
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_1() {
        assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 3), chrono::NaiveDate::from_ymd(2017, 4, 3)), 1);
    }
    #[test]
    fn test_2() {
        assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 2), chrono::NaiveDate::from_ymd(2018, 4, 2)), 53);
    }
    #[test]
    fn test_3() {
        assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 2), chrono::NaiveDate::from_ymd(2017, 3, 2)), 0);
    }
}

Rust Playground
GitHub Gist