day23
This commit is contained in:
parent
8dd26033e3
commit
a82057d89c
85
day23.py
Normal file
85
day23.py
Normal file
@ -0,0 +1,85 @@
|
||||
from collections import defaultdict
|
||||
|
||||
from tools.aoc import AOCDay
|
||||
from tools.coordinate import Coordinate
|
||||
from tools.grid import Grid
|
||||
from typing import Any
|
||||
|
||||
|
||||
CHECK_ORDER = [
|
||||
(Coordinate(0, -1), Coordinate(-1, -1), Coordinate(1, -1)),
|
||||
(Coordinate(0, 1), Coordinate(1, 1), Coordinate(-1, 1)),
|
||||
(Coordinate(-1, 0), Coordinate(-1, 1), Coordinate(-1, -1)),
|
||||
(Coordinate(1, 0), Coordinate(1, 1), Coordinate(1, -1))
|
||||
]
|
||||
|
||||
|
||||
def move_elfs(map: Grid, round: int) -> bool:
|
||||
order_index = round % 4
|
||||
|
||||
move_to = {}
|
||||
proposed_positions = defaultdict(int)
|
||||
for elf in map.getActiveCells():
|
||||
if map.getNeighbourSum(elf, includeDiagonal=True) == 0:
|
||||
continue
|
||||
|
||||
for i in range(4):
|
||||
check_dir = CHECK_ORDER[(order_index + i) % 4]
|
||||
free = True
|
||||
for check_pos in check_dir:
|
||||
if map.get(elf + check_pos):
|
||||
free = False
|
||||
break
|
||||
|
||||
if free:
|
||||
move_to[elf] = elf + check_dir[0]
|
||||
proposed_positions[elf + check_dir[0]] += 1
|
||||
break
|
||||
|
||||
if not move_to:
|
||||
return False
|
||||
|
||||
for elf, target in move_to.items():
|
||||
if proposed_positions[target] == 1:
|
||||
map.toggle(elf)
|
||||
map.toggle(target)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
(25, "input23_test_small"),
|
||||
(110, "input23_test"),
|
||||
(3766, "input23"),
|
||||
],
|
||||
[
|
||||
(20, "input23_test"),
|
||||
(954, "input23"),
|
||||
]
|
||||
]
|
||||
|
||||
def part1(self) -> Any:
|
||||
map = Grid.from_str("/".join(self.getInput()), true_char='#')
|
||||
|
||||
for i in range(10):
|
||||
if not move_elfs(map, i):
|
||||
break
|
||||
|
||||
map.recalcBoundaries()
|
||||
return (map.maxX - map.minX + 1) * (map.maxY - map.minY + 1) - map.getOnCount()
|
||||
|
||||
def part2(self) -> Any:
|
||||
map = Grid.from_str("/".join(self.getInput()), true_char='#')
|
||||
round = 0
|
||||
|
||||
while move_elfs(map, round):
|
||||
round += 1
|
||||
|
||||
return round + 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
day = Day(2022, 23)
|
||||
day.run(verbose=True)
|
||||
70
inputs/input23
Normal file
70
inputs/input23
Normal file
@ -0,0 +1,70 @@
|
||||
.#...#..#..#.##...#.##..#.#####.#........##.##....#..#.#.#.#....#..###
|
||||
#..#.#...#..#.#.#.###...#...#.########..#..####.....#.#..###..###.##..
|
||||
###....#....#.##.#....###..#...###..###...#####.#..##.#.##.#.#.....#.#
|
||||
...#.###..#####.##..#......#......##..#..#..###.##.#...#.##..#...##...
|
||||
.......#.####.#.##...#..##..###.....##.###.#...###.###...##.#..#.#...#
|
||||
..#.##.#.##.#...##.#.###..#.##..#......#...#####.#.#.#.####.#..#..##.#
|
||||
.#..######...#.##.##..#.########....#.....#.##..#....###.#.##..######.
|
||||
.#..##.#....#.#.##..##..#...###.#.##.###..#.#.#.##.#..########..#..#.#
|
||||
.###.###.###.##..#.#..#...##..####..###..###.##..##.#..#...###.#.#####
|
||||
.#####...#####.#.###...###...##.###.#.#.#..#...###.#.#.#.....#.##..#.#
|
||||
#.#....#######.#...###.###...##.##....###..###..#..###.#...#.#..##.##.
|
||||
...###.####....#.#....#.###....####...#...#..##......##.##.#..#.#.###.
|
||||
.#...#...##..####....##..##.#..###.#.##..####.#...........####....###.
|
||||
...###...#.#.#.###.########..###..##..#.#.#.####..#..#.##..###.#####..
|
||||
#..##...###.####..#....#..##.###.##.#...###.##..#..#.##..#....#######.
|
||||
##.##.....##..##..###.#..#.#.#..#..#....##.#........#.#.#####......#..
|
||||
...##........#.###..##.#.##..####..#####...##....####...#.###...#.....
|
||||
..#####.###.#.#..#.#.#..#...#.##..#..#.#...#..#.#..###..#....#.##.....
|
||||
....##.###..#..#..######.###.##.#.###.#.###..###.#..#..##.#.......##..
|
||||
##..#..#......###.#..##.##.#...##...##...#..#.......#....#.#.#.###...#
|
||||
###....#..#..#..#.#..#...##.##...#.#.#.#.#..#..###.####..##...#.##..##
|
||||
#.......####.####.#.#.###.......#.......#.###..#.#.###.######..#......
|
||||
.#.#.#.##.#.##.#####..##.#.####.#......##.###.#..######..#...#..##...#
|
||||
##.....###..###..#.####.#########.####..###.#...#..###.#..###.#..#.##.
|
||||
###.#.#.###..##....#.###.#.##..#....#..####.#..###..##.....#....#...#.
|
||||
....#..##..###.##.###.##.##.##..#..#.#.#.##.###..########.#.##.#..#.#.
|
||||
##....##..#....##..###...#####.##.#...###.##...#####..#..###.#.#..#.##
|
||||
.#.##.#.##...###.....#......#.###.#.###...##...#.##.##..#.####...##.##
|
||||
..###.#..###...#.###.##..#....#.#.#...#.#..#...##....##...#....#..##.#
|
||||
####.#.#..#...###..###...#.###...#...###..#####.#.#..##...##.......###
|
||||
..#.##.##..#.#.#.#.##....##..#....##..##.##..#....###....#..##..#..###
|
||||
..###.#...###.#.#..#.####..#.#.##...##..#######..##.#.##.##.#.#.#.##..
|
||||
..#..##.#..######...##.##...#.#.####.##.#...#.......##.#..##.#.#.##.##
|
||||
.....##....#####...#....#.#....#####...#..##.......########..####.##.#
|
||||
#.#.#..#...####.####.##....#..#.###.##....#..#...#..#..#.#.###..##.###
|
||||
.#..#...#..#....#.###.##..#..##.####.####..##...##..###.#####..###.#.#
|
||||
..#.##.######..#.#..#.#..##.#.#......#.#.#..#.#.#..#.##..#....#...#...
|
||||
...##...##.##.#.##....#.####...#..#.#.....#.#.###...#.....#.###..#...#
|
||||
###.##.#.#.........#####..#.#...#.##..##.#.######.#.....##..##.#.##.#.
|
||||
##.#.#.##..#...#.....#####....#...#...#..#...#.##...###.####....#..###
|
||||
#.#....#.###....#..#....###.####...###.##..#..##...############.####..
|
||||
.#..#...##.##...#.##.##.#.#...#.##..#....#...##....##.#.#.....#...#...
|
||||
##.###.#.#####.#.#.#####.#.###.....##.#.#.##.#..#.###..#.....#.....#..
|
||||
#.#...#.##..#.##..###.....#.###......#.#.####...#..#..##....##.#.#..##
|
||||
.#.##.#.##..###.##.#.##.##.#.##.#.##..###...##....#..#....###..####..#
|
||||
...#......#.#.###.....####.##.####.####.#..#######....##....#.###..##.
|
||||
##.##..#..#.#.#.####.#.#...####.#..#.#..####.##.##.#...#..#...##.#....
|
||||
#..#####..#.....###.#.....#.#.####..##....##..###.##.##..#..##....####
|
||||
..##..###..#..###.#..#..#.######..#...#...#..###..#..#.#.########.#.#.
|
||||
.#####..##.#...##..####..#..####...###.###.#.###......##.#..##.#...#.#
|
||||
####..#...#.#..#...###..##.#.#.##.....#.#.##...##..####.####.....###..
|
||||
...#.....##.##...#..##..#.#..##.##.#.#..##...#.#....#..##....######...
|
||||
....#..####.#.#...####.....#.#.###.....##...##..###..#...###........#.
|
||||
..##.......#.####...#.##..##.##.#.#....#...#.##..#...#...########.###.
|
||||
....###..#.####.##.###........###.##..####.#.##.#.##...###..#.#..##.##
|
||||
.#####....#.#.###.#.##...#..#.#.##...#.#...##..##........#####..####..
|
||||
#.#.#.#.##..###.###..#..#..####.........##.##...#....##.#####.#####.#.
|
||||
..#.###..#..##..#.......#.#...#..##.#.#.......##.#####.####.#.##.#..##
|
||||
#.......####....#.##.#.#..#.....#.#####..#....###.#....##...##.#.#...#
|
||||
#...####.##.#####..#####..#.#.#..###...####..##..#.##.#####.#.####.##.
|
||||
....#.#..#.#...###....###.######..#.####.....#....###..##..#.####.##..
|
||||
.#..##...##..##.###.##.###....#..#....#..###.##....#......####...#.###
|
||||
##.##.......##.#..##.#....#.##.#.###.....##.#.#....##.....###.#..#.#..
|
||||
#.#.#..#..#...###.......#.#..#.###.#..#...###.#####.#.#..####...##.##.
|
||||
..#.####.####..##....####.###...###.###..#..#..###.####.##...#####....
|
||||
##.#.#.....#.#.##...##...##..#..#...###....#.#.#..##....#####...#####.
|
||||
##.#....#..##.#.######.#.#....##.#.##.####.###.#.......##...##.#..##.#
|
||||
####.###..#.#.#...##.#...##...#...#.#.##..#..#.##.##.###..#...####....
|
||||
##.##.....#.#..#.....###.###.############.###.#..####..#.#.#.#...###.#
|
||||
...#.#.#.###..####..#......##.##.###..##..#####..#.##.#.#.##.#######..
|
||||
7
inputs/input23_test
Normal file
7
inputs/input23_test
Normal file
@ -0,0 +1,7 @@
|
||||
....#..
|
||||
..###.#
|
||||
#...#.#
|
||||
.#...##
|
||||
#.###..
|
||||
##.#.##
|
||||
.#..#..
|
||||
6
inputs/input23_test_small
Normal file
6
inputs/input23_test_small
Normal file
@ -0,0 +1,6 @@
|
||||
.....
|
||||
..##.
|
||||
..#..
|
||||
.....
|
||||
..##.
|
||||
.....
|
||||
Loading…
Reference in New Issue
Block a user