I'm done
unknown
python
4 years ago
5.1 kB
8
Indexable
# 2. skuska: zacarovane ulice
# autor: Benjamin Bergstrom
# datum: 24.6.2021
class ZacarovaneUlice:
def __init__(self, meno_suboru):
self.graph = []
self.start = ''
self.ends = set()
names = set()
with open(meno_suboru, 'r') as file:
for line in file:
line = line.split()
# initialize graph without edges
for item in line:
if item not in names and not self.wrappedInQuotes(item):
names.add(item)
self.graph.append((item, dict()))
with open(meno_suboru, 'r') as file:
for line in file:
line = line.split()
for item in line:
# add edges
self.ends.add(line[-1])
for i in range(0, len(line) - 2, 2):
if i == 0:
self.start = line[i]
for graphItem in self.graph:
if graphItem[0] == line[i]:
graphItem[1][line[i + 2]] = line[i + 1]
break
del names
def wrappedInQuotes(self, item):
return item[0] == '"' and item[-1] == '"'
def vrcholy(self): # vráti množinu všetkých vrcholov
return set([item[0] for item in self.graph])
def start_ciel(self): # vráti meno štartu a množinu cieľov
return self.start, self.ends
def hrana(self, v1, v2): # pre dva vrcholy vráti magické slovo alebo None, ak nie je ulica
for graphItem in self.graph:
if graphItem[0] == v1:
if v2 not in graphItem[1].keys():
return None
return graphItem[1][v2][1:-1]
return None
def findVertexByName(self, name):
for graphItem in self.graph:
if graphItem[0] == name:
return graphItem
def trasa(self, postupnost_slov, ciel=None):
# trivial case
if postupnost_slov == '':
return [self.start]
# initialize starter values for backtracking
self.exit = ciel
self.path = []
self.finalPath = []
self.amount = 0
self.words = postupnost_slov.split('-')
self.backtracking(self.start)
if self.finalPath == [] or self.finalPath[-1] in self.ends:
return self.finalPath
# continue if we did not end in one of the ends
self.amount = 0
self.visited = set()
foundNamelessEdge = False
for fuckingHell in self.graph:
for bashingMyHeadOnTheWall in fuckingHell[1].items():
if bashingMyHeadOnTheWall[0] in self.ends and bashingMyHeadOnTheWall[1][1:-1] == '':
thatOneEnd = bashingMyHeadOnTheWall[0]
foundNamelessEdge = True
break
if not foundNamelessEdge:
return []
self.backtracking2(self.finalPath[-1], thatOneEnd)
return self.finalPath
def backtracking(self, v1, i=0):
if self.amount > 0:
return
self.path.append(v1)
graph = self.findVertexByName(v1)
if i == len(self.words):
self.amount += 1
self.finalPath = []
if self.exit == self.path[-1] or self.exit == None:
self.finalPath.extend(self.path)
else:
neighbours = graph[1].items()
for name, value in neighbours:
value = self.removeQuotes(value)
nextLevelNeighbours = self.findVertexByName(name)[1].values()
print(nextLevelNeighbours)
if self.words[i] == value:
self.backtracking(name, i + 1)
elif value == '':
self.backtracking(name, i + 0)
self.path.pop()
def removeQuotes(self, string):
if (string[0] == '"' and string[-1] == '"'):
return string[1:-1]
raise Exception('String does not contain quotes!')
def backtracking2(self, v1, v2):
if self.amount > 0:
return
self.path.append(v1)
self.visited.add(v1)
if v1 == v2:
self.amount += 1
self.finalPath += self.path[1:]
else:
graph = self.findVertexByName(v1)
for v in graph[1]:
if v not in self.visited:
self.backtracking2(v, v2)
self.path.pop()
self.visited.remove(v1)
if __name__ == '__main__':
z = ZacarovaneUlice('subor2.txt')
# print(z.trasa('abraka-dabra', 'k3'))
# print(z.trasa('abraka-dabra-dabra', 'k3'))
# print(z.trasa('abraka-abraka-abraka-dabra-dabra-dabra-dabra'))
# print(z.graph)
# print(z.start, z.ends)
print(z.trasa('a'))
Editor is loading...