"""Kiểm tra lịch trong một ngày của một giảng viên. Thời gian tính bằng phút kể từ 00:00. Khoảng dạy là [bat_dau, ket_thuc). """ from dataclasses import dataclass @dataclass(frozen=True) class CaDay: ma: str bat_dau: int ket_thuc: int co_so: str DI_CHUYEN = {("A", "B"): 20, ("B", "A"): 25} def danh_gia(cac_ca): loi = [] luot_chuyen = 0 lich = sorted(cac_ca, key=lambda ca: (ca.bat_dau, ca.ket_thuc, ca.ma)) for ca in lich: if not 0 <= ca.bat_dau < ca.ket_thuc <= 1440 or ca.co_so not in {"A", "B"}: raise ValueError(f"Dữ liệu đầu vào không hợp lệ: {ca.ma}") for truoc, sau in zip(lich, lich[1:]): khoang_trong = sau.bat_dau - truoc.ket_thuc if khoang_trong < 0: loi.append(f"H01 {truoc.ma}/{sau.ma}: ca dạy chồng nhau") continue if truoc.co_so != sau.co_so: toi_thieu = DI_CHUYEN[truoc.co_so, sau.co_so] luot_chuyen += 1 if khoang_trong < toi_thieu: loi.append(f"H02 {truoc.ma}/{sau.ma}: thiếu {toi_thieu - khoang_trong} phút") # S01 tính theo lượt chuyển cơ sở giữa hai ca dạy liên tiếp. return loi, None if loi else 3 * luot_chuyen if __name__ == "__main__": tiet_1 = CaDay("CTDL", 480, 540, "A") for gap in (19, 20, 21): tiet_2 = CaDay("KTPM", 540 + gap, 600 + gap, "B") print(gap, "phút:", danh_gia([tiet_1, tiet_2])) assert danh_gia([tiet_1, CaDay("KTPM", 560, 620, "B")]) == ([], 3) assert danh_gia([tiet_1, CaDay("KTPM", 540, 600, "A")]) == ([], 0) assert danh_gia([tiet_1, CaDay("KTPM", 539, 600, "A")])[1] is None assert danh_gia([tiet_1, CaDay("KTPM", 559, 620, "B")])[1] is None assert danh_gia([CaDay("KTPM", 480, 540, "B"), CaDay("CTDL", 560, 620, "A")])[1] is None