input = open("input", 'r') # d = [line for line in input] # d = [[val for val in line.strip()] for line in input] d = {(complex(x,y)): c for y,line in enumerate(input) for x,c in enumerate(line)} guard = 0 for pos,char in d.items(): if char == "^": guard = pos break def step(pos,dir): npos = pos + dir if npos not in d: return -1,-1 elif d[npos] == "#": return pos,(dir*1j) else: return npos,dir def run(): pos = guard sposs = set([pos]) dir = -1j loop = set([(pos,dir)]) while pos != -1: pos,dir = step(pos,dir) if (pos,dir) in loop: return -1 if pos == -1: break sposs.add(pos) loop.add((pos,dir)) return len(sposs) def run2(): sm = 0 for pos,char in d.items(): if char != ".": continue d[pos] = "#" if run(True) == -1: sm += 1 d[pos] = "." return sm print(run()) print(run2())