day 9
This commit is contained in:
parent
9b90be8141
commit
255c440a98
118
src/day9.py
Normal file
118
src/day9.py
Normal file
@ -0,0 +1,118 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.console import Console
|
||||
from cpl_core.utils import String
|
||||
from cpl_query.enumerable import Enumerable
|
||||
from cpl_query.extension import List
|
||||
from cpl_core.pipes import *
|
||||
|
||||
from aoc.aoc import get_input
|
||||
|
||||
# global vars
|
||||
day = 9
|
||||
aoc_input = get_input(2022, day)
|
||||
aoc_input1 = """R 5
|
||||
U 8
|
||||
L 8
|
||||
D 3
|
||||
R 17
|
||||
D 10
|
||||
L 25
|
||||
U 20"""
|
||||
|
||||
|
||||
@dataclass
|
||||
class Position:
|
||||
x: int = 0
|
||||
y: int = 0
|
||||
|
||||
def __repr__(self):
|
||||
return f'({self.x}, {self.y})'
|
||||
|
||||
@property
|
||||
def as_tuple(self) -> tuple[int, int]:
|
||||
return self.x, self.y
|
||||
|
||||
|
||||
def get_new_tail(head: Position, tail: Position) -> Position:
|
||||
diff = Position(head.x - tail.x, head.y - tail.y)
|
||||
bias = Position(0 if diff.x == 0 else int(diff.x / abs(diff.x)), 0 if diff.y == 0 else int(diff.y / abs(diff.y)))
|
||||
|
||||
if abs(diff.x) <= 1 and abs(diff.y) <= 1:
|
||||
return tail
|
||||
|
||||
return Position(tail.x + bias.x, tail.y + bias.y)
|
||||
|
||||
|
||||
def part1():
|
||||
head = Position(0, 0)
|
||||
tail = Position(0, 0)
|
||||
start = Position(0, 0)
|
||||
|
||||
steps = {tail.as_tuple}
|
||||
|
||||
for line in aoc_input.splitlines():
|
||||
step, width = line.split()
|
||||
for i in range(0, int(width)):
|
||||
match step:
|
||||
case 'R':
|
||||
head.x += 1
|
||||
|
||||
case 'L':
|
||||
head.x -= 1
|
||||
|
||||
case 'U':
|
||||
head.y += 1
|
||||
|
||||
case 'D':
|
||||
head.y -= 1
|
||||
|
||||
tail = get_new_tail(head, tail)
|
||||
steps.add(tail.as_tuple)
|
||||
|
||||
Console.write_line(start, head, tail)
|
||||
Console.write_line(len(steps), steps)
|
||||
|
||||
|
||||
def part2():
|
||||
head = Position(0, 0)
|
||||
tails = List(int).range(0, 9).select(lambda x: Position(0, 0))
|
||||
|
||||
steps = {tails.last().as_tuple}
|
||||
|
||||
for line in aoc_input.splitlines():
|
||||
step, width = line.split()
|
||||
for i in range(0, int(width)):
|
||||
match step:
|
||||
case 'R':
|
||||
head.x += 1
|
||||
|
||||
case 'L':
|
||||
head.x -= 1
|
||||
|
||||
case 'U':
|
||||
head.y += 1
|
||||
|
||||
case 'D':
|
||||
head.y -= 1
|
||||
|
||||
last_t = head
|
||||
new_tails = List(Position)
|
||||
for t in tails.to_list():
|
||||
new_t = get_new_tail(last_t, t)
|
||||
new_tails.add(new_t)
|
||||
last_t = new_t
|
||||
|
||||
tails = new_tails
|
||||
steps.add(tails.last().as_tuple)
|
||||
|
||||
Console.write_line(head, tails.last())
|
||||
Console.write_line(len(steps), steps)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
Console.write_line(f'Advent of code day {day}')
|
||||
part1()
|
||||
part2()
|
||||
Console.write_line()
|
Loading…
Reference in New Issue
Block a user