breakfast='''7
APPOINT 1 120 30 2 andrey alex
APPOINT 1 130 30 2 alex sergey
APPOINT 1 10 60 2 alex andrey
PRINT 1 alex
PRINT 1 andrey
PRINT 1 sergey
PRINT 2 alex'''
meet.whatisthere(breakfast)
class whatisthere:#Класс проверяет список запросов и обращается к нужным функциям
def __init__(self, requestlist):
meetl = meetlist
for line in requestlist:
pareq=line.split()
if pareq[0]=="APPOINT":
date = int(pareq[1])
time = int(pareq[2])
duration = int(pareq[3])
pnumber = int(pareq[4])
plist = pareq[5:]
meetn = meet(date, time, duration, pnumber, plist)
meetl.addmit(self, meetn)
elif pareq[0]=="PRINT":
meetl.printmeet(int(pareq[1]), pareq[2])
class meet:#Класс встречи. Сохраняет параметры
def __init__(self,date,time,duration,pnumber,peoplelist):
meet.date = date
meet.time=time
meet.duration=duration
meet.pnumber=pnumber
meet.peoplelist=peoplelist
def check(self,human): # Если на встрече будет этот человек - то выдать инфу о встрече
if not human in meet.peoplelist:
return ""
else:
prnt=str(meet.time)+' '+str(meet.date)
for person in meet.peoplelist:
prnt+=' '+person
return prnt
class meetlist:#Класс списка встреч. Проверяет и добавляет новую встречу в список.
def __init__(self):#Создание списка встреч в объекте
meetlist.meets=[]
def addmit(self,meet):#Сравнение добавляемой встречи со списком.
print (meetlist.meets)
print (meet)
if not meetlist.meets:
meetlist.meets.append(meet)
return("OK")
for mrel in self.meets:
if meet.date==mrel.date: #Сравниваем даты
if meetlist.comparetime(meet, mrel): #Сравниваем время
listdiff = meetlist.comparepeople(meet,mrel)#Сравниваем людей
if listdiff.count()==0:
meetlist.meets.append(meet)
return("OK")
else:
otp="FAIL "
for p in listdiff:
otp+=' '+p
return otp
def comparetime(self, meet1, meet2): #Сравнение двух встреч по времени. Если пересечение - True
if (meet1.time<meet2.time and meet1.time + meet1.duration>meet2.time):
return True
if (meet2.time<meet1.time and meet2.time + meet2.duration>meet1.time):
return True
return True
def comparepeople(self,meet1,meet2): #Сравнение по людям. Если пересечение - то список.
crosslist=[]
for person in meet1.peoplelist:
for human in meet2.peoplelist:
if person==human:
crosslist.append(human)
return crosslist #Возвращаем пересечение двух списков
def printmeet(self, date, human): #печать информации о встрече
for meet in meetlist.meets():
if (meet.date==date):
meetcheck = meet.check(human)
if meetcheck!='':
print(meetcheck)
YnJlYWtmYXN0PScnJzcKQVBQT0lOVCAxIDEyMCAzMCAyIGFuZHJleSBhbGV4CkFQUE9JTlQgMSAxMzAgMzAgMiBhbGV4IHNlcmdleQpBUFBPSU5UIDEgMTAgNjAgMiBhbGV4IGFuZHJleQpQUklOVCAxIGFsZXgKUFJJTlQgMSBhbmRyZXkKUFJJTlQgMSBzZXJnZXkKUFJJTlQgMiBhbGV4JycnCm1lZXQud2hhdGlzdGhlcmUoYnJlYWtmYXN0KQpjbGFzcyB3aGF0aXN0aGVyZToj0JrQu9Cw0YHRgSDQv9GA0L7QstC10YDRj9C10YIg0YHQv9C40YHQvtC6INC30LDQv9GA0L7RgdC+0LIg0Lgg0L7QsdGA0LDRidCw0LXRgtGB0Y8g0Log0L3Rg9C20L3Ri9C8INGE0YPQvdC60YbQuNGP0LwKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0bGlzdCk6CiAgICAgICAgbWVldGwgPSAgbWVldGxpc3QKICAgICAgICBmb3IgbGluZSBpbiByZXF1ZXN0bGlzdDoKICAgICAgICAgICAgcGFyZXE9bGluZS5zcGxpdCgpCiAgICAgICAgICAgIGlmIHBhcmVxWzBdPT0iQVBQT0lOVCI6CgogICAgICAgICAgICAgICAgZGF0ZSA9IGludChwYXJlcVsxXSkKICAgICAgICAgICAgICAgIHRpbWUgPSBpbnQocGFyZXFbMl0pCiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGludChwYXJlcVszXSkKICAgICAgICAgICAgICAgIHBudW1iZXIgPSBpbnQocGFyZXFbNF0pCiAgICAgICAgICAgICAgICBwbGlzdCA9IHBhcmVxWzU6XQogICAgICAgICAgICAgICAgbWVldG4gPSBtZWV0KGRhdGUsIHRpbWUsIGR1cmF0aW9uLCBwbnVtYmVyLCBwbGlzdCkKCiAgICAgICAgICAgICAgICBtZWV0bC5hZGRtaXQoc2VsZiwgbWVldG4pCiAgICAgICAgICAgIGVsaWYgcGFyZXFbMF09PSJQUklOVCI6CiAgICAgICAgICAgICAgICAgICAgbWVldGwucHJpbnRtZWV0KGludChwYXJlcVsxXSksIHBhcmVxWzJdKQoKCmNsYXNzIG1lZXQ6I9Ca0LvQsNGB0YEg0LLRgdGC0YDQtdGH0LguINCh0L7RhdGA0LDQvdGP0LXRgiDQv9Cw0YDQsNC80LXRgtGA0YsKICAgIGRlZiBfX2luaXRfXyhzZWxmLGRhdGUsdGltZSxkdXJhdGlvbixwbnVtYmVyLHBlb3BsZWxpc3QpOgogICAgICAgIG1lZXQuZGF0ZSA9IGRhdGUKICAgICAgICBtZWV0LnRpbWU9dGltZQogICAgICAgIG1lZXQuZHVyYXRpb249ZHVyYXRpb24KICAgICAgICBtZWV0LnBudW1iZXI9cG51bWJlcgogICAgICAgIG1lZXQucGVvcGxlbGlzdD1wZW9wbGVsaXN0CgogICAgZGVmIGNoZWNrKHNlbGYsaHVtYW4pOiAjINCV0YHQu9C4INC90LAg0LLRgdGC0YDQtdGH0LUg0LHRg9C00LXRgiDRjdGC0L7RgiDRh9C10LvQvtCy0LXQuiAtINGC0L4g0LLRi9C00LDRgtGMINC40L3RhNGDINC+INCy0YHRgtGA0LXRh9C1CiAgICAgICAgaWYgbm90IGh1bWFuIGluIG1lZXQucGVvcGxlbGlzdDoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJudD1zdHIobWVldC50aW1lKSsnICcrc3RyKG1lZXQuZGF0ZSkKICAgICAgICAgICAgZm9yIHBlcnNvbiBpbiBtZWV0LnBlb3BsZWxpc3Q6CiAgICAgICAgICAgICAgICBwcm50Kz0nICcrcGVyc29uCiAgICAgICAgICAgIHJldHVybiBwcm50CgoKCmNsYXNzIG1lZXRsaXN0OiPQmtC70LDRgdGBINGB0L/QuNGB0LrQsCDQstGB0YLRgNC10YcuINCf0YDQvtCy0LXRgNGP0LXRgiDQuCDQtNC+0LHQsNCy0LvRj9C10YIg0L3QvtCy0YPRjiDQstGB0YLRgNC10YfRgyDQsiDRgdC/0LjRgdC+0LouCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOiPQodC+0LfQtNCw0L3QuNC1INGB0L/QuNGB0LrQsCDQstGB0YLRgNC10Ycg0LIg0L7QsdGK0LXQutGC0LUKICAgICAgICBtZWV0bGlzdC5tZWV0cz1bXQoKICAgIGRlZiBhZGRtaXQoc2VsZixtZWV0KToj0KHRgNCw0LLQvdC10L3QuNC1INC00L7QsdCw0LLQu9GP0LXQvNC+0Lkg0LLRgdGC0YDQtdGH0Lgg0YHQviDRgdC/0LjRgdC60L7QvC4KICAgICAgICBwcmludCAobWVldGxpc3QubWVldHMpCiAgICAgICAgcHJpbnQgKG1lZXQpCiAgICAgICAgaWYgbm90IG1lZXRsaXN0Lm1lZXRzOgogICAgICAgICAgICBtZWV0bGlzdC5tZWV0cy5hcHBlbmQobWVldCkKICAgICAgICAgICAgcmV0dXJuKCJPSyIpCiAgICAgICAgZm9yIG1yZWwgaW4gc2VsZi5tZWV0czoKICAgICAgICAgICAgaWYgbWVldC5kYXRlPT1tcmVsLmRhdGU6ICAgICAgICAgICAgICAgICPQodGA0LDQstC90LjQstCw0LXQvCDQtNCw0YLRiwogICAgICAgICAgICAgICAgaWYgbWVldGxpc3QuY29tcGFyZXRpbWUobWVldCwgbXJlbCk6ICAgICPQodGA0LDQstC90LjQstCw0LXQvCDQstGA0LXQvNGPCiAgICAgICAgICAgICAgICAgICAgbGlzdGRpZmYgPSBtZWV0bGlzdC5jb21wYXJlcGVvcGxlKG1lZXQsbXJlbCkj0KHRgNCw0LLQvdC40LLQsNC10Lwg0LvRjtC00LXQuQogICAgICAgICAgICAgICAgICAgIGlmIGxpc3RkaWZmLmNvdW50KCk9PTA6CiAgICAgICAgICAgICAgICAgICAgICAgIG1lZXRsaXN0Lm1lZXRzLmFwcGVuZChtZWV0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIk9LIikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdHA9IkZBSUwgIgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBsaXN0ZGlmZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90cCs9JyAnK3AKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90cAoKICAgIGRlZiBjb21wYXJldGltZShzZWxmLCBtZWV0MSwgbWVldDIpOiAj0KHRgNCw0LLQvdC10L3QuNC1INC00LLRg9GFINCy0YHRgtGA0LXRhyDQv9C+INCy0YDQtdC80LXQvdC4LiDQldGB0LvQuCDQv9C10YDQtdGB0LXRh9C10L3QuNC1IC0gVHJ1ZQogICAgICAgIGlmIChtZWV0MS50aW1lPG1lZXQyLnRpbWUgYW5kIG1lZXQxLnRpbWUgKyBtZWV0MS5kdXJhdGlvbj5tZWV0Mi50aW1lKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBpZiAobWVldDIudGltZTxtZWV0MS50aW1lIGFuZCBtZWV0Mi50aW1lICsgbWVldDIuZHVyYXRpb24+bWVldDEudGltZSk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIFRydWUKCgogICAgZGVmIGNvbXBhcmVwZW9wbGUoc2VsZixtZWV0MSxtZWV0Mik6ICAgICPQodGA0LDQstC90LXQvdC40LUg0L/QviDQu9GO0LTRj9C8LiDQldGB0LvQuCDQv9C10YDQtdGB0LXRh9C10L3QuNC1IC0g0YLQviDRgdC/0LjRgdC+0LouCiAgICAgICAgY3Jvc3NsaXN0PVtdCiAgICAgICAgZm9yIHBlcnNvbiBpbiBtZWV0MS5wZW9wbGVsaXN0OgogICAgICAgICAgICBmb3IgaHVtYW4gaW4gbWVldDIucGVvcGxlbGlzdDoKICAgICAgICAgICAgICAgIGlmIHBlcnNvbj09aHVtYW46CiAgICAgICAgICAgICAgICAgICAgY3Jvc3NsaXN0LmFwcGVuZChodW1hbikKCiAgICAgICAgICAgIHJldHVybiBjcm9zc2xpc3QgI9CS0L7Qt9Cy0YDQsNGJ0LDQtdC8INC/0LXRgNC10YHQtdGH0LXQvdC40LUg0LTQstGD0YUg0YHQv9C40YHQutC+0LIKCgoKCiAgICBkZWYgcHJpbnRtZWV0KHNlbGYsIGRhdGUsIGh1bWFuKTogI9C/0LXRh9Cw0YLRjCDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviDQstGB0YLRgNC10YfQtQoKICAgICAgICBmb3IgbWVldCBpbiBtZWV0bGlzdC5tZWV0cygpOgogICAgICAgICAgICBpZiAobWVldC5kYXRlPT1kYXRlKToKICAgICAgICAgICAgICAgIG1lZXRjaGVjayA9IG1lZXQuY2hlY2soaHVtYW4pCiAgICAgICAgICAgICAgICBpZiBtZWV0Y2hlY2shPScnOgogICAgICAgICAgICAgICAgICAgIHByaW50KG1lZXRjaGVjaykKCgo=