This commit is contained in:
rorikstr 2025-05-16 19:00:06 +03:00
parent 3220b697d1
commit 3ca9867a11

View file

@ -1,20 +1,33 @@
use std::cmp::Ordering::{Less, Equal, Greater};
#[derive(Debug)] #[derive(Debug)]
pub struct Clock { pub struct Clock {
pub hours: i32, pub hours: i32,
pub minutes: i32, pub minutes: i32,
} }
/*
-2, -40 => 21, 20 ()
-47, -20 => { -20 => -48, 40 } (-47/24 => -1; -1*24 + 47 = 23; -20)
*/
impl Clock { impl Clock {
pub fn new(hours: i32, minutes: i32) -> Self { pub fn new(hours: i32, minutes: i32) -> Self {
let hours_diff = minutes / 60; let total_minutes = hours * 60 + minutes;
let hours = hours + hours_diff; let mut total_minutes = total_minutes % 1440;
let minutes = minutes - 60*hours_diff;
let hours_diff = hours / 24_i32; total_minutes = match total_minutes.cmp(&0) {
let hours = hours - 24 * hours_diff; Less => total_minutes + 1440,
Equal | Greater => total_minutes,
};
let hours = total_minutes / 60;
let minutes = total_minutes % 60;
Clock { hours, minutes } Clock { hours, minutes }
} }
/* /*
40 => 0 (0*60 + 40 - 60*0) 40 => 0 (0*60 + 40 - 60*0)
60 => 1 (1*60 + 60 - 60*1) 60 => 1 (1*60 + 60 - 60*1)
90 => 1 (1*60 + 90 - 60*1) 90 => 1 (1*60 + 90 - 60*1)
@ -23,26 +36,19 @@ impl Clock {
23 => 23 (23 - 24 * 0) 23 => 23 (23 - 24 * 0)
26 => 2 (hours - 24 * hours_diff) 26 => 2 (hours - 24 * hours_diff)
49 => 1 (hours - 24 * hours_diff) 49 => 1 (hours - 24 * hours_diff)
*/ */
pub fn add_minutes(&self, minutes: i32) -> Self { pub fn add_minutes(&self, minutes: i32) -> Self {
let hours_diff: i32 = ((self.minutes + minutes) as i32) / 60_i32; Clock::new(self.hours, self.minutes + minutes)
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 }
} }
pub fn to_string(&self) -> String { pub fn to_string(&self) -> String {
let hours = match self.hours.cmp(&10) { let hours = match self.hours.cmp(&10) {
std::cmp::Ordering::Less => format!("0{}",self.hours), Less => format!("0{}",self.hours),
std::cmp::Ordering::Equal => format!("{}", self.hours), Equal | Greater => format!("{}", self.hours),
std::cmp::Ordering::Greater => format!("{}", self.hours),
}; };
let minutes = match self.minutes.cmp(&10) { let minutes = match self.minutes.cmp(&10) {
std::cmp::Ordering::Less => format!("0{}",self.minutes), Less => format!("0{}",self.minutes),
std::cmp::Ordering::Equal => format!("{}", self.minutes), Equal | Greater => format!("{}", self.minutes),
std::cmp::Ordering::Greater => format!("{}", self.minutes),
}; };
format!("{}:{}", hours, minutes) format!("{}:{}", hours, minutes)
} }
@ -52,15 +58,13 @@ impl Clock {
impl PartialEq for Clock { impl PartialEq for Clock {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
match self.hours.cmp(&other.hours) { match self.hours.cmp(&other.hours) {
std::cmp::Ordering::Less => false, Less | Greater => false,
std::cmp::Ordering::Equal => { Equal => {
match self.minutes.cmp(&other.minutes) { match self.minutes.cmp(&other.minutes) {
std::cmp::Ordering::Less => false, Less | Greater => false,
std::cmp::Ordering::Equal => true, Equal => true,
std::cmp::Ordering::Greater => false,
} }
}, },
std::cmp::Ordering::Greater => false,
} }
} }
} }