From 528d2350aa5fb55ed4cd44898ef7b92bdaba9bbc Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 27 Sep 2024 21:38:00 +0200 Subject: [PATCH] =?UTF-8?q?cs:=20add=20=C2=AB729.=20My=20Calendar=20I?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- cs/my-calendar-i.cs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 cs/my-calendar-i.cs diff --git a/cs/my-calendar-i.cs b/cs/my-calendar-i.cs new file mode 100644 index 0000000..ad48b2c --- /dev/null +++ b/cs/my-calendar-i.cs @@ -0,0 +1,41 @@ +public class MyCalendar { + private record Meeting(int Start, int End) { + public bool Has(int x) => x > Start && x < End; + + public static bool operator <(Meeting a, Meeting b) => a.Start < b.Start; + public static bool operator >(Meeting a, Meeting b) => a.Start > b.Start; + } + + private static bool Overlaps(Meeting a, Meeting b) + => a == b || a.Has(b.Start) || a.Has(b.End) || b.Has(a.Start) || b.Has(a.End); + + private List meetings = []; + + public MyCalendar() { } + + public bool Book(int start, int end) { + meetings.Add(new Meeting(start, end)); + + var it = meetings.Count - 1; + + for ( + int i = meetings.Count - 1; + i > 0 && meetings[i - 1] > meetings[i]; + --i, --it + ) { + if (Overlaps(meetings[i], meetings[i - 1])) { + meetings.RemoveAt(it); + return false; + } + + (meetings[i], meetings[i - 1]) = (meetings[i - 1], meetings[i]); + } + + if (it > 0 && Overlaps(meetings[it], meetings[it - 1])) { + meetings.RemoveAt(it); + return false; + } + + return true; + } +}