SevdanurGenc's picture
Upload 300 files
9438a57 verified
Raw History Blame Contribute Delete
1.88 kB
"""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