#!/usr/bin/env python import numpy as np from collections import defaultdict class Car(object): def __init__(self, path, data): self.__path = path self.__data = data def getCurrentSem(self): """ name, intersection """ if len(self.__path) == 1: return None else: currentStr, nextStr = self.__path[0:2] for street, inter, _ in self.__data[currentStr]: if street == nextStr: return (currentStr, inter) def getCurrentStreet(self): return self.__path[0] def getNextStreet(self): return self.__path[1] def moveCar(self): self.__path = self.__path[1:] def canElimitate(self): if len(self.__path) == 0: return True return False class Intersection(object): def __init__(self, data): self.__data = data def lastStreetGreen(self): for street, status in self.__data: if status == True: return street return None def makeGreen(self, name): for i in range(len(self.__data)): street, status = self.__data[i] if status == True: self.__data[i][1] = False if street == name: self.__data[i][1] = True class Data(object): def __init__(self, fileName = 'data.in'): content = open(fileName, 'r').read() self.__parseData(content) def __parseData(self, content) -> object: """ Parsarea pentru valorile de input. Ca sigur trebuie facute ceva siruri, etc. """ content = content.split('\n') self.duration, self.__numberIntersection, self.__numberStreets, self.__numberCars, self.__bonusPoints = map(int, content[0].split(' ')) content = content[1:] self.__mapIntEnter = defaultdict(lambda: []) self.__mapIntLeave = defaultdict(lambda: []) self.mapAdiacent = defaultdict(lambda: []) self.__streetTime = {} for street in content[:self.__numberStreets]: street = street.split(' ') intStart, intFinish, name, time = int(street[0]), int(street[1]), str(street[2]), int(street[3]) self.__mapIntLeave[intStart].append((name, time, intStart)) self.__mapIntEnter[intFinish].append((name, time, intFinish)) self.__streetTime[name] = time # create intersection list self.interSectionList = [] for i in range(len(self.__mapIntEnter)): intValue = list(map(lambda x: (x[0], False), self.__mapIntEnter[i])) self.interSectionList.append(Intersection(intValue)) for k in self.__mapIntEnter.keys(): for kName, _, intLeave in self.__mapIntEnter[k]: for vLeave in self.__mapIntLeave[intLeave]: vName, _, _ = vLeave # numele strazii, intersectia in care intra, status self.mapAdiacent[kName].append((vName, intLeave, False)) content = content[self.__numberStreets:] self.carList = [] for car in content[:self.__numberCars]: print(list(map(str, car.split(' ')[1:]))) car = Car(list(map(str, car.split(' ')[1:])), self.mapAdiacent) self.carList.append(car) def flushInFile(self, fileOutput = 'data.out') -> None: with open(fileOutput, 'w') as ofile: ofile.write(len(self.__schedules)) for key, value in self.__schedules.items(): ofile.write(key) ofile.write(len(value)) for tup in value: ofile.write(tup[0], tup[1])