2024-11-29 19:02:00 +01:00
|
|
|
#!/bin/python3
|
|
|
|
import sys,re
|
|
|
|
from pprint import pprint
|
|
|
|
sys.path.insert(0, '../../')
|
|
|
|
from fred import list2int, toGrid,nprint,get_value_in_direction, expand_grid, getCenter
|
|
|
|
|
|
|
|
input_f = 'input'
|
|
|
|
|
2024-11-29 19:23:57 +01:00
|
|
|
part = 2
|
2024-11-29 19:02:00 +01:00
|
|
|
#########################################
|
|
|
|
# #
|
|
|
|
# Part 1 #
|
|
|
|
# #
|
|
|
|
#########################################
|
|
|
|
|
|
|
|
def goLeft(dir:str):
|
|
|
|
|
|
|
|
if dir == 'north':
|
|
|
|
new_dir = (0,-1)
|
|
|
|
facing = 'west'
|
|
|
|
|
|
|
|
elif dir == 'south':
|
|
|
|
new_dir = (0,1)
|
|
|
|
facing = 'east'
|
|
|
|
|
|
|
|
elif dir == 'east':
|
|
|
|
new_dir = (-1,0)
|
|
|
|
facing = 'north'
|
|
|
|
|
|
|
|
elif dir == 'west':
|
|
|
|
new_dir = (1,0)
|
|
|
|
facing = 'south'
|
2024-11-29 19:23:57 +01:00
|
|
|
else:
|
|
|
|
print('Something is wrong')
|
|
|
|
print(dir)
|
|
|
|
print(new_dir)
|
2024-11-29 19:02:00 +01:00
|
|
|
|
|
|
|
return new_dir,facing
|
|
|
|
|
|
|
|
def goRight(dir:str):
|
|
|
|
|
|
|
|
if dir == 'north':
|
|
|
|
new_dir = (0,1)
|
|
|
|
facing = 'east'
|
|
|
|
|
|
|
|
elif dir == 'south':
|
|
|
|
new_dir = (0,-1)
|
|
|
|
facing = 'west'
|
|
|
|
|
|
|
|
elif dir == 'east':
|
|
|
|
new_dir = (1,0)
|
|
|
|
facing = 'south'
|
|
|
|
|
|
|
|
elif dir == 'west':
|
|
|
|
new_dir = (-1,0)
|
|
|
|
facing = 'north'
|
|
|
|
else:
|
|
|
|
print('Something is wrong')
|
|
|
|
print(dir)
|
|
|
|
print(new_dir)
|
|
|
|
|
|
|
|
return new_dir,facing
|
|
|
|
|
|
|
|
if part == 1:
|
|
|
|
grid = toGrid(input_f)
|
|
|
|
|
|
|
|
start = getCenter(grid)
|
|
|
|
|
|
|
|
#nprint(grid)
|
|
|
|
|
|
|
|
#print(start)
|
|
|
|
end = False
|
|
|
|
dir = (-1,0)
|
|
|
|
facing = 'north'
|
|
|
|
cur = start
|
|
|
|
infect = 0
|
|
|
|
iter = 1
|
|
|
|
while not end:
|
|
|
|
#print('-----------START-----------')
|
|
|
|
#print(cur[0]-1)
|
|
|
|
if cur[0]-1 <= 0 or cur[0]+1 >= len(grid[0]) or cur[1]+1 >= len(grid) or cur[1]-1 <= 0:
|
|
|
|
#print('Expanding')
|
|
|
|
grid = expand_grid(grid)
|
|
|
|
cur = tuple(map(lambda i, j: i + j, cur, (1,1)))
|
|
|
|
|
|
|
|
#print(cur)
|
|
|
|
|
|
|
|
if get_value_in_direction(grid,cur) == '#':
|
|
|
|
#print('infected')
|
|
|
|
|
|
|
|
dir,facing = goRight(facing)
|
|
|
|
grid[cur[0]][cur[1]] = '.'
|
|
|
|
#cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
|
|
|
|
elif get_value_in_direction(grid,cur) == '.':
|
|
|
|
#print('not infected')
|
|
|
|
dir,facing = goLeft(facing)
|
|
|
|
grid[cur[0]][cur[1]] = '#'
|
|
|
|
infect += 1
|
|
|
|
#cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
|
|
|
|
|
|
|
|
cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
#print(cur,dir,facing)
|
|
|
|
#nprint(grid,cur,'X')
|
|
|
|
#print('-----------END-----------',iter,infect)
|
|
|
|
iter += 1
|
|
|
|
if iter > 10000:
|
|
|
|
end = True
|
|
|
|
#input()
|
|
|
|
print(infect)
|
|
|
|
|
|
|
|
|
|
|
|
#########################################
|
|
|
|
# #
|
|
|
|
# Part 2 #
|
|
|
|
# #
|
|
|
|
#########################################
|
2024-11-29 19:23:57 +01:00
|
|
|
|
|
|
|
def goBack(dir:str):
|
|
|
|
|
|
|
|
if dir == 'north':
|
|
|
|
new_dir = (1,0)
|
|
|
|
facing = 'south'
|
|
|
|
|
|
|
|
elif dir == 'south':
|
|
|
|
new_dir = (-1,0)
|
|
|
|
facing = 'north'
|
|
|
|
|
|
|
|
elif dir == 'east':
|
|
|
|
new_dir = (0,-1)
|
|
|
|
facing = 'west'
|
|
|
|
|
|
|
|
elif dir == 'west':
|
|
|
|
new_dir = (0,1)
|
|
|
|
facing = 'east'
|
|
|
|
else:
|
|
|
|
print('Something is wrong')
|
|
|
|
print(dir)
|
|
|
|
print(new_dir)
|
|
|
|
|
|
|
|
return new_dir,facing
|
|
|
|
|
2024-11-29 19:02:00 +01:00
|
|
|
if part == 2:
|
2024-11-29 19:23:57 +01:00
|
|
|
grid = toGrid(input_f)
|
|
|
|
|
|
|
|
start = getCenter(grid)
|
|
|
|
|
|
|
|
#nprint(grid)
|
|
|
|
|
|
|
|
#print(start)
|
|
|
|
end = False
|
|
|
|
dir = (-1,0)
|
|
|
|
facing = 'north'
|
|
|
|
cur = start
|
|
|
|
infect = 0
|
|
|
|
iter = 1
|
|
|
|
nprint(grid)
|
|
|
|
while not end:
|
|
|
|
#print('-----------START-----------')
|
|
|
|
#print(cur[0]-1)
|
|
|
|
if cur[0]-1 <= 0 or cur[0]+1 >= len(grid[0]) or cur[1]+1 >= len(grid) or cur[1]-1 <= 0:
|
|
|
|
#print('Expanding')
|
|
|
|
grid = expand_grid(grid)
|
|
|
|
cur = tuple(map(lambda i, j: i + j, cur, (1,1)))
|
|
|
|
|
|
|
|
#print(cur)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if get_value_in_direction(grid,cur) == '#':
|
|
|
|
#print('infected')
|
|
|
|
|
|
|
|
dir,facing = goRight(facing)
|
|
|
|
grid[cur[0]][cur[1]] = 'F'
|
|
|
|
#cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
|
|
|
|
elif get_value_in_direction(grid,cur) == 'W':
|
|
|
|
dir,facing = dir,facing
|
|
|
|
grid[cur[0]][cur[1]] = '#'
|
|
|
|
infect += 1
|
|
|
|
|
|
|
|
elif get_value_in_direction(grid,cur) == 'F':
|
|
|
|
dir,facing = goBack(facing)
|
|
|
|
grid[cur[0]][cur[1]] = '.'
|
|
|
|
|
|
|
|
elif get_value_in_direction(grid,cur) == '.':
|
|
|
|
#print('not infected')
|
|
|
|
dir,facing = goLeft(facing)
|
|
|
|
grid[cur[0]][cur[1]] = 'W'
|
|
|
|
|
|
|
|
#cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
|
|
|
|
|
|
|
|
cur = (cur[0]+dir[0],cur[1]+dir[1])
|
|
|
|
#print(cur,dir,facing)
|
|
|
|
#nprint(grid,cur,'X')
|
|
|
|
#print('-----------END-----------',iter,infect)
|
|
|
|
iter += 1
|
|
|
|
if iter > 10000000:
|
|
|
|
end = True
|
|
|
|
elif iter % 100000 == 0:
|
|
|
|
print(iter,infect)
|
|
|
|
#input()
|
|
|
|
print(infect)
|
|
|
|
|