diff --git a/day14.py b/day14.py new file mode 100644 index 0000000..246a173 --- /dev/null +++ b/day14.py @@ -0,0 +1,76 @@ +from tools.aoc import AOCDay +from tools.coordinate import Coordinate +from tools.grid import Grid +from tools.tools import compare +from typing import Any + + +class Day(AOCDay): + inputs = [ + [ + (12, "input14_test"), + (225648864, "input14"), + ], + [ + (7847, "input14"), + ], + ] + + def parse_input(self) -> list[tuple[tuple[int, int], tuple[int, int]]]: + robots = [] + for line in self.getInput(): + p, v = line.split() + px, py = map(int, p[2:].split(",")) + vx, vy = map(int, v[2:].split(",")) + robots.append(((px, py), (vx, vy))) + + return robots + + def move_robots( + self, robots: list[tuple[tuple[int, int], tuple[int, int]]], steps: int = 100 + ) -> tuple[tuple[int, int], list[tuple[tuple[int, int], tuple[int, int]]]]: + if self.is_test(): + dim = (11, 7) + else: + dim = (101, 103) + + return dim, [ + (((x[0][0] + steps * x[1][0]) % dim[0], (x[0][1] + steps * x[1][1]) % dim[1]), x[1]) for x in robots + ] + + def part1(self) -> Any: + q = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] + dim, robots = self.move_robots(self.parse_input()) + for robot in robots: + q[compare(robot[0][1], dim[1] // 2) + 1][compare(robot[0][0], dim[0] // 2) + 1] += 1 + + return q[0][0] * q[2][0] * q[0][2] * q[2][2] + + def part2(self) -> Any: + robots = self.parse_input() + + count = 0 + while True: + count += 1 + _, new_robots = self.move_robots(robots, steps=1) + g = Grid() + for robot in new_robots: + g.set(Coordinate(robot[0][0], robot[0][1])) + + found = False + for c in g.getActiveCells(): + if len(set(g.getRegion(c))) > 50: + found = True + break + + if found: + break + + robots = new_robots + + return count + + +if __name__ == "__main__": + day = Day(2024, 14) + day.run(verbose=True) diff --git a/inputs/input14 b/inputs/input14 new file mode 100644 index 0000000..6cb1918 --- /dev/null +++ b/inputs/input14 @@ -0,0 +1,500 @@ +p=89,15 v=-45,26 +p=93,33 v=-77,-46 +p=25,62 v=41,-10 +p=87,78 v=37,-5 +p=46,69 v=44,-14 +p=86,57 v=-74,-91 +p=83,97 v=82,-89 +p=4,98 v=76,9 +p=8,91 v=24,48 +p=84,10 v=96,74 +p=2,16 v=-93,-95 +p=37,36 v=-30,-15 +p=47,48 v=-10,-96 +p=90,24 v=-74,-84 +p=41,31 v=19,-25 +p=49,57 v=11,-78 +p=98,57 v=86,77 +p=47,67 v=-42,16 +p=55,99 v=-1,22 +p=23,89 v=-70,4 +p=3,6 v=-69,-78 +p=62,33 v=42,-23 +p=50,5 v=-75,74 +p=0,54 v=-53,84 +p=21,60 v=90,98 +p=50,44 v=-10,23 +p=43,9 v=-59,-41 +p=19,45 v=-63,-58 +p=85,22 v=24,-73 +p=50,102 v=52,-41 +p=44,11 v=-24,33 +p=3,46 v=-54,-4 +p=16,16 v=-73,30 +p=19,38 v=-50,88 +p=75,31 v=-76,-26 +p=72,83 v=-87,64 +p=51,80 v=85,53 +p=21,75 v=94,-11 +p=99,6 v=-44,44 +p=72,101 v=63,-85 +p=75,24 v=46,-96 +p=100,28 v=-67,84 +p=24,51 v=12,6 +p=20,85 v=-86,51 +p=55,37 v=-75,-31 +p=48,89 v=-75,-94 +p=75,67 v=30,-76 +p=9,6 v=18,-25 +p=64,62 v=43,-98 +p=78,93 v=-50,-60 +p=51,48 v=-75,-64 +p=86,77 v=-94,33 +p=35,35 v=-50,-19 +p=72,31 v=-62,-41 +p=66,42 v=-93,-85 +p=88,23 v=99,-8 +p=43,0 v=-72,-23 +p=15,81 v=81,-31 +p=39,70 v=45,-76 +p=77,68 v=-19,-54 +p=74,10 v=37,1 +p=89,95 v=-51,-88 +p=17,93 v=77,4 +p=16,99 v=-8,41 +p=32,83 v=35,86 +p=95,31 v=-32,4 +p=46,74 v=68,64 +p=21,81 v=57,-82 +p=71,68 v=32,49 +p=15,1 v=23,-75 +p=51,6 v=26,36 +p=40,38 v=-33,73 +p=44,91 v=91,-93 +p=53,95 v=-39,-28 +p=20,82 v=15,-33 +p=64,74 v=85,59 +p=27,93 v=-9,-92 +p=62,68 v=-20,-69 +p=10,102 v=8,-73 +p=47,43 v=-79,-21 +p=94,93 v=-64,63 +p=77,4 v=50,-88 +p=38,33 v=99,48 +p=34,35 v=-74,70 +p=42,82 v=29,-17 +p=6,29 v=34,-63 +p=72,35 v=14,94 +p=47,14 v=-27,-54 +p=0,72 v=-1,-96 +p=10,64 v=-83,11 +p=65,70 v=-16,-5 +p=5,43 v=32,-74 +p=23,67 v=87,-27 +p=54,57 v=26,71 +p=77,55 v=36,-86 +p=22,0 v=8,20 +p=59,69 v=82,6 +p=53,67 v=52,-49 +p=37,10 v=95,41 +p=48,71 v=-95,-43 +p=52,55 v=-22,17 +p=9,32 v=-57,-52 +p=100,12 v=-41,-29 +p=81,53 v=79,-90 +p=20,86 v=28,-50 +p=13,19 v=-96,-29 +p=10,57 v=-96,-10 +p=90,84 v=-73,34 +p=31,85 v=87,-17 +p=9,12 v=25,74 +p=98,18 v=-83,29 +p=11,36 v=34,-99 +p=30,75 v=-70,-19 +p=61,34 v=56,2 +p=35,96 v=91,-46 +p=41,12 v=-69,3 +p=66,91 v=92,75 +p=47,54 v=94,88 +p=40,80 v=72,37 +p=81,35 v=-74,51 +p=43,65 v=-20,-38 +p=8,58 v=38,1 +p=19,24 v=93,95 +p=82,82 v=-88,28 +p=91,51 v=-74,77 +p=72,80 v=-42,21 +p=100,15 v=-72,54 +p=39,87 v=-36,8 +p=21,52 v=-30,88 +p=8,55 v=-91,-85 +p=99,45 v=63,45 +p=3,72 v=84,5 +p=55,39 v=13,83 +p=10,96 v=39,78 +p=66,81 v=10,-22 +p=43,60 v=29,-32 +p=46,75 v=78,-76 +p=94,48 v=66,22 +p=94,13 v=-35,91 +p=16,63 v=-66,-33 +p=4,2 v=72,-46 +p=64,88 v=45,-62 +p=63,9 v=16,-84 +p=25,7 v=12,25 +p=22,84 v=15,5 +p=100,72 v=-93,49 +p=42,29 v=29,-52 +p=78,67 v=-19,87 +p=64,60 v=91,-22 +p=32,51 v=35,-97 +p=30,5 v=7,-14 +p=13,82 v=-41,-76 +p=89,24 v=-12,-19 +p=4,25 v=57,24 +p=57,95 v=99,-7 +p=45,59 v=81,-75 +p=12,42 v=87,-64 +p=84,20 v=17,-67 +p=18,53 v=25,66 +p=15,59 v=82,32 +p=18,78 v=-60,48 +p=70,33 v=10,30 +p=53,42 v=-10,39 +p=74,26 v=89,-24 +p=11,3 v=67,84 +p=40,96 v=-82,69 +p=99,50 v=-2,77 +p=18,99 v=2,4 +p=94,26 v=37,78 +p=74,21 v=-91,-53 +p=85,47 v=-62,-2 +p=90,61 v=99,60 +p=44,95 v=65,91 +p=46,83 v=-20,-93 +p=12,16 v=44,-51 +p=28,86 v=81,42 +p=34,99 v=-82,-25 +p=31,13 v=-73,47 +p=23,75 v=-7,-81 +p=77,80 v=-32,-98 +p=80,15 v=23,92 +p=67,56 v=-69,50 +p=67,98 v=59,-72 +p=83,82 v=79,70 +p=84,82 v=27,37 +p=73,79 v=-32,-17 +p=46,33 v=-56,24 +p=36,75 v=91,-77 +p=47,66 v=42,39 +p=4,55 v=54,45 +p=12,68 v=-70,-43 +p=54,92 v=-69,-28 +p=89,58 v=89,38 +p=93,63 v=-77,-16 +p=11,27 v=30,9 +p=29,16 v=-44,-18 +p=72,7 v=30,35 +p=68,67 v=-16,-49 +p=100,62 v=-39,-94 +p=61,44 v=23,28 +p=67,25 v=46,2 +p=20,22 v=-31,90 +p=72,29 v=-68,8 +p=5,74 v=-83,5 +p=56,88 v=52,37 +p=12,10 v=44,52 +p=89,75 v=24,-65 +p=9,31 v=96,-3 +p=25,57 v=-1,82 +p=7,62 v=18,-70 +p=56,44 v=-93,64 +p=83,73 v=92,-22 +p=31,8 v=-65,37 +p=86,98 v=-61,-66 +p=17,7 v=54,-51 +p=95,9 v=37,-84 +p=26,4 v=51,-72 +p=96,102 v=-25,58 +p=4,26 v=-95,-84 +p=79,47 v=-9,1 +p=43,59 v=-35,-46 +p=17,45 v=-69,-10 +p=99,7 v=-18,-2 +p=56,89 v=52,-94 +p=95,95 v=83,-13 +p=18,102 v=-24,-7 +p=50,38 v=49,-30 +p=90,91 v=46,43 +p=87,71 v=4,75 +p=50,53 v=98,55 +p=42,99 v=87,80 +p=100,97 v=44,-89 +p=41,24 v=-30,-14 +p=98,78 v=11,65 +p=70,40 v=59,88 +p=3,82 v=-5,49 +p=35,53 v=-40,23 +p=41,84 v=-59,-71 +p=17,82 v=51,-55 +p=22,14 v=-7,-30 +p=94,19 v=-7,89 +p=93,57 v=86,-32 +p=100,1 v=40,80 +p=5,38 v=21,-30 +p=25,17 v=-96,57 +p=25,5 v=90,-29 +p=37,65 v=-50,93 +p=24,100 v=32,-1 +p=94,23 v=-90,72 +p=30,35 v=-63,84 +p=35,66 v=77,26 +p=95,57 v=-51,1 +p=88,19 v=14,-35 +p=1,54 v=14,66 +p=70,100 v=95,86 +p=91,37 v=63,78 +p=67,45 v=-92,40 +p=81,89 v=-97,21 +p=32,27 v=48,46 +p=51,24 v=90,-43 +p=0,101 v=41,75 +p=59,92 v=-33,86 +p=71,50 v=-91,-4 +p=0,16 v=-90,85 +p=3,1 v=23,-7 +p=5,80 v=60,5 +p=30,78 v=-30,65 +p=75,10 v=-2,-2 +p=46,55 v=-73,-82 +p=15,11 v=5,79 +p=34,5 v=-43,-18 +p=67,22 v=-63,-23 +p=78,1 v=-97,-61 +p=63,16 v=50,-93 +p=86,98 v=-64,-61 +p=46,41 v=-24,-58 +p=73,21 v=98,-32 +p=93,63 v=-64,-54 +p=11,45 v=-21,-48 +p=15,74 v=-53,-5 +p=66,4 v=13,46 +p=67,96 v=85,-18 +p=3,101 v=-44,4 +p=69,69 v=-48,92 +p=12,0 v=87,-76 +p=85,0 v=33,3 +p=69,19 v=-27,-74 +p=3,71 v=-9,-78 +p=93,27 v=-91,48 +p=51,38 v=71,61 +p=39,65 v=-20,-76 +p=35,63 v=9,-27 +p=48,63 v=92,-27 +p=27,8 v=48,90 +p=61,48 v=7,-81 +p=26,69 v=93,92 +p=63,88 v=-78,59 +p=2,62 v=18,18 +p=39,17 v=19,-33 +p=50,72 v=55,54 +p=68,12 v=75,31 +p=97,49 v=37,28 +p=42,45 v=32,-15 +p=89,92 v=-92,-26 +p=26,15 v=61,-30 +p=0,76 v=28,-31 +p=58,43 v=-39,-80 +p=69,63 v=59,-89 +p=81,79 v=-22,92 +p=98,74 v=-93,-65 +p=52,72 v=15,-87 +p=81,48 v=60,7 +p=68,19 v=-91,84 +p=25,47 v=5,-96 +p=73,46 v=13,-42 +p=97,72 v=83,-88 +p=69,14 v=20,52 +p=67,72 v=-16,-76 +p=98,87 v=-60,-87 +p=17,47 v=-11,39 +p=9,92 v=-36,-35 +p=86,32 v=-32,95 +p=53,92 v=-78,-17 +p=99,63 v=-38,71 +p=97,34 v=93,-96 +p=76,58 v=56,54 +p=80,0 v=53,69 +p=25,102 v=4,-91 +p=19,88 v=-60,-17 +p=8,80 v=8,54 +p=62,53 v=-34,25 +p=71,60 v=-94,49 +p=83,7 v=-64,76 +p=53,84 v=6,-7 +p=79,88 v=91,-41 +p=32,9 v=97,-40 +p=79,2 v=92,-80 +p=54,73 v=42,-21 +p=29,83 v=-53,-6 +p=37,34 v=22,74 +p=49,87 v=97,-34 +p=61,12 v=81,-10 +p=50,62 v=-3,65 +p=72,68 v=4,-37 +p=72,26 v=-65,-89 +p=36,82 v=84,-71 +p=84,75 v=-56,52 +p=36,1 v=81,37 +p=60,52 v=-39,71 +p=34,14 v=25,77 +p=49,35 v=-52,-19 +p=10,4 v=-2,-19 +p=46,21 v=76,-81 +p=11,39 v=54,-31 +p=36,15 v=-23,89 +p=94,11 v=86,-67 +p=30,62 v=74,-5 +p=97,42 v=60,-20 +p=95,46 v=-2,98 +p=72,47 v=14,-69 +p=69,52 v=28,21 +p=56,23 v=-48,56 +p=52,100 v=35,78 +p=94,75 v=31,-98 +p=3,82 v=-90,16 +p=84,94 v=-9,-34 +p=3,46 v=-8,-96 +p=3,50 v=-15,23 +p=74,60 v=-68,-75 +p=84,87 v=37,-18 +p=23,85 v=22,43 +p=82,25 v=-46,51 +p=35,102 v=32,-34 +p=27,52 v=-24,-15 +p=7,91 v=-62,98 +p=42,42 v=87,66 +p=80,21 v=-45,20 +p=46,102 v=-96,-94 +p=31,15 v=-43,41 +p=13,12 v=-44,52 +p=25,7 v=12,20 +p=48,79 v=55,-17 +p=61,31 v=-49,-24 +p=0,37 v=11,29 +p=1,34 v=14,-84 +p=59,12 v=-89,-56 +p=98,3 v=13,-42 +p=44,7 v=-26,-62 +p=43,33 v=-39,33 +p=26,91 v=72,94 +p=12,4 v=54,58 +p=42,74 v=-33,54 +p=43,95 v=-56,26 +p=86,60 v=37,-21 +p=77,72 v=36,16 +p=59,14 v=93,-15 +p=86,62 v=70,83 +p=12,33 v=-28,-20 +p=71,79 v=75,60 +p=1,61 v=-87,-60 +p=17,80 v=-38,-73 +p=2,65 v=-93,-49 +p=25,82 v=-21,-34 +p=30,42 v=-27,72 +p=6,3 v=-8,-29 +p=46,87 v=-49,59 +p=84,93 v=-61,-99 +p=3,71 v=-5,97 +p=63,64 v=30,33 +p=61,78 v=98,-38 +p=66,41 v=46,-20 +p=25,94 v=-82,10 +p=66,21 v=-65,-85 +p=80,43 v=-87,56 +p=32,61 v=-86,-91 +p=65,77 v=-40,3 +p=74,34 v=-28,-98 +p=74,55 v=-54,-9 +p=97,61 v=21,-80 +p=54,40 v=-10,72 +p=4,25 v=-96,-46 +p=57,52 v=-16,-47 +p=35,40 v=6,-74 +p=81,89 v=26,-43 +p=10,67 v=-70,16 +p=92,99 v=37,47 +p=29,6 v=80,59 +p=46,85 v=42,54 +p=65,33 v=-39,51 +p=89,94 v=53,26 +p=0,1 v=-80,4 +p=64,25 v=17,-17 +p=25,42 v=25,-20 +p=16,52 v=-11,28 +p=92,21 v=-74,-8 +p=37,79 v=-93,-31 +p=43,3 v=-33,-61 +p=74,67 v=95,27 +p=33,79 v=97,-27 +p=66,6 v=-75,-17 +p=15,32 v=-47,8 +p=4,77 v=-11,91 +p=91,41 v=-38,40 +p=79,84 v=-74,-98 +p=72,95 v=31,11 +p=55,22 v=-98,19 +p=5,0 v=31,74 +p=48,93 v=23,15 +p=23,74 v=83,67 +p=97,3 v=60,60 +p=23,78 v=87,43 +p=21,4 v=-37,85 +p=15,65 v=-25,-30 +p=11,12 v=-96,-95 +p=52,73 v=-85,16 +p=47,47 v=-59,-96 +p=0,89 v=-95,39 +p=12,57 v=87,17 +p=4,63 v=76,-5 +p=51,33 v=38,-50 +p=41,2 v=-1,-83 +p=78,93 v=-55,-55 +p=78,97 v=-92,-53 +p=13,23 v=-8,25 +p=95,87 v=-2,42 +p=45,29 v=-44,-28 +p=96,59 v=-54,16 +p=17,36 v=-47,-63 +p=61,68 v=36,-16 +p=86,73 v=-54,-21 +p=35,5 v=-79,96 +p=41,13 v=13,-3 +p=11,93 v=-21,-66 +p=90,60 v=-90,81 +p=52,21 v=39,-2 +p=54,19 v=-36,35 +p=27,83 v=74,70 +p=73,87 v=42,-87 +p=8,31 v=-21,51 +p=12,92 v=-47,48 +p=41,41 v=-60,44 +p=4,0 v=15,-28 +p=89,68 v=82,-71 +p=17,22 v=2,13 +p=18,18 v=38,38 +p=55,59 v=-65,-56 +p=57,13 v=-88,-19 +p=81,71 v=19,42 +p=54,27 v=-79,-63 +p=9,70 v=41,-54 +p=78,36 v=56,67 +p=35,82 v=91,-61 +p=20,5 v=70,-50 +p=67,14 v=-22,-45 +p=64,100 v=-94,91 +p=25,53 v=-4,68 +p=33,29 v=-30,89 +p=79,34 v=53,-79 +p=46,55 v=25,-45 +p=48,70 v=-46,49 diff --git a/inputs/input14_test b/inputs/input14_test new file mode 100644 index 0000000..72a324a --- /dev/null +++ b/inputs/input14_test @@ -0,0 +1,12 @@ +p=0,4 v=3,-3 +p=6,3 v=-1,-3 +p=10,3 v=-1,2 +p=2,0 v=2,-1 +p=0,0 v=1,3 +p=3,0 v=-2,-2 +p=7,6 v=-1,-3 +p=3,0 v=-1,-2 +p=9,3 v=2,3 +p=7,3 v=-1,2 +p=2,4 v=2,-3 +p=9,5 v=-3,-3 \ No newline at end of file