add day 8 part one
This commit is contained in:
127
day8/day8.py
Normal file
127
day8/day8.py
Normal file
@@ -0,0 +1,127 @@
|
||||
import sys, re
|
||||
sys.path.append('../lib')
|
||||
|
||||
import tools
|
||||
|
||||
LEFT = 'L'
|
||||
RIGHT = 'R'
|
||||
|
||||
|
||||
class Instructions(object):
|
||||
def __init__(self, inp: str):
|
||||
self.curr = 0
|
||||
self.instructions = list(inp)
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
instruction = self.instructions[self.curr]
|
||||
self.curr = (self.curr + 1) % len(self.instructions)
|
||||
return instruction
|
||||
|
||||
def reset(self):
|
||||
self.curr = 0
|
||||
|
||||
|
||||
class Node(object):
|
||||
def __init__(self, value, left, right):
|
||||
self.value = value
|
||||
self.l = left
|
||||
self.r = right
|
||||
|
||||
|
||||
class Network(object):
|
||||
def __init__(self):
|
||||
self.m = dict()
|
||||
self.curr = None
|
||||
for l in lines:
|
||||
pass
|
||||
|
||||
def add(self, n: Node):
|
||||
self.m[n.value] = n
|
||||
|
||||
def get(self, name: str) -> Node:
|
||||
n = self.m[name]
|
||||
return n
|
||||
|
||||
def get_starting_nodes(self) -> list[Node]:
|
||||
n = list()
|
||||
for name, node in self.m.items():
|
||||
if name.endswith('A'):
|
||||
n.append(node)
|
||||
return n
|
||||
|
||||
|
||||
class Solver(object):
|
||||
def __init__(self, lines):
|
||||
instr = Instructions(lines[0])
|
||||
self.instructions = instr
|
||||
self.network = Network()
|
||||
|
||||
r = re.compile(r"(\w{3}) = \((\w{3}), (\w{3})\)")
|
||||
for l in lines[2:]:
|
||||
m = r.search(l)
|
||||
n = Node(m.group(1), m.group(2), m.group(3))
|
||||
self.network.add(n)
|
||||
|
||||
def find_num_steps(self, start: str, end: str) -> int:
|
||||
steps = 0
|
||||
self.instructions.reset()
|
||||
curr = self.network.get(start)
|
||||
for instr in self.instructions:
|
||||
if curr.value == end:
|
||||
break
|
||||
if instr == LEFT:
|
||||
curr = self.network.get(curr.l)
|
||||
elif instr == RIGHT:
|
||||
curr = self.network.get(curr.r)
|
||||
steps += 1
|
||||
return steps
|
||||
|
||||
def find_num_steps_for_all(self) -> int:
|
||||
steps = 0
|
||||
self.instructions.reset()
|
||||
curr_list = self.network.get_starting_nodes()
|
||||
for instr in self.instructions:
|
||||
done = 0
|
||||
for i in range(len(curr_list)):
|
||||
if curr_list[i].value.endswith('Z'):
|
||||
done += 1
|
||||
if len(curr_list) == done:
|
||||
break
|
||||
for i in range(len(curr_list)):
|
||||
if instr == LEFT:
|
||||
curr_list[i] = self.network.get(curr_list[i].l)
|
||||
elif instr == RIGHT:
|
||||
curr_list[i] = self.network.get(curr_list[i].r)
|
||||
steps += 1
|
||||
|
||||
return steps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
r = tools.Reader('test_input.txt')
|
||||
lines = r.read()
|
||||
|
||||
slvr = Solver(lines)
|
||||
x = slvr.find_num_steps('AAA', 'ZZZ')
|
||||
print(x)
|
||||
|
||||
y = slvr.find_num_steps_for_all()
|
||||
print(y)
|
||||
|
||||
|
||||
r = tools.Reader('input.txt')
|
||||
lines = r.read()
|
||||
|
||||
slvr = Solver(lines)
|
||||
x = slvr.find_num_steps('AAA', 'ZZZ')
|
||||
print(x)
|
||||
|
||||
# y = slvr.find_num_steps_for_all()
|
||||
# print(y)
|
||||
|
Reference in New Issue
Block a user