part 1 done
This commit is contained in:
parent
b49826bc10
commit
801418e2c7
|
@ -0,0 +1,141 @@
|
||||||
|
from helpers import *
|
||||||
|
input_map, _, input_directions = read_day(22, False).partition('\n\n')
|
||||||
|
input_map = input_map.split('\n')
|
||||||
|
|
||||||
|
sample_map, _, sample_directions = '''
|
||||||
|
...#
|
||||||
|
.#..
|
||||||
|
#...
|
||||||
|
....
|
||||||
|
...#.......#
|
||||||
|
........#...
|
||||||
|
..#....#....
|
||||||
|
..........#.
|
||||||
|
...#....
|
||||||
|
.....#..
|
||||||
|
.#......
|
||||||
|
......#.
|
||||||
|
|
||||||
|
10R5L5R10L4R5L5
|
||||||
|
'''.strip('\n').partition('\n\n')
|
||||||
|
sample_map = sample_map.split('\n')
|
||||||
|
|
||||||
|
instruction_regex = re.compile(r'((?:\d+)|[RL])')
|
||||||
|
# print(instruction_regex.findall(sample_directions))
|
||||||
|
def navigate(input_map: list[str], input_directions: str) -> int:
|
||||||
|
height = len(input_map)
|
||||||
|
print(f'height is {height}')
|
||||||
|
directions = instruction_regex.findall(input_directions)
|
||||||
|
y = 0
|
||||||
|
x = input_map[y].index('.')
|
||||||
|
print(input_map[y])
|
||||||
|
print(input_map[-1])
|
||||||
|
facing = 0 # clockwise
|
||||||
|
for direction in directions:
|
||||||
|
# print(x, y, facing)
|
||||||
|
if direction == 'L':
|
||||||
|
facing = (facing-1) % 4
|
||||||
|
elif direction == 'R':
|
||||||
|
facing = (facing+1) % 4
|
||||||
|
else:
|
||||||
|
steps = int(direction)
|
||||||
|
# print(f'moving {steps} steps in facing {facing}')
|
||||||
|
if facing == 0: # Right ->
|
||||||
|
row = input_map[y]
|
||||||
|
for i in range(steps):
|
||||||
|
nx = x + 1
|
||||||
|
if nx >= len(row) or row[nx] == ' ': # wrap around
|
||||||
|
first_row_wall = 1_000_000
|
||||||
|
try:
|
||||||
|
first_row_wall = row.index('#')
|
||||||
|
except:
|
||||||
|
print(f'no wall in row {y}, moving to {row.index(".")}')
|
||||||
|
print(row)
|
||||||
|
pass
|
||||||
|
first_row_space = 1_000_000
|
||||||
|
try:
|
||||||
|
first_row_space = row.index('.')
|
||||||
|
except:
|
||||||
|
print(f'no space in row {y}')
|
||||||
|
pass
|
||||||
|
if first_row_wall <= first_row_space:
|
||||||
|
# print('hit wrapped wall')
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
x = first_row_space
|
||||||
|
elif row[nx] == '#': # wall, stop
|
||||||
|
# print('hit wall')
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
x = nx
|
||||||
|
# print('finished moving right')
|
||||||
|
elif facing == 2: # Left <-
|
||||||
|
row = input_map[y]
|
||||||
|
for i in range(steps):
|
||||||
|
nx = x - 1
|
||||||
|
if nx < 0 or row[nx] == ' ': # wrap around
|
||||||
|
nx = len(row) - 1
|
||||||
|
if row[nx] == '#':
|
||||||
|
# print('hit wrapped wall wrapping left')
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print(f'wrapping left on row {y} - from {x} to {nx}')
|
||||||
|
x = nx
|
||||||
|
elif row[nx] == '#': # wall, stop
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
x = nx
|
||||||
|
elif facing == 1: # Down v
|
||||||
|
for i in range(steps):
|
||||||
|
ny = y + 1
|
||||||
|
if ny >= height or x >= len(input_map[ny]) or input_map[ny][x] == ' ': # wrap around
|
||||||
|
result = None
|
||||||
|
for r, row in enumerate(input_map):
|
||||||
|
if len(row) > x and row[x] != ' ':
|
||||||
|
if row[x] == '#':
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
result = r
|
||||||
|
break
|
||||||
|
if result is None:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
y = result
|
||||||
|
elif input_map[ny][x] == '#': # wall, stop
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
y = ny
|
||||||
|
elif facing == 3: # Up ^
|
||||||
|
for i in range(steps):
|
||||||
|
ny = y-1
|
||||||
|
if ny < 0 or x >= len(input_map[ny]) or input_map[ny][x] == ' ': # wrap around
|
||||||
|
result = None
|
||||||
|
for r, row in enumerate(reversed(input_map)):
|
||||||
|
if len(row) > x and row[x] != ' ':
|
||||||
|
if row[x] == '#':
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print(f'wrapping up from {y} to {r}')
|
||||||
|
result = height-1-r
|
||||||
|
break
|
||||||
|
if result is None:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
y = result
|
||||||
|
elif input_map[ny][x] == '#': # wall, stop
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
y = ny
|
||||||
|
print(x, y, facing)
|
||||||
|
return 1000*(y+1) + 4*(x+1) + facing
|
||||||
|
|
||||||
|
print(navigate(sample_map, sample_directions))
|
||||||
|
print(navigate(input_map, input_directions)) # Not 132096
|
||||||
|
# You begin the path in the leftmost open tile of the top row of tiles. Initially, you are facing to the right (from the perspective of how the map is drawn).
|
||||||
|
|
||||||
|
# To finish providing the password to this strange input device, you need to determine numbers for your final row, column, and facing as your final position appears from the perspective of the original map.
|
||||||
|
# Rows start from 1 at the top and count downward; columns start from 1 at the left and count rightward.
|
||||||
|
# (In the above example, row 1, column 1 refers to the empty space with no tile on it in the top-left corner.)
|
||||||
|
# Facing is 0 for right (>), 1 for down (v), 2 for left (<), and 3 for up (^). The final password is the sum of 1000 times the row, 4 times the column, and the facing.
|
||||||
|
|
||||||
|
# In the above example, the final row is 6, the final column is 8, and the final facing is 0. So, the final password is 1000 * 6 + 4 * 8 + 0: 6032.
|
|
@ -38,9 +38,12 @@ def lines_to_numbers(lines: list[str]) -> list[list[int]]:
|
||||||
def transpose_array_of_strings(aos: list[str], reverse_x = False, reverse_y = False, strip = '') -> list[str]:
|
def transpose_array_of_strings(aos: list[str], reverse_x = False, reverse_y = False, strip = '') -> list[str]:
|
||||||
return [''.join(l[i] for l in aos[::-1 if reverse_y else 1]).strip(strip) for i in range(len(aos[0]))[::-1 if reverse_x else 1]]
|
return [''.join(l[i] for l in aos[::-1 if reverse_y else 1]).strip(strip) for i in range(len(aos[0]))[::-1 if reverse_x else 1]]
|
||||||
|
|
||||||
def read_day(day: int) -> str:
|
def read_day(day: int, strip=True) -> str:
|
||||||
with open(f'input/{day:02}', 'r') as file:
|
with open(f'input/{day:02}', 'r') as file:
|
||||||
|
if strip:
|
||||||
return file.read().strip()
|
return file.read().strip()
|
||||||
|
else:
|
||||||
|
return file.read()
|
||||||
|
|
||||||
def print_time(name: str, ns: int):
|
def print_time(name: str, ns: int):
|
||||||
print(f'{name} took {ns}ns = {ns/1000000:.2f}ms')
|
print(f'{name} took {ns}ns = {ns/1000000:.2f}ms')
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue