From 3ca9867a11afd3411066d7f35008d3c223cbd8c1 Mon Sep 17 00:00:00 2001 From: rorikstr Date: Fri, 16 May 2025 19:00:06 +0300 Subject: [PATCH] done --- rust/clock/src/lib.rs | 54 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/rust/clock/src/lib.rs b/rust/clock/src/lib.rs index 3d17683..338e387 100644 --- a/rust/clock/src/lib.rs +++ b/rust/clock/src/lib.rs @@ -1,20 +1,33 @@ +use std::cmp::Ordering::{Less, Equal, Greater}; + #[derive(Debug)] pub struct Clock { pub hours: i32, pub minutes: i32, } +/* + -2, -40 => 21, 20 () + -47, -20 => { -20 => -48, 40 } (-47/24 => -1; -1*24 + 47 = 23; -20) +*/ + impl Clock { pub fn new(hours: i32, minutes: i32) -> Self { - let hours_diff = minutes / 60; - let hours = hours + hours_diff; - let minutes = minutes - 60*hours_diff; - let hours_diff = hours / 24_i32; - let hours = hours - 24 * hours_diff; + let total_minutes = hours * 60 + minutes; + let mut total_minutes = total_minutes % 1440; + + total_minutes = match total_minutes.cmp(&0) { + Less => total_minutes + 1440, + Equal | Greater => total_minutes, + }; + + let hours = total_minutes / 60; + let minutes = total_minutes % 60; + Clock { hours, minutes } } - /* +/* 40 => 0 (0*60 + 40 - 60*0) 60 => 1 (1*60 + 60 - 60*1) 90 => 1 (1*60 + 90 - 60*1) @@ -23,26 +36,19 @@ impl Clock { 23 => 23 (23 - 24 * 0) 26 => 2 (hours - 24 * hours_diff) 49 => 1 (hours - 24 * hours_diff) - */ +*/ pub fn add_minutes(&self, minutes: i32) -> Self { - let hours_diff: i32 = ((self.minutes + minutes) as i32) / 60_i32; - let hours = self.hours + hours_diff; - let minutes = self.minutes + minutes - 60*hours_diff; - let hours_diff = hours / 24_i32; - let hours = hours - 24 * hours_diff; - Clock { hours, minutes } + Clock::new(self.hours, self.minutes + minutes) } pub fn to_string(&self) -> String { let hours = match self.hours.cmp(&10) { - std::cmp::Ordering::Less => format!("0{}",self.hours), - std::cmp::Ordering::Equal => format!("{}", self.hours), - std::cmp::Ordering::Greater => format!("{}", self.hours), + Less => format!("0{}",self.hours), + Equal | Greater => format!("{}", self.hours), }; let minutes = match self.minutes.cmp(&10) { - std::cmp::Ordering::Less => format!("0{}",self.minutes), - std::cmp::Ordering::Equal => format!("{}", self.minutes), - std::cmp::Ordering::Greater => format!("{}", self.minutes), + Less => format!("0{}",self.minutes), + Equal | Greater => format!("{}", self.minutes), }; format!("{}:{}", hours, minutes) } @@ -52,15 +58,13 @@ impl Clock { impl PartialEq for Clock { fn eq(&self, other: &Self) -> bool { match self.hours.cmp(&other.hours) { - std::cmp::Ordering::Less => false, - std::cmp::Ordering::Equal => { + Less | Greater => false, + Equal => { match self.minutes.cmp(&other.minutes) { - std::cmp::Ordering::Less => false, - std::cmp::Ordering::Equal => true, - std::cmp::Ordering::Greater => false, + Less | Greater => false, + Equal => true, } }, - std::cmp::Ordering::Greater => false, } } }