"""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