my solutions for advent of code 2022
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.9 KiB

import queue
q = queue.Queue()
valves = {}
valvesConsider = {}
destinationQue = queue.Queue()
shortest = None
distanceMap = {}
class Valve():
def __init__(self, flowRate, tunnels, name):
self.flowRate = flowRate
self.tunnels = tunnels
self.name = name
def getFlowrate(self):
return self.flowRate
def moves(self, destination, length):
global shortest
if shortest is not None and length >= shortest:
return
if self.name == destination:
if shortest is None or length <= shortest:
shortest = length
return
_length = length + 1
for val in self.tunnels:
destinationQue.put((val, destination, _length))
def step(position1, position2, busy1, busy2, currentTime, pressure, _valvesCons):
global curentbest
done = False
if pressure > curentbest:
print(1)
curentbest = pressure
if len(_valvesCons) == 0:
return
if busy1 == 0:
for destination in _valvesCons:
_CopyCons = _valvesCons.copy()
_dist = distanceMap[(position1, destination)]
if (currentTime + _dist + 1) >= 26:
continue
_busy1 =_dist + 1
_pressure = pressure + ((26 - currentTime - _busy1)* _CopyCons[destination])
_CopyCons.pop(destination)
done = True
q.put((destination, position2, _busy1, busy2, currentTime, _pressure, _CopyCons))
if done:
return
if busy2 == 0:
for destination in _valvesCons:
_CopyCons = _valvesCons.copy()
_dist = distanceMap[(position2, destination)]
if (currentTime + _dist + 1) >= 26:
continue
_busy2 =_dist + 1
_pressure = pressure + ((26 - currentTime - _busy2)* _CopyCons[destination])
_CopyCons.pop(destination)
q.put((position1, destination, busy1, _busy2, currentTime, _pressure, _CopyCons))
return
_currentTime = currentTime + 1
_busy1 = busy1 - 1
_busy2 = busy2 - 1
_CopyCons = _valvesCons.copy()
if _currentTime >= 26:
return
q.put((position1, position2, _busy1, _busy2, _currentTime, pressure, _CopyCons))
def distance(position, destination):
global destinationQue
global shortest
shortest = None
destinationQue.put((position, destination, 0))
while not destinationQue.empty():
_position, _destination, length = destinationQue.get()
valves[_position].moves(_destination, length)
return shortest
openvalves = []
with open('input16.txt','r') as f:
inp = f.read().splitlines(keepends=False)
for line in inp:
tempA, tempB = line.split(' has flow rate=')
_valve = tempA[-2:]
tempB = tempB.replace('; tunnel leads to valve ','; tunnels lead to valves ')
flowRate, tempA = tempB.split('; tunnels lead to valves ')
flowRate = int(flowRate)
tunnels = tempA.split(', ')
if flowRate == 0:
openvalves.append(_valve)
else:
valvesConsider[_valve] = flowRate
newValve = Valve( flowRate, tunnels, _valve)
valves[_valve] = newValve
n = 0
for start in valvesConsider:
n += 1
distanceMap[('AA', start)] = distance('AA', start)
print(n)
for end in valvesConsider:
if (start, end) in distanceMap:
continue
n += 1
_dist = distance(start, end)
distanceMap[(start, end)] = _dist
distanceMap[(end, start)] = _dist
print(n)
for i in distanceMap:
print(i, distanceMap[i])
position = 'AA'
currentTime = 0
pressure = 0
curentbest = 0
q.put((position, position, 0, 0, currentTime, pressure, valvesConsider))
while not q.empty():
print(q.qsize())
position1, position2, busy1, busy2, currentTime, pressure, _valvesConsider = q.get()
step(position1, position2, busy1, busy2, currentTime, pressure, _valvesConsider)
print(curentbest)