2022 Day 23 Python
This commit is contained in:
parent
ced649e5d3
commit
8bdb3ff89d
|
@ -0,0 +1,86 @@
|
||||||
|
from helpers import *
|
||||||
|
lines = read_day(23).split('\n')
|
||||||
|
sample_lines = '''
|
||||||
|
....#..
|
||||||
|
..###.#
|
||||||
|
#...#.#
|
||||||
|
.#...##
|
||||||
|
#.###..
|
||||||
|
##.#.##
|
||||||
|
.#..#..
|
||||||
|
'''.strip().split('\n')
|
||||||
|
|
||||||
|
def get_intention(round, elves, x, y):
|
||||||
|
adj_nw = (x-1,y-1) in elves
|
||||||
|
adj_w = (x-1,y) in elves
|
||||||
|
adj_sw = (x-1,y+1) in elves
|
||||||
|
adj_n = (x,y-1) in elves
|
||||||
|
adj_s = (x,y+1) in elves
|
||||||
|
adj_ne = (x+1,y-1) in elves
|
||||||
|
adj_e = (x+1,y) in elves
|
||||||
|
adj_se = (x+1,y+1) in elves
|
||||||
|
if adj_nw or adj_n or adj_ne or adj_w or adj_e or adj_sw or adj_s or adj_se:
|
||||||
|
for i in range(4):
|
||||||
|
direction = (round + i) % 4
|
||||||
|
if (direction == 0) and not (adj_n or adj_nw or adj_ne):
|
||||||
|
return (x,y-1) # move north
|
||||||
|
if (direction == 1) and not (adj_s or adj_sw or adj_se):
|
||||||
|
return (x,y+1) # move south
|
||||||
|
if (direction == 2) and not (adj_w or adj_nw or adj_sw):
|
||||||
|
return (x-1,y) # move west
|
||||||
|
if (direction == 3) and not (adj_e or adj_ne or adj_se):
|
||||||
|
return (x+1,y) # move east
|
||||||
|
return (x,y) # no movement
|
||||||
|
|
||||||
|
def simulate(lines: list[str], rounds: int = 10) -> set[tuple[int,int]]:
|
||||||
|
# position = np.array([[c=='#' for c in line] for line in lines], dtype=np.bool8)
|
||||||
|
elves = set()
|
||||||
|
for row, line in enumerate(lines):
|
||||||
|
for col, c in enumerate(line):
|
||||||
|
if c == '#':
|
||||||
|
elves.add((col, row))
|
||||||
|
|
||||||
|
for round in range(rounds):
|
||||||
|
if round == 10:
|
||||||
|
print(f'*** Part 1: ground tiles after round #10: {get_rect(elves)} ***')
|
||||||
|
# else:
|
||||||
|
# print(f'\tground tiles before round #{round+1}: {get_rect(elves)}')
|
||||||
|
# print(f'performing round #{round+1}')
|
||||||
|
next_elves = {}
|
||||||
|
for x,y in sorted(elves, key=lambda p: (p[1], p[0])):
|
||||||
|
intention = get_intention(round, elves, x, y)
|
||||||
|
# print(f'{x,y} wants to move to {intention}')
|
||||||
|
next_elves[intention] = next_elves.get(intention, []) + [(x,y)]
|
||||||
|
old_elves = elves
|
||||||
|
elves = set()
|
||||||
|
for position, elf_intentions in next_elves.items():
|
||||||
|
if len(elf_intentions) == 1:
|
||||||
|
elves.add(position)
|
||||||
|
else:
|
||||||
|
# print(f'conflict: {len(elf_intentions)} elves tried to move to {position}')
|
||||||
|
elves |= set(elf_intentions) # neither move
|
||||||
|
if old_elves == elves:
|
||||||
|
print(f'*** Part 2: No elves moved in round #{round+1} ***')
|
||||||
|
break
|
||||||
|
print(f'Final ground tiles: {get_rect(elves)}')
|
||||||
|
return elves
|
||||||
|
|
||||||
|
def get_rect(elves: set[tuple[int,int]]):
|
||||||
|
x0, x1, y0, y1 = None, None, None, None
|
||||||
|
for x,y in elves:
|
||||||
|
if x0 is None or x < x0:
|
||||||
|
x0 = x
|
||||||
|
if x1 is None or x > x1:
|
||||||
|
x1 = x
|
||||||
|
if y0 is None or y < y0:
|
||||||
|
y0 = y
|
||||||
|
if y1 is None or y > y1:
|
||||||
|
y1 = y
|
||||||
|
# print(f'Elves in rectangle from x:{x0}~{x1}, y:{y0}~{y1}')
|
||||||
|
# for y in range(y0, y1+1):
|
||||||
|
# print(''.join(('#' if (x,y) in elves else '.' for x in range(x0,x1+1))))
|
||||||
|
rect_size = (x1-x0+1)*(y1-y0+1) # inclusive
|
||||||
|
return rect_size - len(elves)
|
||||||
|
|
||||||
|
simulate(sample_lines, 100)
|
||||||
|
simulate(lines, 100000)
|
|
@ -0,0 +1,73 @@
|
||||||
|
.##.#.....##.#.......#..#####....#####...#..###..#.#..#...#.##...###.##.#
|
||||||
|
....##..##..........##.#..#.##...#.#.#...##..#..#####.#..#..#.#..#..####.
|
||||||
|
#.####.##..##.##.#####.#####...#.....#...####..##.##..###..##..#####..#..
|
||||||
|
..###.#.##....#.###.#..#####..##.####..###.####.######....###.#####...#..
|
||||||
|
#.#..#..#....#...####.#.....##..#.###.....##.#.#...#.#.##.######.#.#...##
|
||||||
|
....##..####..#.#...##....##.#.#...##..##..#....#..####.#.#########.....#
|
||||||
|
.#.###.##....#####.###..#.#......#.####.#....#.######.##..##...#####.##..
|
||||||
|
...######..##..#####.###.#.......##.#.#..######.###.##..#.##......#.##.#.
|
||||||
|
.#..######.#.##..##.#.###.####.#.#.#..##.###..#.##..#..#..#.###...#.#.###
|
||||||
|
.#.#.#...#.###..#..###.#.#...###.#####..#.##.#...#....###.##..#..#######.
|
||||||
|
####.#.###....###....#.#..##.......###.#.##.#....#..#........#..##...##.#
|
||||||
|
#..#...##.........#.#.####..####.####.#..####.....#....##..#..##.####...#
|
||||||
|
#...##..#...#..#.#.###.#.#.##..####....#######..####..#..#.##.#.####.##..
|
||||||
|
..##.##.##....#..##.###.#.#.#.#..####..##.#.#....##..###.#..#.#.#.#.....#
|
||||||
|
####.#.#..#..####.#.####.#.#..#...##...#.#..###.##......#....##.....##...
|
||||||
|
.#..##..##.....#.#.#.##..##..####.#.#.###.###.#...#..##....#...##..#.##..
|
||||||
|
#.#...#.##.#..#...#.##.#####...#..#..###....###...##.#.#...#.#######...##
|
||||||
|
#.##.#...#...###.###.#.######..##.####.#.###.##..#....#.#.#.#..#.#.####.#
|
||||||
|
.##.#.##.####.#.##..#.#.....##..##.#..#..#.#...####..#..#.#.#.....#####..
|
||||||
|
.#.#.#....#..##.##.####.###.#...###..#.#.#....##..##..#...#..##.#.##...##
|
||||||
|
###....#.#.##...###..##...#.#...#..#.###..#.###.##..#.....#.#.#.#.####...
|
||||||
|
##..##...###..##..###.###.##.######.##.......#..#....#.#.#..###.#.###.##.
|
||||||
|
#.#####..#####.....#.##.#.#..###..###.#...#.####.#.#.##.####.#.#..#....##
|
||||||
|
#.#.#...##...#.###..#.#####.#.##....#..#..##.##..###....#.####...##......
|
||||||
|
.....#.#####.....#.##...###.##.#..#.####.####........####.#.##..##.###.#.
|
||||||
|
.....#.###.#.#.##..##.###..###.#####......###..##....#.......##..#....#.#
|
||||||
|
###.#..#.##...#.###.#####.....#..####.####.###.....#.#..#....##.#...####.
|
||||||
|
#####.##.###.#.###.####....##.#.#.##....#.##.##......##.#.###..###.##.#.#
|
||||||
|
.###.##.#.#.#.#..#.#..#.##......##.#.###...#####..#.##.....#.#.##....##.#
|
||||||
|
#..###..#...#####..####...###.#.#.#.###.#..####..#.#.#....#.#.#.#...##.##
|
||||||
|
#..#.###.#....#....#..##.#..#......#..#.##.......#.#.#.#.####..#.##.##.##
|
||||||
|
..###.####.##..#...##.#..##.##.###......#..#.###..#..##.#..#####....#...#
|
||||||
|
.#.##..###...###.#..###.######.#...######..#..##.####.###.#.####..####.##
|
||||||
|
.#.###.##..##.####..####.#....####.###.###.##.##########.#...#.#....#....
|
||||||
|
.....#.#....###..#..##.##..###..#...#..##...##.##....##...#.##..##..#...#
|
||||||
|
.....##..#######...#..#..#.####.#.#...#...##...##.##.#...#..###.#...#.##.
|
||||||
|
..#.#####.#.#.#..##..#....########.##..#.#.###...#.####..#.......#..#...#
|
||||||
|
#.##....###.##..##.....#..##..###..###.#..#.#.##.#..#....#......#####.#.#
|
||||||
|
....#.##...#......####..#.####.#..#.#....#.#.#...##..##.##..#..#..##.#.#.
|
||||||
|
.##.#....#.#...#..##...##..#..#..##.#.#..##..#..#.##..#.....#####..##.#.#
|
||||||
|
##.#.########..#.#######..####.#..##..###.#..#.#.####.##.....#.#...#...#.
|
||||||
|
..#...#..##..#.##.###..####.###....#..#.........###..##..##.#..#...#.#.#.
|
||||||
|
.#.##....#.#..##.#..######.##..#...##....#.###..###.#.#..#.#.####..#...##
|
||||||
|
#.##.#.#.#.#..#.#..#####..#..#####...#..##..######.######.#.#..####....##
|
||||||
|
...##..#....##...##...#....#.##.....###.##....#..#...#.#.#..#..#..#..#..#
|
||||||
|
#.##..##.....#.#.##...#..##.#......#...#..#######.##..##....#.##..###..##
|
||||||
|
##...##..#...#.#.#..#.##.#.###.#..#..#######..######..#....###..#.#.###..
|
||||||
|
.....##.#....##..........#....##..#.##....##..#..#.###.#...##..##.#...##.
|
||||||
|
#.#.###.#.#..#..#..#.#.#..#..#.####..##..#..###.#..#..#.#.###..#.#..#....
|
||||||
|
#..##.#..##..#...#...#....#..#..###..##..#..#..#.#..#..#....#.#..####.##.
|
||||||
|
#..####.####.###.#..#..#..####..###..#..#.#.#..##..#..#......######.....#
|
||||||
|
#....####.....##..####....#....#.#...#..#.####...##.##.#.###..##.###.####
|
||||||
|
..####.#..#.####.##....##########....###.####.##..##......#.##.#..#..####
|
||||||
|
.#.#...#.#.##.##.....##..#....#.#...#.#..#...#..###..#....##..#....#.#.##
|
||||||
|
##....#.#......##..#.#.#......##...#...#.#..##...#....###.##....#.##.....
|
||||||
|
###.#..##.#.####....#...##.....###.....#..#.#...#.#.##....##.#..##.#.#..#
|
||||||
|
.#.##.#.....#.#######...#.##...##..###.#.#.##.####.....###..#.##.##.###.#
|
||||||
|
#.###.###..#######.#..#..##.####.###...####..#..###.#.##....#....##..####
|
||||||
|
#..##.###.#.#.####.##..##.##.#.#........##....#...###..#.###....##.......
|
||||||
|
.###.#.##..#.#..########....#.##........#.#.....#.#.##.#####.#..######...
|
||||||
|
#.#.#..###.##..###.#.##..##.#.#######...#...###.#.#.##..#..####..#..#####
|
||||||
|
#.####.##.#.###..##.#..##.....###.#######.###...######..##....#.#..#####.
|
||||||
|
.##.##.######.#..##...##..###..####...##....#.####.###.#...##..#####...##
|
||||||
|
####..#.####.#..###.#....##..#.#....##.#.###.....#...#..#..#..##...#..##.
|
||||||
|
.#.##.....##.#.#.#..#.#...##.#####...#...#..###...#..####.#...#..###...##
|
||||||
|
#.###.##...##.#.#..#.#.####...#.#.##..#.#..###.##.#..#..##.#.#.##.#..###.
|
||||||
|
#..####.#.#..##..#...#..#.#.#....#..#.#####.....#..#.....#.#.##.#.#..#.##
|
||||||
|
.#..###.#...#..#.#.####.#..#.#.#.....#...#.#.#..###...##.#..########.....
|
||||||
|
.#.#....##.###.#.#.#.######...#.#.######.#.#.####.##..#.#..#..####.#.#...
|
||||||
|
##.#.###.###.#####...##.#..#.####.#...#..#......###.##..##.#.#.....#..#..
|
||||||
|
.##....###.#.....###...####..#....#.#.#..#####.#.#..#.###..#.....#.#.###.
|
||||||
|
..#..#.#..##..#..#...#.#....#.##..##.######.###...##..#.#####...#.##.##..
|
||||||
|
.#.##.#..#..###...#####.##.....###.####...#...###....##.#.#.#..##...#..##
|
Loading…
Reference in New Issue