day21 - p2 could be faster, but no idea how
This commit is contained in:
parent
d4314d63fc
commit
cfd6382756
94
day21.py
Normal file
94
day21.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
from tools.aoc import AOCDay
|
||||||
|
from tools.coordinate import Coordinate
|
||||||
|
from tools.grid import Grid, GridTransformation
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
FLIPS = [
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.FLIP_HORIZONTALLY,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
GridTransformation.ROTATE_RIGHT,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def init_grid() -> Grid:
|
||||||
|
grid = Grid()
|
||||||
|
grid.set(Coordinate(1, 0))
|
||||||
|
grid.set(Coordinate(2, 1))
|
||||||
|
grid.set(Coordinate(0, 2))
|
||||||
|
grid.set(Coordinate(1, 2))
|
||||||
|
grid.set(Coordinate(2, 2))
|
||||||
|
return grid
|
||||||
|
|
||||||
|
|
||||||
|
class Day(AOCDay):
|
||||||
|
inputs = [
|
||||||
|
[
|
||||||
|
(12, "input21_test"),
|
||||||
|
(176, "input21")
|
||||||
|
],
|
||||||
|
[
|
||||||
|
(2368161, "input21")
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
def load_replacement_grids(self) -> dict:
|
||||||
|
ret = {}
|
||||||
|
for line in self.getInput():
|
||||||
|
rep, grid_string = line.split(" => ")
|
||||||
|
ret[rep] = Grid.from_str(grid_string, true_char='#')
|
||||||
|
rep_grid_size = len(rep.split("/")[0]) + 1
|
||||||
|
ret[rep].minX, ret[rep].maxX, ret[rep].minY, ret[rep].maxY = 0, rep_grid_size, 0, rep_grid_size
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def interact(self, interact_count: int) -> int:
|
||||||
|
grid = Grid.from_str('.#./..#/###')
|
||||||
|
grid_size = 3
|
||||||
|
replacements = self.load_replacement_grids()
|
||||||
|
|
||||||
|
for i in range(2 if self._current_test_file.endswith('test') else interact_count):
|
||||||
|
new_grid = Grid()
|
||||||
|
block_size = 3
|
||||||
|
replace_size = 4
|
||||||
|
if grid_size % 2 == 0:
|
||||||
|
block_size = 2
|
||||||
|
replace_size = 3
|
||||||
|
|
||||||
|
for x in range(0, grid_size, block_size):
|
||||||
|
for y in range(0, grid_size, block_size):
|
||||||
|
sub_grid = grid.sub_grid(x, y, x + block_size - 1, y + block_size - 1)
|
||||||
|
sub_grid.minX, sub_grid.minY, sub_grid.maxX, sub_grid.maxY = 0, 0, block_size - 1, block_size - 1
|
||||||
|
for f in FLIPS:
|
||||||
|
sub_grid.transform(f)
|
||||||
|
sub_grid.maxX, sub_grid.maxY = block_size - 1 + sub_grid.minX, block_size - 1 + sub_grid.minY
|
||||||
|
if str(sub_grid) in replacements:
|
||||||
|
new_grid.update(
|
||||||
|
x // block_size * replace_size,
|
||||||
|
y // block_size * replace_size,
|
||||||
|
replacements[str(sub_grid)]
|
||||||
|
)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise ValueError("No sub_grid matches found.")
|
||||||
|
|
||||||
|
grid = new_grid
|
||||||
|
grid_size = grid_size // block_size * replace_size
|
||||||
|
|
||||||
|
return grid.getOnCount()
|
||||||
|
|
||||||
|
def part1(self) -> Any:
|
||||||
|
return self.interact(5)
|
||||||
|
|
||||||
|
def part2(self) -> Any:
|
||||||
|
return self.interact(18)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
day = Day(2017, 21)
|
||||||
|
day.run(verbose=True)
|
||||||
108
inputs/input21
Normal file
108
inputs/input21
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
../.. => .#./.../###
|
||||||
|
#./.. => .#./##./#..
|
||||||
|
##/.. => #.#/#../###
|
||||||
|
.#/#. => ##./..#/###
|
||||||
|
##/#. => .#./#../..#
|
||||||
|
##/## => #../..#/#.#
|
||||||
|
.../.../... => .###/.#.#/.###/##.#
|
||||||
|
#../.../... => .##./##../##../#.##
|
||||||
|
.#./.../... => .#.#/#.#./..#./..#.
|
||||||
|
##./.../... => ###./#.##/...#/#.##
|
||||||
|
#.#/.../... => .#.#/.#../.###/.###
|
||||||
|
###/.../... => ..##/#.#./..../##.#
|
||||||
|
.#./#../... => #.../..../..../....
|
||||||
|
##./#../... => ...#/..#./.###/#.#.
|
||||||
|
..#/#../... => #.../#.##/###./##..
|
||||||
|
#.#/#../... => .##./#..#/#..#/..##
|
||||||
|
.##/#../... => .#.#/#.##/..##/.#.#
|
||||||
|
###/#../... => #.#./.###/..#./#.#.
|
||||||
|
.../.#./... => #..#/..../.##./.#.#
|
||||||
|
#../.#./... => .#../.##./.#.#/...#
|
||||||
|
.#./.#./... => ##.#/...#/.##./...#
|
||||||
|
##./.#./... => ..#./#.#./#.##/####
|
||||||
|
#.#/.#./... => ..##/#..#/.###/....
|
||||||
|
###/.#./... => .#../#..#/#.../..#.
|
||||||
|
.#./##./... => ..##/#.#./####/###.
|
||||||
|
##./##./... => ...#/.#../####/#..#
|
||||||
|
..#/##./... => ..##/##../###./....
|
||||||
|
#.#/##./... => ..##/#.../.#../.##.
|
||||||
|
.##/##./... => #.../##../#.##/...#
|
||||||
|
###/##./... => .#../####/#.##/#.##
|
||||||
|
.../#.#/... => #..#/####/###./#.#.
|
||||||
|
#../#.#/... => #.../##.#/#.../.#..
|
||||||
|
.#./#.#/... => ##.#/##.#/..#./..#.
|
||||||
|
##./#.#/... => .###/..#./.#../.###
|
||||||
|
#.#/#.#/... => .###/##../..#./..#.
|
||||||
|
###/#.#/... => ##../.#../.#../.#..
|
||||||
|
.../###/... => ..#./#.#./..#./#..#
|
||||||
|
#../###/... => ..../#.#./##.#/..##
|
||||||
|
.#./###/... => ..#./#.#./..##/.#..
|
||||||
|
##./###/... => .##./..##/#..#/#.#.
|
||||||
|
#.#/###/... => ###./###./#.##/..##
|
||||||
|
###/###/... => ##.#/..../.##./.#..
|
||||||
|
..#/.../#.. => .###/####/..../##.#
|
||||||
|
#.#/.../#.. => ##../###./#..#/...#
|
||||||
|
.##/.../#.. => ###./#..#/###./...#
|
||||||
|
###/.../#.. => #.../#..#/##.#/.##.
|
||||||
|
.##/#../#.. => ..##/####/..##/#...
|
||||||
|
###/#../#.. => #.../..../...#/..##
|
||||||
|
..#/.#./#.. => ####/#.#./..../.#.#
|
||||||
|
#.#/.#./#.. => .##./.#.#/##.#/.##.
|
||||||
|
.##/.#./#.. => ###./.#.#/###./##.#
|
||||||
|
###/.#./#.. => #.##/..##/#.#./##.#
|
||||||
|
.##/##./#.. => ..../..##/#.#./.##.
|
||||||
|
###/##./#.. => #.#./#..#/#..#/###.
|
||||||
|
#../..#/#.. => ..../####/#..#/.###
|
||||||
|
.#./..#/#.. => .###/#.../#.../#.##
|
||||||
|
##./..#/#.. => ####/##.#/###./####
|
||||||
|
#.#/..#/#.. => .#../##.#/#..#/#..#
|
||||||
|
.##/..#/#.. => ..##/##.#/#.##/###.
|
||||||
|
###/..#/#.. => ##.#/####/##.#/.#..
|
||||||
|
#../#.#/#.. => .###/#..#/.##./.###
|
||||||
|
.#./#.#/#.. => #.##/.##./.#../..#.
|
||||||
|
##./#.#/#.. => ###./..#./.##./##..
|
||||||
|
..#/#.#/#.. => .###/.#.#/#.#./##..
|
||||||
|
#.#/#.#/#.. => #..#/.###/.##./....
|
||||||
|
.##/#.#/#.. => ###./.###/#.##/.###
|
||||||
|
###/#.#/#.. => ####/.###/..../.##.
|
||||||
|
#../.##/#.. => ##.#/..../#.../..#.
|
||||||
|
.#./.##/#.. => #.../..../...#/###.
|
||||||
|
##./.##/#.. => ###./.#../..##/...#
|
||||||
|
#.#/.##/#.. => #.../...#/..#./.###
|
||||||
|
.##/.##/#.. => ###./..../##.#/...#
|
||||||
|
###/.##/#.. => ##.#/##../###./.##.
|
||||||
|
#../###/#.. => ..#./#.../..##/#.##
|
||||||
|
.#./###/#.. => ...#/.##./.#../.#..
|
||||||
|
##./###/#.. => ##.#/.#.#/###./....
|
||||||
|
..#/###/#.. => #.##/#.../####/.##.
|
||||||
|
#.#/###/#.. => .#.#/...#/#..#/..#.
|
||||||
|
.##/###/#.. => .##./#..#/#..#/.#.#
|
||||||
|
###/###/#.. => ###./####/#.##/#...
|
||||||
|
.#./#.#/.#. => ###./#..#/...#/...#
|
||||||
|
##./#.#/.#. => #.#./#.##/#.../#..#
|
||||||
|
#.#/#.#/.#. => .#.#/#.##/..../.#..
|
||||||
|
###/#.#/.#. => #.#./.#../.###/#.#.
|
||||||
|
.#./###/.#. => #.../.###/##../##.#
|
||||||
|
##./###/.#. => .###/#.../####/.#.#
|
||||||
|
#.#/###/.#. => #..#/####/#.#./#...
|
||||||
|
###/###/.#. => .#../..../.##./.#.#
|
||||||
|
#.#/..#/##. => ##../###./...#/###.
|
||||||
|
###/..#/##. => .##./###./.###/#.##
|
||||||
|
.##/#.#/##. => ..../##.#/#..#/#...
|
||||||
|
###/#.#/##. => .###/##../..../..#.
|
||||||
|
#.#/.##/##. => ####/.###/##../...#
|
||||||
|
###/.##/##. => #.##/..##/..#./#..#
|
||||||
|
.##/###/##. => ..../#.##/#.../#.##
|
||||||
|
###/###/##. => ..../#..#/#.##/#.##
|
||||||
|
#.#/.../#.# => #.../##.#/..../.#.#
|
||||||
|
###/.../#.# => ##../##../#.#./.##.
|
||||||
|
###/#../#.# => .##./.#../#.##/.##.
|
||||||
|
#.#/.#./#.# => #.../.#../####/#.##
|
||||||
|
###/.#./#.# => .###/##.#/#.../#.#.
|
||||||
|
###/##./#.# => .##./.##./.###/.#.#
|
||||||
|
#.#/#.#/#.# => ####/####/###./.##.
|
||||||
|
###/#.#/#.# => #.#./.###/...#/.#.#
|
||||||
|
#.#/###/#.# => .###/..#./..../.##.
|
||||||
|
###/###/#.# => #.#./##.#/..#./..#.
|
||||||
|
###/#.#/### => ###./#.../##../##..
|
||||||
|
###/###/### => ##.#/.#.#/#.#./...#
|
||||||
2
inputs/input21_test
Normal file
2
inputs/input21_test
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
../.# => ##./#../...
|
||||||
|
.#./..#/### => #..#/..../..../#..#
|
||||||
Loading…
Reference in New Issue
Block a user