145 lines
5.0 KiB
Python
145 lines
5.0 KiB
Python
import copy
|
|
import time
|
|
|
|
def makeMap(arr):
|
|
for i in range(0, len(arr)):
|
|
if "^" in arr[i]:
|
|
loc = [i, arr[i].index("^")]
|
|
break
|
|
flag = True
|
|
while flag:
|
|
match arr[loc[0]][loc[1]]:
|
|
case "^":
|
|
if loc[0] == 0:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0] - 1][loc[1]] == "#":
|
|
arr[loc[0]][loc[1]] = ">"
|
|
else:
|
|
arr[loc[0] - 1][loc[1]] = "^"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[0] -= 1
|
|
case ">":
|
|
if loc[1] == len(arr[loc[0]]) - 1:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0]][loc[1] + 1] == "#":
|
|
arr[loc[0]][loc[1]] = "V"
|
|
else:
|
|
arr[loc[0]][loc[1] + 1] = ">"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[1] += 1
|
|
case "V":
|
|
if loc[0] == len(arr) - 1:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0] + 1][loc[1]] == "#":
|
|
arr[loc[0]][loc[1]] = "<"
|
|
else:
|
|
arr[loc[0] + 1][loc[1]] = "V"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[0] += 1
|
|
case "<":
|
|
if loc[1] == 0:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0]][loc[1] - 1] == "#":
|
|
arr[loc[0]][loc[1]] = "^"
|
|
else:
|
|
arr[loc[0]][loc[1] - 1] = "<"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[1] -= 1
|
|
case _:
|
|
print("THIS IS AN ERROR")
|
|
return arr
|
|
|
|
def check(arr):
|
|
loc = []
|
|
pastlocs = []
|
|
for i in range(0, len(arr)):
|
|
if "^" in arr[i]:
|
|
loc = [i, arr[i].index("^")]
|
|
break
|
|
flag = True
|
|
while flag:
|
|
if [loc,arr[loc[0]][loc[1]]] in pastlocs:
|
|
return -1
|
|
match arr[loc[0]][loc[1]]:
|
|
case "^":
|
|
if loc[0] == 0:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0] - 1][loc[1]] == "#":
|
|
arr[loc[0]][loc[1]] = ">"
|
|
else:
|
|
pastlocs.append([copy.deepcopy(loc), arr[loc[0]][loc[1]]])
|
|
arr[loc[0] - 1][loc[1]] = "^"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[0] -= 1
|
|
case ">":
|
|
if loc[1] == len(arr[loc[0]]) - 1:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0]][loc[1] + 1] == "#":
|
|
arr[loc[0]][loc[1]] = "V"
|
|
else:
|
|
pastlocs.append([copy.deepcopy(loc), arr[loc[0]][loc[1]]])
|
|
arr[loc[0]][loc[1] + 1] = ">"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[1] += 1
|
|
case "V":
|
|
if loc[0] == len(arr) - 1:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0] + 1][loc[1]] == "#":
|
|
arr[loc[0]][loc[1]] = "<"
|
|
else:
|
|
pastlocs.append([copy.deepcopy(loc), arr[loc[0]][loc[1]]])
|
|
arr[loc[0] + 1][loc[1]] = "V"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[0] += 1
|
|
case "<":
|
|
if loc[1] == 0:
|
|
flag = False
|
|
arr[loc[0]][loc[1]] = "X"
|
|
elif arr[loc[0]][loc[1] - 1] == "#":
|
|
arr[loc[0]][loc[1]] = "^"
|
|
else:
|
|
pastlocs.append([copy.deepcopy(loc), arr[loc[0]][loc[1]]])
|
|
arr[loc[0]][loc[1] - 1] = "<"
|
|
arr[loc[0]][loc[1]] = "X"
|
|
loc[1] -= 1
|
|
case _:
|
|
print("THIS IS AN ERROR")
|
|
ctr = 0
|
|
for l in arr:
|
|
for a in l:
|
|
ctr += 1 if a == "X" else 0
|
|
return ctr
|
|
|
|
def obstruct(arr):
|
|
ctr = 0
|
|
start = time.time()
|
|
map = makeMap(copy.deepcopy(arr))
|
|
for i in range(0,len(arr)):
|
|
spent = time.time() - start
|
|
print("After "+str(int(spent))+" seconds, checking "+str(i)+" out of "+str(len(arr)))
|
|
for j in range(0,len(arr[i])):
|
|
if map[i][j] == "X" and arr[i][j] != "^":
|
|
tmpArr = copy.deepcopy(arr)
|
|
tmpArr[i][j] = "#"
|
|
if check(tmpArr) == -1:
|
|
ctr += 1
|
|
return ctr
|
|
|
|
arr = []
|
|
with open("input06.txt") as file:
|
|
for line in file:
|
|
arr.append([])
|
|
for a in line:
|
|
if a != "\n":
|
|
arr[-1].append(a)
|
|
out = check(copy.deepcopy(arr))
|
|
print("Without new obstructions, the amount of positions the guard passes before exiting is: "+str(out))
|
|
out = obstruct(copy.deepcopy(arr))
|
|
print("Amount of positions a new obstruction can make the guard loop is: "+str(out)) |