File size: 1,877 Bytes
9438a57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""Toplantı odası rezervasyonu: çakışma denetimi ve boş aralıklar (gün içi dakika cinsinden)."""


class BookingError(Exception):
    pass


class Room:
    def __init__(self, name, open_at=9 * 60, close_at=18 * 60):
        if open_at >= close_at:
            raise BookingError("açılış kapanıştan önce olmalı")
        self.name = name
        self.open_at = open_at
        self.close_at = close_at
        self.bookings = []  # (start, end, owner), başlangıca göre sıralı

    def is_free(self, start, end):
        """[start, end) aralığı boş mu? Uç uca eklenen toplantılar çakışmaz."""
        return all(end <= s or start >= e for s, e, _ in self.bookings)

    def book(self, start, end, owner):
        if start >= end:
            raise BookingError("bitiş başlangıçtan sonra olmalı")
        if start < self.open_at or end > self.close_at:
            raise BookingError("çalışma saatleri dışında")
        if not self.is_free(start, end):
            raise BookingError("çakışan rezervasyon")
        self.bookings.append((start, end, owner))
        self.bookings.sort()
        return len(self.bookings)

    def cancel(self, owner):
        """Sahibin tüm rezervasyonlarını siler; silinen sayısını döndürür."""
        before = len(self.bookings)
        self.bookings = [b for b in self.bookings if b[2] != owner]
        return before - len(self.bookings)

    def free_slots(self, min_length=30):
        """Çalışma saatleri içindeki, en az min_length dakikalık boş aralıklar."""
        slots, cursor = [], self.open_at
        for s, e, _ in self.bookings:
            if s - cursor >= min_length:
                slots.append((cursor, s))
            cursor = max(cursor, e)
        if self.close_at - cursor >= min_length:
            slots.append((cursor, self.close_at))
        return slots