more d22p2 fiddling; maybe think about a whole new approach

This commit is contained in:
Stefan Harmuth 2022-12-22 17:20:55 +01:00
parent e3da4a09bf
commit 8dd26033e3

View File

@ -1,7 +1,7 @@
import re import re
from tools.aoc import AOCDay from tools.aoc import AOCDay
from tools.coordinate import Coordinate from tools.coordinate import Coordinate
from tools.grid import Grid, GridTransformation from tools.grid import Grid
from typing import Any from typing import Any
@ -13,8 +13,6 @@ FACING = [
] ]
CUBE_CONNECTIONS = { CUBE_CONNECTIONS = {
'.#./###/.#./.#.': 1,
'###/.#./.#./.#.': 2,
'##./.#./.##/..#': ( '##./.#./.##/..#': (
((0, 0, 1), (1, 1, 0)), ((0, 0, 1), (1, 1, 0)),
((0, 0, 2), (1, 2, 0)), ((0, 0, 2), (1, 2, 0)),
@ -31,12 +29,22 @@ CUBE_CONNECTIONS = {
((2, 3, 1), (0, 0, 1)), ((2, 3, 1), (0, 0, 1)),
((2, 3, 2), (1, 2, 3)), ((2, 3, 2), (1, 2, 3)),
), ),
'##./.#./.##/.#.': 4, '..#./###./..##': (
'.#./##./.##/.#.': 5, ((2, 0, 0), (3, 2, 2)),
'.##/.#./.#./##.': 6, ((2, 0, 2), (1, 1, 1)),
'.##/##./.#./.#.': 7, ((2, 0, 3), (0, 1, 1)),
'..#/.##/##./#..': 8, ((0, 1, 1), (2, 2, 3)),
'.#./.##/##./#..': 9, ((0, 1, 2), (3, 2, 3)),
((0, 1, 3), (2, 0, 1)),
((1, 1, 1), (2, 2, 0)),
((1, 1, 3), (2, 0, 0)),
((2, 1, 0), (3, 2, 1)),
((2, 2, 1), (0, 1, 3)),
((2, 2, 2), (1, 1, 3)),
((3, 2, 0), (2, 0, 2)),
((3, 2, 1), (0, 1, 0)),
((3, 2, 3), (2, 1, 2)),
),
'.#./.#./###/#..': ( '.#./.#./###/#..': (
((1, 0, 0), (2, 2, 2)), ((1, 0, 0), (2, 2, 2)),
((1, 0, 2), (0, 2, 0)), ((1, 0, 2), (0, 2, 0)),
@ -53,7 +61,6 @@ CUBE_CONNECTIONS = {
((0, 3, 1), (2, 2, 1)), ((0, 3, 1), (2, 2, 1)),
((0, 3, 2), (1, 0, 1)), ((0, 3, 2), (1, 0, 1)),
), ),
'.#/.#/##/#./#.': 11,
} }
@ -69,6 +76,13 @@ def get_cube_conn_dict(cube_conn: tuple, c_size: int) -> dict:
tar_x, tar_y, tar_f = tar tar_x, tar_y, tar_f = tar
match cur_f, tar_f: match cur_f, tar_f:
case 0, 1:
x = (cur_x + 1) * c_size - 1
ty = tar_y * c_size
for d in range(c_size):
y = cur_y * c_size + d
tx = (tar_x + 1) * c_size - (d + 1)
conn_dict[(x, y, cur_f)] = (Coordinate(tx, ty), tar_f)
case 0, 2: case 0, 2:
x = (cur_x + 1) * c_size - 1 x = (cur_x + 1) * c_size - 1
tx = (tar_x + 1) * c_size - 1 tx = (tar_x + 1) * c_size - 1
@ -139,6 +153,13 @@ def get_cube_conn_dict(cube_conn: tuple, c_size: int) -> dict:
x = cur_x * c_size + d x = cur_x * c_size + d
ty = tar_y * c_size + d ty = tar_y * c_size + d
conn_dict[(x, y, cur_f)] = (Coordinate(tx, ty), tar_f) conn_dict[(x, y, cur_f)] = (Coordinate(tx, ty), tar_f)
case 3, 1:
y = cur_y * c_size
ty = (tar_y + 1) * c_size - 1
for d in range(c_size):
x = cur_x * c_size + d
tx = tar_x * c_size + d
conn_dict[(x, y, cur_f)] = (Coordinate(tx, ty), tar_f)
case 3, 2: case 3, 2:
y = cur_y * c_size y = cur_y * c_size
tx = (tar_x + 1) * c_size - 1 tx = (tar_x + 1) * c_size - 1
@ -176,23 +197,17 @@ def identify_cube(board: Grid) -> dict:
if cube_grid.getOnCount() != 6: if cube_grid.getOnCount() != 6:
continue continue
print(cube_grid) cube_grid.print(true_char='#')
for _ in range(2):
for _ in range(4):
board.transform(GridTransformation.ROTATE_RIGHT)
cube_grid.transform(GridTransformation.ROTATE_RIGHT)
if str(cube_grid) in CUBE_CONNECTIONS: if str(cube_grid) in CUBE_CONNECTIONS:
return get_cube_conn_dict(CUBE_CONNECTIONS[str(cube_grid)], x_size) return get_cube_conn_dict(CUBE_CONNECTIONS[str(cube_grid)], x_size)
board.transform(GridTransformation.FLIP_X)
cube_grid.transform(GridTransformation.FLIP_X)
print("FUCK") print("Unknown Cube-Shape")
def walk(board: Grid, pos: Coordinate, directions: list, face: int = 0, connections: dict = None) -> (Coordinate, int): def walk(board: Grid, pos: Coordinate, directions: list, face: int = 0, connections: dict = None) -> (Coordinate, int):
for direction in directions: for direction in directions:
steps, turn = direction steps, turn = direction
print("starting at", pos, "moving", steps, "steps, then turning", turn)
for _ in range(steps): for _ in range(steps):
next_pos = pos + FACING[face] next_pos = pos + FACING[face]
@ -200,6 +215,7 @@ def walk(board: Grid, pos: Coordinate, directions: list, face: int = 0, connecti
if board.get(next_pos) is None or not board.isWithinBoundaries(next_pos): if board.get(next_pos) is None or not board.isWithinBoundaries(next_pos):
if connections is not None: if connections is not None:
next_pos, next_face = connections[(pos.x, pos.y, face)] next_pos, next_face = connections[(pos.x, pos.y, face)]
print("wrapping from", pos, "to", next_pos, "facing", next_face)
else: else:
match face: match face:
case 0: case 0:
@ -266,7 +282,6 @@ class Day(AOCDay):
def part2(self) -> Any: def part2(self) -> Any:
board_map, directions, start_position = self.get_map_and_directions() board_map, directions, start_position = self.get_map_and_directions()
conn = identify_cube(board_map) conn = identify_cube(board_map)
board_map.bla()
for x in board_map.rangeX(): for x in board_map.rangeX():
c = Coordinate(x, 0) c = Coordinate(x, 0)
if board_map.get(c) is not None: if board_map.get(c) is not None: