day22
This commit is contained in:
parent
cfd6382756
commit
6a8040d4d9
90
day22.py
Normal file
90
day22.py
Normal file
@ -0,0 +1,90 @@
|
||||
from enum import Enum
|
||||
|
||||
from tools.aoc import AOCDay
|
||||
from tools.coordinate import Coordinate
|
||||
from tools.grid import Grid
|
||||
from typing import Any
|
||||
|
||||
|
||||
DIRECTIONS = [
|
||||
Coordinate(0, -1),
|
||||
Coordinate(1, 0),
|
||||
Coordinate(0, 1),
|
||||
Coordinate(-1, 0)
|
||||
]
|
||||
|
||||
|
||||
class NodeState(Enum):
|
||||
CLEAN = 0
|
||||
WEAKENED = 1
|
||||
INFECTED = 2
|
||||
FLAGGED = 3
|
||||
|
||||
|
||||
class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
(5587, "input22_test"),
|
||||
(5460, "input22")
|
||||
],
|
||||
[
|
||||
(2511944, "input22_test"),
|
||||
(2511702, "input22")
|
||||
]
|
||||
]
|
||||
|
||||
def get_init_state(self) -> (Grid, int, Coordinate):
|
||||
grid = Grid.from_str(
|
||||
"/".join(self.getInput()),
|
||||
true_char='#',
|
||||
true_value=NodeState.INFECTED,
|
||||
default=NodeState.CLEAN
|
||||
)
|
||||
|
||||
carrier_direction_index = 0
|
||||
cattier_position = Coordinate((len(self.getInput()[0]) - 1) // 2, (len(self.getInput()) - 1) // 2)
|
||||
|
||||
return grid, carrier_direction_index, cattier_position
|
||||
|
||||
def part1(self) -> Any:
|
||||
grid, carrier_direction_index, carrier_position = self.get_init_state()
|
||||
infect_count = 0
|
||||
for _ in range(10_000):
|
||||
if grid.get(carrier_position) == NodeState.INFECTED:
|
||||
carrier_direction_index = (carrier_direction_index + 1) % 4
|
||||
grid.set(carrier_position, NodeState.CLEAN)
|
||||
else:
|
||||
infect_count += 1
|
||||
carrier_direction_index = (carrier_direction_index - 1) % 4
|
||||
grid.set(carrier_position, NodeState.INFECTED)
|
||||
|
||||
carrier_position += DIRECTIONS[carrier_direction_index]
|
||||
|
||||
return infect_count
|
||||
|
||||
def part2(self) -> Any:
|
||||
grid, carrier_direction_index, carrier_position = self.get_init_state()
|
||||
infect_count = 0
|
||||
for _ in range(10_000_000):
|
||||
match grid.get(carrier_position):
|
||||
case NodeState.CLEAN:
|
||||
carrier_direction_index = (carrier_direction_index - 1) % 4
|
||||
grid.set(carrier_position, NodeState.WEAKENED)
|
||||
case NodeState.WEAKENED:
|
||||
grid.set(carrier_position, NodeState.INFECTED)
|
||||
infect_count += 1
|
||||
case NodeState.INFECTED:
|
||||
carrier_direction_index = (carrier_direction_index + 1) % 4
|
||||
grid.set(carrier_position, NodeState.FLAGGED)
|
||||
case NodeState.FLAGGED:
|
||||
carrier_direction_index = (carrier_direction_index + 2) % 4
|
||||
grid.set(carrier_position, NodeState.CLEAN)
|
||||
|
||||
carrier_position += DIRECTIONS[carrier_direction_index]
|
||||
|
||||
return infect_count
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
day = Day(2017, 22)
|
||||
day.run(verbose=True)
|
||||
25
inputs/input22
Normal file
25
inputs/input22
Normal file
@ -0,0 +1,25 @@
|
||||
..######.###...######...#
|
||||
.##..##.#....#..##.#....#
|
||||
.##.#....###..##.###.#.#.
|
||||
#.#.###.#####.###.##.##.#
|
||||
.###.#.#.###.####..##.###
|
||||
..####.##..#.#.#####...##
|
||||
....##.###..#.#..#...####
|
||||
.#.##.##.#..##...##.###..
|
||||
.######..#..#.#####....##
|
||||
###.##.###.########...###
|
||||
.#.#.#..#.##.#..###...#..
|
||||
.#.##.#.####.#.#.....###.
|
||||
##..###.###..##...#.##.##
|
||||
##.#.##..#...##...#...###
|
||||
##..#..###.#..##.#.#.#.#.
|
||||
.##.#####..##....#.#.#..#
|
||||
..#.######.##...#..#.##..
|
||||
#.##...#.#....###.#.##.#.
|
||||
.#..#.#.#..#.####..#.####
|
||||
.##...##....##..#.#.###..
|
||||
..##.#.#.##..##.#.#....#.
|
||||
###.###.######.#.########
|
||||
..#.####.#.#.##..####...#
|
||||
#.##..#.#.####...#..#..##
|
||||
###.###.#..##..#.###....#
|
||||
3
inputs/input22_test
Normal file
3
inputs/input22_test
Normal file
@ -0,0 +1,3 @@
|
||||
..#
|
||||
#..
|
||||
...
|
||||
Loading…
Reference in New Issue
Block a user