Compare commits
10 Commits
19bd3221b3
...
c15defa16e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c15defa16e | ||
![]() |
8b2c3bdfa1 | ||
![]() |
2d7d20ee59 | ||
![]() |
5a190b157c | ||
![]() |
135f574e7a | ||
![]() |
439edd7343 | ||
![]() |
86ce258532 | ||
![]() |
7c1ddf5b27 | ||
![]() |
af2bce9a89 | ||
![]() |
c5d735efde |
@@ -1,7 +1,7 @@
|
||||
class Input(object):
|
||||
def __init__(self, filename):
|
||||
with open(filename, 'r') as f:
|
||||
self._raw = f.read()
|
||||
self._raw = f.read().strip()
|
||||
|
||||
def raw(self):
|
||||
return self._raw
|
||||
@@ -15,3 +15,6 @@ class Input(object):
|
||||
def lines_as_lists(self):
|
||||
return [list(l) for l in self.lines()]
|
||||
|
||||
def lines_split_as_ints(self):
|
||||
return [[int(n) for n in list(l)] for l in self.lines()]
|
||||
|
||||
|
@@ -6,7 +6,6 @@ from aoclib import Input
|
||||
if __name__ == '__main__':
|
||||
#lines = Input('input_test.txt').lines()
|
||||
lines = Input('input.txt').lines()
|
||||
print(lines)
|
||||
|
||||
left = sorted([int(n.split()[0].strip()) for n in lines])
|
||||
right = sorted([int(n.split()[1].strip()) for n in lines])
|
||||
|
69
day10/code.py
Normal file
69
day10/code.py
Normal file
@@ -0,0 +1,69 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
|
||||
def find_starting_points(field) -> list[tuple[int, int]]:
|
||||
points = []
|
||||
for y in range(len(field)):
|
||||
for x in range(len(field[0])):
|
||||
if field[y][x] == 0:
|
||||
points.append((x, y))
|
||||
return points
|
||||
|
||||
|
||||
def num_trails(point: tuple[int, int], curr: int, field: list[list[int]]) -> list[tuple[int, int]]:
|
||||
if out_of_bounds(point, field):
|
||||
return [None]
|
||||
|
||||
x, y = point
|
||||
if field[y][x] != curr:
|
||||
# impossible path
|
||||
return [None]
|
||||
|
||||
if curr == 9 and field[y][x] == curr:
|
||||
# goal
|
||||
return [point]
|
||||
|
||||
curr += 1
|
||||
|
||||
opts = list()
|
||||
|
||||
opts.extend(num_trails((x+1, y), curr, field))
|
||||
opts.extend(num_trails((x-1, y), curr, field))
|
||||
opts.extend(num_trails((x, y+1), curr, field))
|
||||
opts.extend(num_trails((x, y-1), curr, field))
|
||||
|
||||
return opts
|
||||
|
||||
|
||||
def out_of_bounds(point: tuple[int, int], field: list[list[int]]) -> bool:
|
||||
x, y = point
|
||||
return y < 0 or y >= len(field) or x < 0 or x >= len(field[0])
|
||||
|
||||
|
||||
def solve1(field: list[list[int]]) -> int:
|
||||
starts = find_starting_points(field)
|
||||
count = 0
|
||||
for p in starts:
|
||||
trails = num_trails(p, 0, field)
|
||||
count += sum([1 if n else 0 for n in set(trails)])
|
||||
return count
|
||||
|
||||
def solve2(field: list[list[int]]) -> int:
|
||||
starts = find_starting_points(field)
|
||||
count = 0
|
||||
for p in starts:
|
||||
trails = num_trails(p, 0, field)
|
||||
count += sum([1 if n else 0 for n in trails])
|
||||
return count
|
||||
|
||||
if __name__ == '__main__':
|
||||
#field = Input('input_test.txt').lines_split_as_ints()
|
||||
field = Input('input.txt').lines_split_as_ints()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve1(field)) # 733
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(field)) # 1514
|
54
day10/input.txt
Normal file
54
day10/input.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
543067650323210321032110356789890110710189878760134567
|
||||
612148941212306782345091235410765227893258759651021298
|
||||
701238932301456798106787549323454336794567549842330807
|
||||
898547215450589867287654678892961245987654456732498910
|
||||
987656306769678956398013234781870301256003301201567821
|
||||
234543215878760145478920105690210982340112210341056932
|
||||
109650124981232230569834124567345673451234985452347845
|
||||
018744323890341021656765033438454589298545676701037796
|
||||
199803210787650110765017842129823672107655677812378987
|
||||
785012345654789541874326956010510563201234389983405676
|
||||
174321498723498632903455467173421454102348210234514430
|
||||
065430239014323721212762398982567876218959650149623521
|
||||
145540128765017890101871081071018967327968743898734678
|
||||
236692134984178768718981012567894458456876212798604329
|
||||
987783005673269659654108923458763349663212108789015012
|
||||
896654012562154546743267830309854218767103419276126787
|
||||
765780123473043432890154321212903109878756578125435698
|
||||
434099874984012301740125654567812893469017647030165556
|
||||
323101065765101787434436763058906732154178736543256765
|
||||
013298187890678696325569892143215440043289128954343894
|
||||
010367296541549045016678765014300351234567037760012983
|
||||
329458305032132134787867410967891267653438546891898012
|
||||
458789414145010120196986323898763298344129655432743210
|
||||
567076523236678743285898456777654101201098766653658901
|
||||
456167654107549658374567689985403100312434985567877014
|
||||
343228943298938569843210576876312238920125676656986323
|
||||
651014543498127478755765435410278947437876985543235434
|
||||
743223672567078369876890324320127656506987234350145632
|
||||
894102981089569232125981210451256543215432122341076541
|
||||
765091234676352101034674323401237894101341001456789830
|
||||
014780365445443032126501012532345743103210112565898321
|
||||
123689876034321145098432107645236743254101101876543210
|
||||
094545763125210056788943258896107858969010332987674301
|
||||
785430432106782169877652349787567967678321245696784561
|
||||
876021569045893458965601654343478914565414326781093870
|
||||
987109878010432167014298710234323901258905015492012901
|
||||
789219894324569052123109620123217892109876012323458692
|
||||
654308765543678743013234538994106543010870965410069783
|
||||
789877787632189852101110145885287676521961871012178654
|
||||
034565896601087601211001406776896789437652676523468743
|
||||
121053795542194512389132312345445676548943989430549012
|
||||
262342187634765433498545434531230107401232104321678298
|
||||
876533014123892324567696526540043298340981010780890187
|
||||
983414523016101019876587017832134781256672125690743296
|
||||
032101654327892100345678789901295690764543434321652345
|
||||
123089789236743981234589654800387789835678987787601336
|
||||
854176590187656876104310343211456876544549016098543223
|
||||
965765410194545675465231230898565963233432145123210112
|
||||
876894321243232980370110141767653210112321039654101101
|
||||
146765232100101061289879852632154100203410128789210322
|
||||
036787103761267876518768763543069911012543454376325412
|
||||
123498654854356987405650654985678892327632567215436701
|
||||
210567569983543292314321569876301765438761078904589898
|
||||
325456478754330101223433478765432654349652987615678765
|
8
day10/input_test.txt
Normal file
8
day10/input_test.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
121
day10/task.txt
Normal file
121
day10/task.txt
Normal file
@@ -0,0 +1,121 @@
|
||||
--- Day 10: Hoof It ---
|
||||
You all arrive at a Lava Production Facility on a floating island in the sky. As the others begin to search the massive industrial complex, you feel a small nose boop your leg and look down to discover a reindeer wearing a hard hat.
|
||||
|
||||
The reindeer is holding a book titled "Lava Island Hiking Guide". However, when you open the book, you discover that most of it seems to have been scorched by lava! As you're about to ask how you can help, the reindeer brings you a blank topographic map of the surrounding area (your puzzle input) and looks up at you excitedly.
|
||||
|
||||
Perhaps you can help fill in the missing hiking trails?
|
||||
|
||||
The topographic map indicates the height at each position using a scale from 0 (lowest) to 9 (highest). For example:
|
||||
|
||||
0123
|
||||
1234
|
||||
8765
|
||||
9876
|
||||
Based on un-scorched scraps of the book, you determine that a good hiking trail is as long as possible and has an even, gradual, uphill slope. For all practical purposes, this means that a hiking trail is any path that starts at height 0, ends at height 9, and always increases by a height of exactly 1 at each step. Hiking trails never include diagonal steps - only up, down, left, or right (from the perspective of the map).
|
||||
|
||||
You look up from the map and notice that the reindeer has helpfully begun to construct a small pile of pencils, markers, rulers, compasses, stickers, and other equipment you might need to update the map with hiking trails.
|
||||
|
||||
A trailhead is any position that starts one or more hiking trails - here, these positions will always have height 0. Assembling more fragments of pages, you establish that a trailhead's score is the number of 9-height positions reachable from that trailhead via a hiking trail. In the above example, the single trailhead in the top left corner has a score of 1 because it can reach a single 9 (the one in the bottom left).
|
||||
|
||||
This trailhead has a score of 2:
|
||||
|
||||
...0...
|
||||
...1...
|
||||
...2...
|
||||
6543456
|
||||
7.....7
|
||||
8.....8
|
||||
9.....9
|
||||
(The positions marked . are impassable tiles to simplify these examples; they do not appear on your actual topographic map.)
|
||||
|
||||
This trailhead has a score of 4 because every 9 is reachable via a hiking trail except the one immediately to the left of the trailhead:
|
||||
|
||||
..90..9
|
||||
...1.98
|
||||
...2..7
|
||||
6543456
|
||||
765.987
|
||||
876....
|
||||
987....
|
||||
This topographic map contains two trailheads; the trailhead at the top has a score of 1, while the trailhead at the bottom has a score of 2:
|
||||
|
||||
10..9..
|
||||
2...8..
|
||||
3...7..
|
||||
4567654
|
||||
...8..3
|
||||
...9..2
|
||||
.....01
|
||||
Here's a larger example:
|
||||
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
||||
This larger example has 9 trailheads. Considering the trailheads in reading order, they have scores of 5, 6, 5, 3, 1, 3, 5, 3, and 5. Adding these scores together, the sum of the scores of all trailheads is 36.
|
||||
|
||||
The reindeer gleefully carries over a protractor and adds it to the pile. What is the sum of the scores of all trailheads on your topographic map?
|
||||
|
||||
Your puzzle answer was 733.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
The reindeer spends a few minutes reviewing your hiking trail map before realizing something, disappearing for a few minutes, and finally returning with yet another slightly-charred piece of paper.
|
||||
|
||||
The paper describes a second way to measure a trailhead called its rating. A trailhead's rating is the number of distinct hiking trails which begin at that trailhead. For example:
|
||||
|
||||
.....0.
|
||||
..4321.
|
||||
..5..2.
|
||||
..6543.
|
||||
..7..4.
|
||||
..8765.
|
||||
..9....
|
||||
The above map has a single trailhead; its rating is 3 because there are exactly three distinct hiking trails which begin at that position:
|
||||
|
||||
.....0. .....0. .....0.
|
||||
..4321. .....1. .....1.
|
||||
..5.... .....2. .....2.
|
||||
..6.... ..6543. .....3.
|
||||
..7.... ..7.... .....4.
|
||||
..8.... ..8.... ..8765.
|
||||
..9.... ..9.... ..9....
|
||||
Here is a map containing a single trailhead with rating 13:
|
||||
|
||||
..90..9
|
||||
...1.98
|
||||
...2..7
|
||||
6543456
|
||||
765.987
|
||||
876....
|
||||
987....
|
||||
This map contains a single trailhead with rating 227 (because there are 121 distinct hiking trails that lead to the 9 on the right edge and 106 that lead to the 9 on the bottom edge):
|
||||
|
||||
012345
|
||||
123456
|
||||
234567
|
||||
345678
|
||||
4.6789
|
||||
56789.
|
||||
Here's the larger example from before:
|
||||
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
||||
Considering its trailheads in reading order, they have ratings of 20, 24, 10, 4, 1, 4, 5, 8, and 5. The sum of all trailhead ratings in this larger example topographic map is 81.
|
||||
|
||||
You're not sure how, but the reindeer seems to have crafted some tiny flags out of toothpicks and bits of paper and is using them to mark trailheads on your topographic map. What is the sum of the ratings of all trailheads?
|
||||
|
||||
Your puzzle answer was 1514.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
44
day11/code.py
Normal file
44
day11/code.py
Normal file
@@ -0,0 +1,44 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
|
||||
def apply_rules(stones: dict[int, int]) -> dict[int, int]:
|
||||
new_stones = dict()
|
||||
for k in stones.keys():
|
||||
new_value = _apply_rules(k)
|
||||
for item in new_value:
|
||||
if item not in new_stones:
|
||||
new_stones[item] = 0
|
||||
new_stones[item] += stones[k]
|
||||
return new_stones
|
||||
|
||||
def _apply_rules(s: int) -> list[int]:
|
||||
res = list()
|
||||
if s == 0:
|
||||
res.append(1)
|
||||
elif len(str(s))%2==0:
|
||||
_s = str(s)
|
||||
res.extend([int(_s[:len(_s)//2]), int(_s[len(_s)//2:])])
|
||||
else:
|
||||
res.append(s*2024)
|
||||
return res
|
||||
|
||||
|
||||
def solve(iter: int, stones: list[int]) -> int:
|
||||
s = dict(zip(stones, [1 for _ in range(len(stones))]))
|
||||
for st in stones:
|
||||
s[st] = 1
|
||||
for i in range(iter):
|
||||
s = apply_rules(s)
|
||||
return sum(s.values())
|
||||
|
||||
if __name__ == '__main__':
|
||||
#stones = Input('input_test.txt').lines_as_int_lists()
|
||||
stones = Input('input.txt').lines_as_int_lists()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve(25, stones[0])) # 216996
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve(75, stones[0])) # 257335372288947
|
1
day11/input.txt
Normal file
1
day11/input.txt
Normal file
@@ -0,0 +1 @@
|
||||
0 7 198844 5687836 58 2478 25475 894
|
1
day11/input_test.txt
Normal file
1
day11/input_test.txt
Normal file
@@ -0,0 +1 @@
|
||||
125 17
|
65
day11/task.txt
Normal file
65
day11/task.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
--- Day 11: Plutonian Pebbles ---
|
||||
The ancient civilization on Pluto was known for its ability to manipulate spacetime, and while The Historians explore their infinite corridors, you've noticed a strange set of physics-defying stones.
|
||||
|
||||
At first glance, they seem like normal stones: they're arranged in a perfectly straight line, and each stone has a number engraved on it.
|
||||
|
||||
The strange part is that every time you blink, the stones change.
|
||||
|
||||
Sometimes, the number engraved on a stone changes. Other times, a stone might split in two, causing all the other stones to shift over a bit to make room in their perfectly straight line.
|
||||
|
||||
As you observe them for a while, you find that the stones have a consistent behavior. Every time you blink, the stones each simultaneously change according to the first applicable rule in this list:
|
||||
|
||||
If the stone is engraved with the number 0, it is replaced by a stone engraved with the number 1.
|
||||
If the stone is engraved with a number that has an even number of digits, it is replaced by two stones. The left half of the digits are engraved on the new left stone, and the right half of the digits are engraved on the new right stone. (The new numbers don't keep extra leading zeroes: 1000 would become stones 10 and 0.)
|
||||
If none of the other rules apply, the stone is replaced by a new stone; the old stone's number multiplied by 2024 is engraved on the new stone.
|
||||
No matter how the stones change, their order is preserved, and they stay on their perfectly straight line.
|
||||
|
||||
How will the stones evolve if you keep blinking at them? You take a note of the number engraved on each stone in the line (your puzzle input).
|
||||
|
||||
If you have an arrangement of five stones engraved with the numbers 0 1 10 99 999 and you blink once, the stones transform as follows:
|
||||
|
||||
The first stone, 0, becomes a stone marked 1.
|
||||
The second stone, 1, is multiplied by 2024 to become 2024.
|
||||
The third stone, 10, is split into a stone marked 1 followed by a stone marked 0.
|
||||
The fourth stone, 99, is split into two stones marked 9.
|
||||
The fifth stone, 999, is replaced by a stone marked 2021976.
|
||||
So, after blinking once, your five stones would become an arrangement of seven stones engraved with the numbers 1 2024 1 0 9 9 2021976.
|
||||
|
||||
Here is a longer example:
|
||||
|
||||
Initial arrangement:
|
||||
125 17
|
||||
|
||||
After 1 blink:
|
||||
253000 1 7
|
||||
|
||||
After 2 blinks:
|
||||
253 0 2024 14168
|
||||
|
||||
After 3 blinks:
|
||||
512072 1 20 24 28676032
|
||||
|
||||
After 4 blinks:
|
||||
512 72 2024 2 0 2 4 2867 6032
|
||||
|
||||
After 5 blinks:
|
||||
1036288 7 2 20 24 4048 1 4048 8096 28 67 60 32
|
||||
|
||||
After 6 blinks:
|
||||
2097446912 14168 4048 2 0 2 4 40 48 2024 40 48 80 96 2 8 6 7 6 0 3 2
|
||||
In this example, after blinking six times, you would have 22 stones. After blinking 25 times, you would have 55312 stones!
|
||||
|
||||
Consider the arrangement of stones in front of you. How many stones will you have after blinking 25 times?
|
||||
|
||||
Your puzzle answer was 216996.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
The Historians sure are taking a long time. To be fair, the infinite corridors are very large.
|
||||
|
||||
How many stones would you have after blinking a total of 75 times?
|
||||
|
||||
Your puzzle answer was 257335372288947.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
138
day12/code.py
Normal file
138
day12/code.py
Normal file
@@ -0,0 +1,138 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
from collections import defaultdict
|
||||
|
||||
def find_regions(grid: list[list[str]]):
|
||||
regions = []
|
||||
all_visited = set()
|
||||
for y in range(len(grid)):
|
||||
for x in range(len(grid[0])):
|
||||
if (x, y) in all_visited:
|
||||
continue
|
||||
|
||||
val = grid[y][x]
|
||||
region = set()
|
||||
search(val, (x, y), grid, region)
|
||||
|
||||
regions.append((val, region))
|
||||
|
||||
all_visited.update(region)
|
||||
|
||||
return regions
|
||||
|
||||
|
||||
def search(plot_type: str, plot: tuple[int,int], grid: list[list[str]], region: set):
|
||||
x, y = plot
|
||||
if out_ouf_bounds(plot, grid) or plot in region or not grid[y][x] == plot_type:
|
||||
return
|
||||
|
||||
region.add(plot)
|
||||
search(plot_type, (x+1, y), grid, region)
|
||||
search(plot_type, (x-1, y), grid, region)
|
||||
search(plot_type, (x, y+1), grid, region)
|
||||
search(plot_type, (x, y-1), grid, region)
|
||||
|
||||
return
|
||||
|
||||
|
||||
def out_ouf_bounds(plot, grid) -> bool:
|
||||
x, y = plot
|
||||
return x < 0 or x >= len(grid[0]) or y < 0 or y >= len(grid)
|
||||
|
||||
def region_area_and_perimeter(plots: set[tuple[int, int]]) -> tuple[int, int]:
|
||||
a = len(plots)
|
||||
p = 0
|
||||
for plot in plots:
|
||||
x, y = plot
|
||||
if (x+1, y) not in plots:
|
||||
p += 1
|
||||
if (x-1, y) not in plots:
|
||||
p += 1
|
||||
if (x, y+1) not in plots:
|
||||
p += 1
|
||||
if (x, y-1) not in plots:
|
||||
p += 1
|
||||
return a, p
|
||||
|
||||
|
||||
def region_num_sides(plots: set[tuple[int,int]]) -> int:
|
||||
n = 0
|
||||
|
||||
for p in plots:
|
||||
# outer corners
|
||||
x, y = p
|
||||
if (x, y-1) not in plots and (x+1, y) not in plots:
|
||||
n += 1
|
||||
if (x+1, y) not in plots and (x, y+1) not in plots:
|
||||
n += 1
|
||||
if (x, y+1) not in plots and (x-1, y) not in plots:
|
||||
n += 1
|
||||
if (x-1, y) not in plots and (x, y-1) not in plots:
|
||||
n += 1
|
||||
|
||||
for p in plots:
|
||||
# inner corners
|
||||
x, y = p
|
||||
if (x, y-1) in plots and (x+1, y) in plots and (x+1, y-1) not in plots:
|
||||
n += 1
|
||||
if (x+1, y) in plots and (x, y+1) in plots and (x+1, y+1) not in plots:
|
||||
n += 1
|
||||
if (x, y+1) in plots and (x-1, y) in plots and (x-1, y+1) not in plots:
|
||||
n += 1
|
||||
if (x-1, y) in plots and (x, y-1) in plots and (x-1, y-1) not in plots:
|
||||
n += 1
|
||||
|
||||
return n
|
||||
|
||||
def find_sides(c: tuple[int, int], plots: set[tuple[int, int]]):
|
||||
x, y = c
|
||||
hor = set()
|
||||
vert = set()
|
||||
|
||||
_x, _y = x, y
|
||||
while (_x, _y) in plots:
|
||||
low = (x, y-1)
|
||||
high = (x, y+1)
|
||||
vert.add((x,y))
|
||||
while low and high:
|
||||
if low in plots:
|
||||
vert.add(low)
|
||||
else:
|
||||
low = None
|
||||
if high in plots:
|
||||
vert.add(high)
|
||||
else:
|
||||
high = None
|
||||
return vert, hor
|
||||
|
||||
def solve1(grid: list[list[str]]):
|
||||
regions = find_regions(grid)
|
||||
total = 0
|
||||
for r in regions:
|
||||
a, p = region_area_and_perimeter(r[1])
|
||||
total += a * p
|
||||
return total
|
||||
|
||||
|
||||
def solve2(grid: list[list[str]]):
|
||||
regions = find_regions(grid)
|
||||
total = 0
|
||||
for r in regions:
|
||||
a, _ = region_area_and_perimeter(r[1])
|
||||
n = region_num_sides(r[1])
|
||||
total += a * n
|
||||
|
||||
return total
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#grid = Input('input_test.txt').lines_as_lists()
|
||||
grid = Input('input.txt').lines_as_lists()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve1(grid)) # 1402544
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(grid)) # 862486
|
140
day12/input.txt
Normal file
140
day12/input.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
IIIIIIIIIIIIIIIIIIIIIUUUUUUUUJLLLLAAAAAAMMMAUUUUPPXPZZZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXFFFFFFFFFFZZZZZZZZZTTTTTTTVVVVVVVVVVPVRRRRRJOYOOOOOOOOOO
|
||||
IIIIIIIIIIIIIIIIIIIIUUUUUUUUUJALEAAAAAAAAAAAAUUUUPXPPZZZZZHHHHHHXHXXXXXXXXXXXXXXXXXXFXFFFFFFFFZZZZZZZZZTTTTTTTTVVVVVVVVVVVRRRSRROOOOOOOOOOOO
|
||||
IIIIIIIIIIIIIIIIIIIIUUUUUUUUUJAAAAAAAAAAAAAAUUPPPPPPPZZZZZZZHHHHHHHXXXXXXXXXXXXXXXXXXXFFFFFFFFFZZZZZZZTTTTTTTTTVVVVVVVVVVVRRSSKKOOOOOOOOOOOO
|
||||
IIIIIIIIIIIAAIIIIIIIIIUUUUUUUJJAAAAAAAAAAAAAAVVPPPPPPPPZHHHHHHHHHHHXXXXXXXXXXXXXXXXXFFFFFFFFFFFZZZZZZZTTTTTTTTVVVVVVVVKVVVVDSSSSOOOOOOOOOOOO
|
||||
IOOIIIIIIIIAAIIIIIIIIIIUUUQVUJJAAAAAAAAAAAAAEVVZPPPPPPPHHHHHHHHHHHHXXXXXXXXXXXXXXXXXXXXFFFFFFLLLLALLLLTTTTTTTTVVVVVVVVVVVVVVSSSSOOOOOOOOOOOO
|
||||
OOOOOOOOIIAAAAAIIIIIIIIUQQQQVQJAAAAAAAAAAAAAAVVPPPPPIIHHHHHHHHHHHHHXXXXXUXXXXXXUUXXBBBSFFFLLLLLLLLLLLLLLTTTTTTVVVVVVVVVVVVVCCSSSSSOOOOOOOOOO
|
||||
OOOOOOOOIAAAAAAIIIIIIQQQQQQQQQQQEADDAAAAAAAAHHVVPPPIIIIHHHHHHHHHHHHHXXXUUUUUXXUUUXXBBBSFFFLLELLLLLLLLLLTTTTTTTVVVVVVVVVVVFVCCCYSSJJVOOOOOOOO
|
||||
OOOOOOOOIIIAAIIIIIQQQQQQQQQQTQJQEEDDDAAAAAAHHVVVVPIIIIIHHHHHHHHHHHHHXUUUUUUUUUUUMMXBBBSSSFFFLLLLLLLLLLLLTTTTTTTWVVVVVVVVVVVSYYYYSJJVOOOOOOOS
|
||||
OOOOOWWIIIIIIIIIIIQQQQQQQQQQTQJDDDDDDAAAHAHHHHVVIIIIIIIHIIIHHHHHHHHHUUUUUUUUUUUUMMSSBBSSSSFFFLLLLLLLLLLLTTTTTTTWVVVVVVVVVVZSHYYYSSJJOOOOOOOS
|
||||
OOOOOEWIIIIIIIIDIIIQQQQQQQQQQQDDDDDDDDAHHHHHHHVHIIIIIIIIIIIHHHHHHHHHUUUUUUUUUUUUMMMSSSSSSLFLFLLLLLLLLLLLTTTTTTWWWWVVVVVUVUSSSYSSSJJJJSSSSOSS
|
||||
OOOWOWWIIIDDDIDDDDIQQQQQQQQQQQQJDDDDDDAHHGGHFFVHIIIIIIIIIIIHHHHHHHLHUUUUUUUUUUUMMMSSSSSSSLLLLLLLLLLLLLLTTTTTWWWWWWVVVVVUUUSLSSSSSJJJSSSSSSSS
|
||||
OOWWWWWWDDDDDDDDDQQQQQQQQQQQQQQDDDDDGGGGGGHHFFHHIIIIIIIIIHHHHHHHHHLLLLLLUUUUUUUMMMIIISSSSSRRRLLLLLLLLLLTTTTWWWWWWWVVVVVUULLLSSSSSSSSSSSSSSSS
|
||||
OWWWWWWWKDDDDDDDDQQQQQQQQQQQQQNODDGGGGGGGGGHFFFHHHHIIIIIIHHHHHLLHHLLLLLUUUUUUUUIMIIIISSSSRRRRRLLLLLLLLLTTTTWWWWWWWVWVVUUULLLSSSSSZSSSSSSSSSS
|
||||
OWWWWWWWWDDDDDDDDQQNQQQQQQQNNNNGGGGGGGGGGGGHHHHHHHIIIIIIIIHHHLLLLLLLLUUUUUUIUUIIIIIIIISSRRRRRLLLLLLLLLLQTTTTWWWWWWWWWVULLLLLLLSSSZSSSSSAASSS
|
||||
OVVWWWWWWDDDDDDDDNNNQNQQQQQNNNNNGGGGGGGGGGGGYHHHHHHIIIIIIIIHLLLLLLLLUUUUUUUIIIIIIIIIIRSSSRRRRRRHLLLQQQQQTTTWWWWWWWWWWUUULLLLLLSZSZSZSSSAASSS
|
||||
OOVWWWDDDDDLLLADDNNNNNNQQQQNNNNNHHGGGGQIGGGYYYHHHIIIIIIIIILHLLLLLLLLLLUUUUUIIIIIIIIIIRRRRRRRRRRRLLYDQQQTTTWWWWWWWWWWUULLLLLLLLLZZZSZSAAASSSS
|
||||
OOOOWWWDDDDLLLLDNNNNNNNNQQNNNNIIIIGGIIIIRGYYYHHHHHHIHHHIILLLLLLLLLLLLLLUUUUIIIIIIIIIIRRRRRRRRRRRTYYYQQQWWWWWWWWWWWWWUWLCLLLLLLZZZZZZZAAAAASS
|
||||
DOOWWWDDDDDLLLLLLNNNNNNQQQNNNIIIIIGIIIIIIYYYYHHHHHHHHHIIIILLLLLLLLLLLUUUUUUDDIIIIIIIIRRRRRRRRRRYYYYYYYYDJJWWWWWWWWWWWWCCLLLLLLZZZZZZZAAAAAAS
|
||||
DODWWWDDLLLLLLLLLLLLLNNNNNNIIIIIIIIIIIIIIYYYYWHHHCCCHHCCCICLLLLLLLLLLUUUUUUDIIIIIIIIIIRRRRRRTTRHHHYYYJJJJJJWWWWWWWWWCCCCLLLLLZZZZZZZZAAAAAAA
|
||||
DDDDWDDDLLLLLLLLLLLLLNNNNNNNIIIIIIIIIIIIHYYYRWHHHCCMCCCCCCCLLLLLLLLLLUUUUUUUIIIIIIHIIIIHRRRRRXXXXHYYYJJJJJJWWWWWWWWWCCCCCCCZZZZZZZZZAAAAAAAA
|
||||
DDDDDDDDDLLLLLLLLLLLLNNNNNNNIIUUIIIIIIIIIYYWRWHHHCCCCCCCCCLLLLLLLLLULUUUUUUUUUIIIHHHIHHJYYYRXXXXXXYYYYJJJJWWWWWWWWWWTTCCCCCCCGZGGZAAAAAAAAAA
|
||||
DDDDDDDDDLLLLLLLLLLLNNNNNNNNNNIIIIIIIIIOIFYWWWWHHCCCCCCCCCCCLLLLDLDUUUUUUUUUUHHHIHHHHHJJYJYRYYXXXXXXYYXBJJJJFFTTWWWTTTCCCCCGGGGGGGAAAAAAAAAA
|
||||
DDDDDDDDDDLLLLLLLLLLLNNWWNNNNNNNIIIIIIIIIWWWWWWWWCCCCCCCCCCCCLCDDDDUUUUUUUUUUHHHIHHHHJJJJJYYYXXXXXXXXXXJJJOOOFTTTTTTTTTTTTGGGGGGGGAAAAAAAAAA
|
||||
DDDDDDDDDDLLLLLLLLLLLNNWWNGGGGGIIIIIJJIEEWWNWWWWWCCCCCCCCCCCCCCDDDDDDUUUUUUUHHHHHHHHJJJJJRXXXXXXXXXXOXXXXOOOOFFFTTTTTTTTTOGGGGGGGGGAAAAAAAAA
|
||||
DDDDDDDDDDLRLLLLLLLWLWWWWNNGGGGGGGHGJJJWWWWWWWWWWCCCCCCCCCCCCCDDDDDDDDDUUUUUJJHHHHJJJMJJJJXXXXXXXXXXXXXXXOOOOFFOOTTTTTTTTOOGGGGGGGGGAAAGAGAA
|
||||
DDDDDDDDDDLRLLLLLLWWWWWWNNNNNNGGGGHGJJGMMWWWWWWWWWCCCCCCCCCCCCDDDDDDDDDVVUVUUJHHJJJJJJJJJXXXXXXXXXXXXXXXXOOOOOOOTTTTTGTGLGGGGGGGGGCGGAGGGGTA
|
||||
DDDADDDDDDNLLLLLLLLLWWWWNNNNNGGGGGGGGGGMMMWWWWWWWWWCCCCCCCCCCCDDDDDDDDVVVVVUUJJJJJJJJGJJXXXXXXXXXXXXXXXXXOOOOOOOTTTTTGGGGGGGGGGGGGGGGAAVATTT
|
||||
DAAADDDNNNNNLLLLLLLLLWWWNEENNGGGGGGGGGGMMMMWWWWWWWWWCCCCCCCCCCCDDDDDDDDVVVVVJJJJJJJJJJJJXXXXXXXXXXXXXXXXXOOOOOOOOTTGGGGGGGGGGGGGGGGPGAAAAATT
|
||||
AAAAADDNENNNNLLLLLNNNWNNEEENNNNGGGGGGGSMWWWWWWWWWWWWCCCCCCCCCCCCCDDDDDDVVVVVJJJJJJJJJJJJJXXXXXXXXXXXXNNXOOOOOOOOOTTTTGGGGGGGGGGGGGGGGAAAAAAT
|
||||
AAAANDNNENNNNNNNNLNNNNNNEEEEENNEGGSOGGSSSWWWWWWWWWWWCCCSSCCBCOCCCDDDDDDBVVVVJJJJJJJJJJJJJJXXXXXOXXXOZOOOOOOOOOOOOTTTTTTGGGGGGGGGGGGGGGLLTATT
|
||||
AAAANNNNNNNNNNNNNNNNNNNNEEEEEEEEEGSSSSSSSWWWWWWWWCWWCCCSIIIIIIIIIIDBDDDBVBBVJJJJJJJJJJJJJXXJJXXOOOOOZOOOOOOOOOOOOTYTTTGGGGGGGGGGGGGMGGLLTTTT
|
||||
NNSNNNNNNNNNUNNNNNNNNNNNNEEEEEEEEEKSSSSSSSSWWWWWWCCCCCCCIIIIIIIIIIOBDDDBBBBWWWJJJJJJJJJJJXJJJXXKOOOOOOOOOOOOOOOOFYYYYYGGGGAGGGGGGGDDGLLLTTTT
|
||||
NNNNNNNNONNUUNNNNNNNNNEEEEEEEEEEEEEESISSSSWWEEWCCCCCCCCCIIIIIIIIIIBBBBBBBBWWWWJJJJJJJJJJJJJJJXOOOOOOOOOOOOOOOOOYYYYYYYYQGAAAGGGGGDDDDLLLLTLL
|
||||
NNNNNNNNNTNXUNNNNNNNNEEEEEEEEEEEEEEIRISSSSSWEEWWCCCAIIIIIIIIIIIIIIOBBBBWWBBWAWWWWWJJJRJJJJJJJJJOOOOOOOODOOOOOOOYYYYYYYYYYYAAAAGGEEDDDLLLLTLL
|
||||
NNNNNNNNNNXXUUUNNNNNNNEEEEEEEEEEEEEIIIISPEEWEEECCCAAIIIIIIIIIIIIIIBBWBWWWWWWWWWWWWWWWRRRJJJJJOOOOOOOOOODDOOOBYOYYYYYYYYYOOOAAAGAADDLLLLLLLLL
|
||||
NNNNNNNNUUUUUUUNNNNNNEEEEEEEEEEEEEEIIIIIIIEEEEEECEAAIIIIIIIIIIIIIINBWWGGGGGGGWWWWWGGRRRRRJOJJOOOOOOOOOOODDDDYYYYYYYYYYOOOOOAAAAAALDLLLLLLLNN
|
||||
NNNNNNNNNUUUUUUUNNNNNEEEEEEEEEEEEEIIIIIIIIEEEEEEEIIIIIIIIIIIIIIIIINNNWGGGGGGGGGGGWRRRRRRROOOOOOOOOOOOOOODDDDYYYYYYYYYYOOTAAAAAAAALLLLLLLLLNN
|
||||
NNNNNNNNUUUTUMMNNNNEEWWEEEEEEEEEEEIIIIIIIEEEEEEEEIIIIIIIIIIIIIAANNNNNWGGGGGGGGGGGRRRRRRRRROOOOOOOOOOOOOODDDDDDYYWYYYYYYAAAAAAAAAALLLLLLLLLNN
|
||||
NNNNNNNNNTTTUJNNNEEEEWEEEEEEEEEEEEIIIIIIEEEEEEEEEIIIIIIIIIIIIIANNNNNNWGGGGGGGGGGGRRRRRRRRRDDOOOOOOOOOOOODDDDDDYYYYYYYYYAAAAAAAAAALLLLLLLLLLN
|
||||
NNNNNNNNNTTJJJOJNRREEEEEEEEEEEEEEIIIIIIIEEEEEEEEEIIIIIIIIIIIIINNNNNNNWGGGGGGGGGGGRRRRRRRRRRROOOOOOOOOOOOODDDDDDDDDYYYYYAAAAAAAAAAALLLLLLLNNN
|
||||
NNNNNNNJTTTTTJJJRRREEEEEEEYYENNNIIIIIIEEEEEEEEEEEIIIIIIIIIIAAAANNNNGGGGGGGGGGGGGGRRRRRRRRRRROOUOOOOOOOOODDDDDDDDDDDYYYEEAAAAAAAAAALLLLLLLNNN
|
||||
NNNJJNJJJTTTTJJJJJJEEEEEEEEEEEIIIIIIIIIIIEEEEEEEEIIIIIIIIIIAAAAANNNGGGGGGGGGGGGGGGGGRRRRRRRRROOOOOOOOOODDDXDDDXXXDDDYYDEAAAAAAAAAAAAALLLLNNN
|
||||
NNJJJLJJJJTTJJJJJJJJEEEEEEEEEEIIIIIIIIIEIIEEEEEEFIIIIIIIIIIAAAAANNNGGGGGGGGGGGGGGGGGRRRRRRRRGXOOXXOOOOXXXXXXXXXXDDDDDDDEAAAAAAAAAAANNNLLLLNN
|
||||
NNJJJJJJJFJTJJJJJJJJEEEEEEEEEEEIIIIIIIEEEEEEEEEEFIIIIIIIIIIAAAAAYNNGGGGGGGGGGGGGGGGGRRRRRORRXXXOXXXOOOXXXXXXXXXXDDDDDDDEAAAAAAAAANNNNNNLLLNN
|
||||
JJJJJJJJJJJJJJJJJJJJSSSSSSSSEEEEEIIIIIIEEEEEEEEEFIIIIIIIIIIAAAAAALNGGGGGGGGGGGGGGGGGRRRRROOROQXXXXXXXXXXXXXXXXXXXDDDDDDDPAPAAAAAAAANNNNLNNNN
|
||||
EEJJJJJJJJJJJJJJJJJJSSSSSSSSEEEEEIIIIIEEENEEEEEFFFFFUWWUUAAAAAALLLHGGGGGGGGGGGGGGGGGSRRRROOOOQQXXXXXXXXXXXXXXXSXXDDDDDDDPPPAAAUAAAANNNNNNNNN
|
||||
EEJJJJJJJJJJJJJJJJJJSSSSSSSSEEEEEINIIIEENNEEEEEEFFFFFFWAAAAAAAAALLLGGGGGGGGGGGGGGGGGRRRRROOOOQQXQXXXXXXXXXXXXXSSDDDDDDDPPPPPPPAAAANNNNNNNNNN
|
||||
ZZZZZZZZWWJJJJJJJJJJSSSSSSSSEEEEEENIINNNNNNEEFFFFFFFFFFFACAAAAIHHLHHHHHHHHGGGGGGGGGGRRRROOOOOQQQQKXXXXXXXXEGGGGGGDDDDDPPPPPPPPPPPAPNKKKKNKNN
|
||||
ZZZZZZZZZZWJJJJJJJJJSSSSSSSSEEEEEENNINNNNNNNNYFFFFFFFFFFACAAAAIHHHHHHHHHGGGGGGGGGGGGOOOOOOOOOQQQQXXXXXXXXXEGGGGGGDPPDDDPPPPPPPPPPPPPPKKKKKKK
|
||||
ZZZZZZZZZZWJJJJJJJJJSSSSSSSSEEEEEEENNNNNNNNNYYYYFFYFFFFAACCAAAANHHHHHHHHGGGGGGGGGGGGOOOOOOOOOOXTTXXXXXXXXGGGGGGGGPPPPPPPPPPPPPGPPGPKKKKKKKKK
|
||||
HHHHHJJZZZWJJJQJJJJJSSSSSSSSEEEEENNNNNNINNNNNYJYYYYYFFFAACCAAANNHHHHHHHHGGGSSSSSSSOOOOOOOOOOOOXXXXXXXXXXXXHGGGGGGPPVVPPPPPPPPGGGGGGKKKKKKKKK
|
||||
HHHHHHHZZZWQQQQQQQJQSSSSSSSSEEEEENNNNNIINNNYYYYYYYYYYFFAAAAAAAAAHHHHHHHHGGGSEPPPPPSOOOOOOOOOOOXXXXXXXXXXXHHGGGGGGVVVVPPPPPPPPGGGGGGGKKKKKKKK
|
||||
HHHHHHHZZZWQQQQQQCQQSSSSSSSSEEEEENNNNIIIINNYYYYYYYYYYAAAAAAAAAAAHHHHHHHHGGGEEPPPPPSSCOOOOOOOOOOXXXXXXXXXXHHGGGGGVUVVVVPPPPPOPGGGGGGGGKKKKKKK
|
||||
HHHHHHHZZZQQQQQQQQQQQUUUUBEEEBIIIIINIIIIIINYYYYYYYYYYAAAAAAAAAAAHHHHHHHHHHSEEPPPPPSCCCCCCCOOOOOXXXXXXXXXXHHGGGGGVVVVVPPPOOPOORGQGGGGGGKEEKKK
|
||||
HHHHHHHZZZQQBBQQQQBQBUUUUBEBBBBIIIINIIIIIIYYYYYYYYYYAAAAAAAAAAAAHHHHHHHHHHHEEPPPPPECCCCCCCCOCCXXXXXXXXXXXXXJJJVVVVVVVVVOOOOORRGQGGGGSEEEEEKK
|
||||
HHHHHHHZZZBBBBQQQBBBBBUUBBBCCBBBIIIIIIIIIIIYYYYYYYYYTHHHHAAAAAAAAAHHHHHHHHHEPPPPPPEECCCCCCCCCCXXXXXXXXXXXXXJVVVVVVVVVVOOOOOOORRQGGGEEEEVEEEK
|
||||
HHHHHHHZZZBBBBBBQBBBBBBBBBBBBBBBBIIIIIIIIIIIYYYYYYYYHHHHHHAAAAAAAAHWHHBHHHHEPPPPPPECCCCCCCCCCCMXKXXXXXXXXXXJVVVVVVVVVVVSOOOOOOGGGGEEEEEEEEKK
|
||||
HHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBIIIIIIIIIIIYYYYYYYYYHHHHHAAFFFFFTTHHHHHHHHEPPPPPPEECCCCCCCCCMMXXXXXXXXXXXJJVVVVVVVVVVOOOOOOOOOKKGKKKEEEEEKK
|
||||
HHHHHHTBBBBBBBBBBBBBBBBBBBBBBBBBBIIIIIIIIIIQQHHHHHHYYYHHHHHHFFFFTTTHHEEEEEEEEPPPPPEECCCCCCCCCXXXXXXXXXXXXXVVVVVVVVVVVVVOOOOOOOOOKKKKKEEEEKKK
|
||||
HHHHBHBBBBBBBBBBBBBBBBBBBBBBBBBBBBIIIIIIIIIQQQHHHHHHHHHHHHFHFFFFTTTTHEEEEEEEEPPPPPEECCCCCCCCXXXXXXXXJXXXXWWVVVVVVVVVVVVOKKOOOOOOKKKKKEKEKKKK
|
||||
HHHRBBBBBBBBBBBBBBBBOOOBBBBBBBBBBBBIIIIIIIIIQHHHHHHHHHHHHFFFFFFFFFFTEEEEEEEEEPPPPPFCCCCCCCCXXXXXXXXXXXXXWWWWVVVVVVVVVVVVKKOKKKKKKKEEKEKKKKKK
|
||||
HHHHIBBBBBEBBBBBBBOOOOOBBOOTBBBBBBBWWWIIIIIIIQHHHHHHHHHHHHFFFFFFFFFTEEEEEEEEEPPPPPFCCCCCCCCXXXXXXXXXXXWWWWWWWWVVVVVVVVVVKKOKKKKKKKEEEEKKKKKK
|
||||
RRRRBBLLBBEBBBBBBOOOOOOOOOOOBBBBBBBBWWWIIIIQQQQHQQHHHHHHFFFFFFFFFFFEEEEEEEEEEPPPPPFFCCICCCCXXXXXXXXXXXXWWWWWWWWWVVVVVVVKKKKKKKAKKKEEEEKKKKKK
|
||||
RRRRRBBLRREBBBBBBOOOOOOOOOOBBBBBBBBBWWWIIIIQQQQQQQHHHHHHFFFFFFFFFFKEEEEEEEEEEEFFFFFFIIICCCCCXXXXXXXXXXXWWWWWWWWWVVQQVVVVKKKKAKAKKKEEEKKKKKKK
|
||||
RRRRRBRRRRRBOBOBOOOOOOOOOOOBBBBBBBBBBWWIIIQQQQQQQQHMHHHLFFFFFFFFFFFFEEEEEEEEEFFFFFFFFIIICTCCXYXXXXXXXXXXWWWWWWWWVVQQQQQJAAKAAAAKKKEEEEKKKKKK
|
||||
RRRRRRRRRRRROOOOOOOOOOOOOOBBBBBBBUBBBWIIIQQQQQQQQQQQFHHHFFFFFFFFFFFFEEEEVEEEEFFFFFFFFHHHTTCAXYYXXXXXXWWWWWWWWWWWWQQQQQAAAAAAAAAAAAEECEKKKCCC
|
||||
RRRRRRRRROOROUOOOOOOOOOOOOOBBBBBBBBBBBIQBQQQQQQQQQQQFFHFFFFFFFFFFFFFFEEEVEEVVVFFFFFFHHHHTTCAYEYYYYYXWWWWWWWWWWWWQQQQQQAAAAAAAAAAMACCCCKKCCCC
|
||||
RRRRRRRRROOOOUUOOOOOOOOOHOHHBBBBBBBBBBBBBQQQQQQQQQQQFFFFFFFFFPFFFUUFFFEEVEVVVVVVFFFFFHHHTTTYYYYYYNYYYYWWWWWWWWWWWQQQQQAAAAAAAAAAAAACCCCCCCCC
|
||||
RRRRRRRRROOOUUUUOOOOOOOHHHHHBBBBBBBBBBBBBQQQQQQQQQQFFFPFFPFFFPPPUUUUUFUUVVVVVVVVFFFFFHHTTTYYYYYYYYYYYYWWWWWWWWWWWHQQQQQAAAAAAAAAAAAACCCCCCCC
|
||||
RRRRRRRRRROOOUUUUOOOOOOTTTHBBBBBBBBBBBBMQQQQQQQQQQQFFFPPPPZPPPPPUUUUUUUUVVVVVVVVVVFHHHHHTTYYYYYYYYYYYYWWWWWWWWWWWHHQQQQAAAAAAAAAAAAACCCCCCCC
|
||||
RRRRRRRRRROOUUUUUUUTTOOOTTBBHBBBBZBBBZZQQQQQQQQQQQQFFPPPPPPPPPPPUUUUUUUUUVVVVVVVVHHHHHHHHYYYYYYYYYYYTEWWWWWWWWWVJJHQQQQAAATAAAAAAAAAZCCCCCCC
|
||||
RRRRRRRRRROOUUUUUIUUTTTOTTTBBBBZZZZZZZZZHQQQQQKKKKQFFPPPPPPPPPPPUUUUUUVVVVVVVVVHHHHHHHHHHYYYYYYYYYYYTEEEWWWWWJJJJJJKKQQQQQAAAAAAAAAACCCCCCCC
|
||||
RRRRRRRRRROOOUUUUUTTTTTTTTTBBBBZZZZZZZZHHHXXXXXKKXXXPPPPPPPPPPPPUUUUUUVVVVVVGVVVVHHHHHHHHYYYYYYYYYYYEEEEWWWJWJJJJJKKKKQQQDDDAAAAAAAACACCCCCC
|
||||
GRRRRRRRRROOUUUUUKDDTTTTTTTBBBZZZZZZZZZZHHXXXXXKKXXXPPPPPPPPPPPUUUUUUUVVGGVGGVHHHHHHHHHHHTTTYYYYYYAYEEEWWWWJJJJJJJKKKKQQQDDDDAAAAAAAAAACCCCC
|
||||
GGGRRBBRROOOOUUUUKDDTDTTTTTTBBBZZZZZZZZZZGXXXXXXXXXXPPPPPPPPPPPZUUUUUUUVVGVGGGHHHHHHHHHHHTTTYYYYYYYYEEEEWWWJJJZZZZKKKKQQQDDDDAAAAAAAAAAACCCC
|
||||
GGGGGGBRROOOOOOODDDDDDTTTTTTTTTZZZZZZZZGGGGGSXXXXXXXXXXPPPPPPPPUUUUUUUUGGGGGGHHHHHHHHHHHHTTTTYYYYLYEEEEEEEWWJJZZZZQQQQQQDDDDDAAAAAAAAAAACCCT
|
||||
GGGGGBBOOOOODDDDDDDDDDTTTTTTTTTZZZZZZZGGGGGGSXXXXXXXXXXPPPPPPPPUUUUUUUUUGGGGGWHHHHHHHHHHHHTTTEYYYYYYEEEVEJJJJJZZZZQQQQNQPDDDDAAAAAAAAAAAAATT
|
||||
GGBBBBBOOOOODDDDDDDDDDDTTTTTTTTVZZOZZGGGGGGGSXXXXXXXXXXPPPPPPPPPPUUUUUUUUGGGGGHHHHHHHHHHHHTTEEEEYYYEEEETJJJJJJZZZZQQQQNNPPDDDAAAAAAAAAAAAAAA
|
||||
GGBBBBOOOODODDDDDDDDDDDDTTTTTTTVZZZZZGGGGGSSSSSSXXXXXXXXPPPPPPPPPUUPUUUURKGSSSHHHHHHHHHHTTEEEEEEYYEEEERTTJJJZZZZZZJJJJJJPPDDDADDAAAAAAAAAAAA
|
||||
GBBBBBBOOODDDDDDDDDDDDDDTTTTTTTTAAAGGGGGGGSSSSSXXXXXXXXXPPPPPPPPPPPPRUVVRRSSSSSHSSSHHHHTTTEEEEEEEEEEETRTTTTGZZZZZZZZZZZZZPDDDDDAAAAAOAAAAAAL
|
||||
GBBBBBBHOHDDDDDDDDDDDDDDTTTTTTTTAGAGGGGGGGGASSSXXXXXXXXXXXPPPPPPPPPRRVVRRRSSSSSSSSHHHHHTTTTEEEEEEEEETTTETTTTZZZZZZZZZZZZZPDDDOOOAAAOOAAAAAAA
|
||||
GBBEHHOHHHDDDDDDDDDDDDDTTTTTTTAAAGWGGGGGGGGASSSSXXXXXXXXXPPPPPPRRRRRRRRRRRSSSSSSSSHHMMSSTTTTEEEEEEEETTTETTTTZZZZZZZZZZZZZOOODOOOAAAAAAAAAASA
|
||||
GBEEEHHHHHDDDDDDDDDDDDDDDTTTTTAAAGGGGGGGGGGAASXXXXXXXXXXPPPPRRPRRRRRRRRRRRRRSSSSSSSSSMSTTTEEEEEEEEETTGTTTTTTZZZZZZZZZZZZZOGOOOOOOOSOOONASSSS
|
||||
GBEHHHHHHHHDDDDDDDDDDDDDBTTTAAAAAGGGGGGGAAAAXXXXXXXXXXXGPPPPRRRRRRRRRRRRRRSSSSVVSSSSSSSSSSWWWWEEEEETEGTTTTTTZZZZZZZZZZZZZOGOOOOOOOOOOOOJJSSS
|
||||
GHHHHHHHHHDDDDDDDMDDDDDDBTTAAAAAAAGGAGGAAAAAXXXXXXXXXXXGPPPPTRRRRRRRRRRRRRSSSVVGSSSSSSSSASWWWWEEEEEEETTTNTTTZZZZZZZZZZZZZOOOOOOOOOOOOOJJSSSJ
|
||||
GHHHHHHHHHHDDDDDDDDDQQQDQAAAAAAAAAAGAGGAAAAAXXXXXKXXXXXXWWWPRRRRRRRRRRRRRRSVVVVGSSSSSSSSSQJJEEEEEEEEETNTNTTTZZZZZZZZZZZZZOOOOOOOOOOOOJJJJJSJ
|
||||
GHGHHHHHHHHDDDDDDQQQQQQQQQQAAAAAAAAAAAAAAAAAAAAXXXXXGRRRRRRRVRRRRRRRRRRRRRGVVVVVVSVSSSSSSJJJEEEEEEEOLNNNTTTTZZZZZZZZZZZZZXOOOOOOOOOOONJJJJJJ
|
||||
GGGHHHHHFFFFDBBQQQQQQQQQQQQAAAAAAAAAAAAAAAAAAAAXNNNNGRRRRRRRVRRRWRRRRRRRRRRVVVVVVVVVVSSSJJJJJJJWWEELLNNNNTTTZZZZZZZZZZZZZXOXOOOOOOOOOOOJJJJJ
|
||||
GGGHHHHHFFFFFBBBQQQQQQQQQQQAAAAAASAAAAAAAAACCCXXGNGGGGGGRRRRRRURRRRRRRRRRSRRQVVVVVVVVJJJJJJJJJJJWWLLLLNNNNNTTTTTTZZZZZZXXXXXXOOOOOOOOOOIJJJI
|
||||
GGGGHHHHFFFFFBGGQQQQQQQQQQQAAAAAASSSSCCCCACCCUUXGGGGGGGRRRRRRRURRRRRRRRRRSSSQVVVVVVVVVJJJJJJJJJJJWLLLLLNNNTTTTTTVZZZZZZXXXXXXOOOOOOOOOOIIIII
|
||||
GGGEFFFHFFFFFFFGBGGGGGGGGQQQAASSSSSSSCCCCACCCUUUGGGGGGGGGRRGUUURTRRRTRRRRSSQQQVVVVVVRRRJJJJJJJJJWWLLLLLLNLLTTTTTTZZZZZZXXXXXXOOOOOOOOOIIIIII
|
||||
GGGGPFFFFFFFNFFGGGGGGGGGGAAQQAASSSSSSCCCCCCCCUUUUGGUGGGGGGGGUUURTTRRTRRSSSQQQQVVVVVVRRRRJJJJJJJJWWWWLLLLLLLLGTTTAZZZZZZIXXXXXOOOOOOIXXIIIIIK
|
||||
GGGGPPPFFFLFFFTGGGGGGGGGGNAQAASSSSSSZZCCCCCCCCUUUUGUGGGGGGGGGTTTTTTTTRRRSSQQQVVVVVVVRRRRJJJJJJKWWWWWLLLLLLLLLTTTAZZZZZZAXXXXXXXOOOOIXIIIIIII
|
||||
PGGPPPPFFFLLGGGGGGGGGGGGQAAAASSSSSSSSSNNCCCCCCUUUUUUUGGGGGGGGTTTTTTTTTRTTTMQQVVVVVVVRRRRJJJJJMKKKWLLLLLLLLLLLAAAAZZZZZZAXXXXXXXXXXIIIIIIIIII
|
||||
PPGPPPPPFLLLLLGGGGGGGGGGCCCCASSSSSSSSSNCCCCECCUUUUUUGGGGGGGGGTTTTTTTTTTTTTTVVVVVVVVRRRRRJRJJJJKKKKLLLLLLLLLAAAAAAZZZZZZAXXXXXXXXXXIIIIIIIIII
|
||||
PPPPPPPPFLLLLLSSGGGGGGGWCCCCCSSSSSSSSSNNCNCCCCCUUUGGGGGGGGGGGGTTTTTTTTTTTTTTVVVVVVRRRRRRRJJJRKKKKKLLLLLLLLLAAAAAAZZZZZZAXXXXXXXXXIIIIIIIIIII
|
||||
PPPPPPPPPPPPLPPSWWGGWWWWCCCCSSVSSSUUUNNNNNNNCCCCCGGCGGGGGGGGGGTJTTTTTTTTTTTTCCVVRRRRRTTRRRJJJKKKKKLLLLLLLLLAAAAAAZZZZZZAXXXKXXXXXXIIIIIIIIII
|
||||
PPPVVPPVPPPPPPPPPWGGGGWWCZCSSSSSSSUUUUUNNNNNCNNNNGGGGGGGGGGGJTTJJJTTTTTTTTTTTCCVRRRTTTTTTTOOJKKKKKKLLLLLLLAAAAAJJJJJJTJXXXXKKKKXIIIIIIIIIIII
|
||||
PPPVVVVVPPPPPPPPPWGWWWWZZZZGGSSSUUUUUUUUNNNNNRRRNNGGGGGGGGGGJJJJJJJJJJTTTTTTTTMMRRTTTTTTTTOKJKKKKKKKKKLLLAAAAAAJJJJJJJJJXXXKKKKHINNIIIIIIIII
|
||||
PPPVVVVVVVVPPPPPPWWWWIIIGGGGGSSUUUUUUUUUUNTTNTRRRGGGGAGGGGJJJJJJJJJJJTTTTMMMMMMMRRRTTTTTTTKKKKKKKKKKKKKLLLAAJJAJJJJJJJJJJJKKKKKKNNNIIIIIIIII
|
||||
SPPVVVVVVVPPPPPPPWWIIIIIGGGGGGGGUUUUUUUUUNTTTTCTRGRGGAGZJGJJJJJJJJJJJJTTMMMMMMMMRRRRTTTTTTTKKKKKKKKKKKKLLAAAJAAJJJJJJJJJJJKKKKKKKNIIIIIIIICC
|
||||
SPSVVVVVVVPPPPPPRWWIEIIIIGGGGGGGUUUUUUUUUTTTTTTTRRRRRJGJJJJCJJJCCJCJJJJHMMMMMMMRRRRRTTTTTTTJKKKKKKKKKKKKLAAJJJJJJJJJJJJJJKKKKQKNNNIIIIIIICCC
|
||||
SSSSSSVVVVPPPPPPPPWIIIIIGGGGGGGFUUUUUUUTUTTTTTTTTRRRRJJJJJJCCJCCCCCCCCJJJBMMMMMRRRRRTTTTTTTJKKKKKKKKKKKAAAAJJJJJJJJJJJJJJKKKKKKNNNIIIIPIIICC
|
||||
SSSSSVVVVPPPPPPPPPPIIIIIGIGGFFFFFFEUUUBBBBBBBBTTRRRRRRRRJJJCCCCCCCCCCJJJZZMMZZVZZZZTTTTTTTTJKKJKKKKKGKKAAJJJJJJJJJJJJJJJKKKKKKKKKNIIIIPIICCC
|
||||
SSSSSVVVVPPMPLLPPPLIIIIIIIGGFFFFFFTTTTBBBBBBBBTRRRRRRRRRJJCCCCCCCCCCCCCJZZZZZZZZZWWTTTTTTWJJJJJKKKKKGKKKGGGJJQJQJJJJJJJDKKKKKKKKKNIIIYCCCCCC
|
||||
SSSSSVVVPPMMMLLLPPPIIIIIIXXFFFFFFFTTTTBBBBBBBBTTXXRRRRRCCCCCCCCCCCCCCCJZZZZZZZZZZZWWWWTWWWWJJJJJJKKKGGKKGGGJGQQQQBNJJJJKKKKKKKKKKKIIYYYYCCCC
|
||||
SSSSSVBMMMMMMLLLPCCIIIIIIXXXFFFFFFTTTTBBBBBBBBTXXXXXRRRRCCCCCCCCCCCCCCZZZZZZZZZZZZZZWWWWWNNJJJJJKKKKXGGGGGGGGQQQBBBBBBBKKKKKKKKKKKKKYYYYYCCC
|
||||
SSSSSVVMMOMMMMMLMCCIIIIIIXSFFFFFFTTTTTBBBBBBBBXXXXXXXTRRRBZCCCCCCCCCCZZZZZZZZZZZZZZHPPPWWNNJJJJJNKNNGGGGGGGGQQQQBBBBBBBBKKKKKKKKKKKDAYYYYAAK
|
||||
SSSSSVCMMMZZZZZZZZCICXIXXXXXXFFFFTTTTTBBBBBBBBXXXXTXTTTRRBBCCCCCCCCCCCCCZZZZZZZZZZZHPPPWNNNJBJJNNNNNGGGGGGGGGQQQBBBBBBBBBKKKKKKKKKKAAAAYYAAK
|
||||
SSSFFFMMMMZZZZZZZZCCCXXXXXXXXFFFFTTJTTBBBBBBBBXXXTTTTTBBBBCCCCCCCCCCCCCCZZZZZZZPPPPPPYPPPNNNNJJNNNNNGGGGGGGGGGQQQBBBBBBBBBBBBCBBAAAAAAAYYAAK
|
||||
SSSFFFFMMMZZZZZZZZCCCZZZZZZZZZFFFFTTYTYTTXXXXXXXTTTTTTTBBBBCCCCCCCCCCCCCZZNNNNNNNNNPPPPPNNNNNJJJNNNGFGGGGGGGGGGQBBBBBBBBBBBBBBBZZAAAAAAAAAAA
|
||||
NNSSMMMMMMZZZZZZZZZZZZZZZZZZZZFFFFUUYYYTTXXXXXXXTTTTTTTBBBBBCCCCCCCCCCCCZZNNNNNNNNNNNNNNPPNNNNNNNNNGGGGGGGCGGGGQBBBBBBBBBBBBBBBZZQQAAAAAAATT
|
||||
NNNNBMMMMMZZZZZZZZZZZZZZZZZZZZUUUFUUUUOTTXOOOXXTTTTTTTBBBBBCCCCCCCCCCCZZZZNNNNNNNNNNNNNNPNNNNNNNNNNGGGGGGCCCGGGQQLBBBBBBBBBBBBBZZQQAXAAAAAAA
|
||||
NNNBBMXMMMZZZZZZZZZZZZCCCCUUUUUUUEUUUUOOOOOOXXXTTTTTTTTGBBBBFFCCSSSSCCUZZZNNNNNNNNNNNNNNPNNNNNNNNNNNGGCRGGCGGGQQQLLBBBBBBBBBBBZZZQQQAAAAAAGG
|
||||
BBNNBBXXMMDMMZZZZZZZZZCCCCUUUUUUUUUUUUOOOOOOTTTTTTTTTBBBBBBBBFCCSSSSSCZZZZNNNNNNNNNNNNNNEEENNNNNNNNNNNCCCCCCCLLLLLLLBBBBBBBBBBZZZQQQQQQAALLG
|
||||
BBBBBBXXXMDMMZZZZZZZZZCCCCUUUUUUUUUUUOOOOOOOTTTTTTTTTBTBTTTFFFFFVSSSSSZZZZNNNNNNNNNNNNNNCEENNEEEENNNNCCCCCCCCLLLLLLLLLBBBBBBBBZZZQQQQQQQQLLG
|
||||
BBBBBBBDDDDDDZZZZZZZZZCCCCUUUUUUUUUUUOOOOOOOTTTTTTTTTTTTTTTTFFFFVSSSSSSSQQNNNNNNNNNNNNNNCEEEDEEENNNZNNCCCCCCCCLLLLLLLLBBBBBZZZZZZQQQQQQLQLLL
|
||||
BBBBBDDDODDDIZZZZZZZZZCCCCCUUUUUUUUUUOOOOOOTTTTTTTTTTTTTTTFFFFFFVVVVVQQQQQNNNQCNNNNNNNNNEEEEEEEENNNZZNCCCCCCCCCCLLLLLLBBBBBZZZZZUUQQQQQLLLLL
|
||||
BBBBBBBDDDTSISSZZZZZZCCCCCUUUUUUUUUUUUOOOOOTTTTTTTTTWTWTTTFFFFFFVVVVVGQQQQNNNQQNNNNNNNNNEEEEEEEENNZZZZCCCCCCCCCCLLLLLLLBBBBZUZUUUUUQQQNLLLLL
|
||||
BBBBBBBDDDDSSSSZZZZZZCCCCCUUUUUUUUUUUUOOOOOMMMMTTTTSWWWWTTFFFFFFFVVVVVQQQQNNNQQNNNNNNNNNEEEEEEEEZZZZCCCCCCCCCCCCLLLLLLUUBUUUUUUUUUUFQQQQLLLL
|
||||
BBBBBBBBDDDSSSCZZZZZZCCCCCVRRUUUUUUUUMMMOOOMMMMTTTWSWWFFFFFFFFFFFVVVVVQQQQNNNQQQQCCEEEEEEEEEEEEEEZZZCCCCCCCCCCCCCLLLLLUUUUUUUUUUUUFFQFFLLLOO
|
||||
YBBBBBBBYDYSSSSZZZCCCCCCCRRRRRUUUUUUUMMMMMMMMMMMMFWWWWFWWFWFWWFFVVVVVVVQQQQQQQQQQQCCCCEEEEEEEEEEEZZZCCCCCCCCCCCCCLLLLLUUUUUUUUUUUUFFFFFFFZZO
|
||||
YYBBBBBBYYYYSSSZZZRCACCCCRRRRRUUUUUUUMMMMMMMMMMMMFWWWWWWWWWWWWFFFVVVVVVQQQQQQQQQQQQCCCCCCCEEEEEEEZZZCCVCCCCCCCCCCCLLUUCUUUUUUUUUUUFFFFFFFZZZ
|
||||
YYBBBBYBYYYSSSSSSRRCACCRRRRRRRUUUUUUMMMMMMMMMMMMMFFFWWWWWWWWWWFFVVVVVVVMQQQQQQQQQQQCCCCCCCEEEEEEEZZZCZVVVCCVVCCVVOOLUUCUUUUUUUUUUUFFFFFFFZZZ
|
||||
YYYBYYYYYYYYSSSRSRRRRRRRRRRRRRUWZZZMMMMMMMMMMMMMMFFFWWWWWWWWWFFFVVVRRRMMQQQQQQQQQQCCCDCCDCEEEEEZZZZZZZZVVVVEVVVVVCCCUCCCUUUUUUUUFFFFZFFFZZZZ
|
||||
YYYYYYSSYYYYSSRRRRRRRRRRJRRJRRRRRZZMMMMMMMMMMMMMMFFFFWWWWWWWWWFFFRRRRRRRGQQQQQQQQQQCCDDDDDDEEEEZZZZZZZVVVVVVVVVVCCCCUCCUUUUUUUUUFFFFZZZFZZZZ
|
||||
YYYSSWSSYYYYSSRRRRRRRRJJJPJJRRZZZZZZZZMMMMMMMMMQMFFFFWWWWWWWWFFFRRRRRREEQQQQQQQQQQQDDDDDDDDDEZZZZZZZZZVVVVVVVVVICCCCUCCCUUUUUUBBBFZZZZZZZZZZ
|
||||
YYYYSSSSSSSSSSRRRRRRRRDJJJJJJZZZZZZZZZMMMMMMMMMMMMMMFFFWWWWWWFFFRRRRRRREQQQQPPQQQQQQDDDDDDDDZZZZZZZZZZZVVVVVVVVIICCCCCCSUUUUUUUUZZZZZZZZZZZZ
|
||||
YYYYSSSSSSSSSSSRRRWRRRDJJJJJJZZZZZZZZZZZZMMMMMMKOFFFFFFFWWWWFFRRRRRRRRPPPQQQPPPQQQQQDDDDDDDHZZZZZZZZZVVVVVVVVIIIICSSSUSSSSUSUUUZZZZZZZZZZZZZ
|
||||
YYYYSSSSSCCQQQSSSSWWRYJJJJJJHZZZZZZZZZZZZMMMMMMKOFFFFFFFFWWWFRRRRRRRRRRRPPQPPPPPQQDDDDDDDDHHHZZZZZZZZVVVVVVVVVVIISSSSSSSSSSSSZRRZZZZZZZZZZZZ
|
||||
YYYYSSSSSQCQQQSSZZZZJJJJJJJJJSZZZZZZZZZZZMMMMQQOOOOOFFFFFFFFRRRRRRRRRRRRPPPPPPPPPQDDDDDDDDDDHWMMZZZZZVVVVVVVVVIIISSSSSSSSSSSSZZZZZZZZZZZZZZZ
|
||||
YYYYYSSSSQQQQQZZZZZZMJJCJJJJJJJZZZZZZZZZZMMRMQQQQOOOOOOFFFFRRRRRRRRRRRRRPPPPPPPPTWDDDWNNDWWWWWMMZZZZZVVVVVVVVVIIIISSSSSSSSSSSSJZZZZZZZZZZZZZ
|
||||
YYYYYYSYSQQQQQQZZZZZZZCCZJJJJZZZZZZZZZZZZZZRROOOOOOOOOFFFRRRRRRRRRRRRRRRPPPPPPPTTWWWWWWWWWWWWMMMMMZZSHHHVVVVIIIIIIIISSSSSSSSSSSZZZZZZZZZZZZZ
|
||||
YYYYYYYYYYQQQQQQZZZZZZZZZBJJJZZZZZZZZZZZAZZZROODOOOOOOOOFFRRRRRRRRRRRPRRRRPPPPPTWYWWWWWWWWWWWWWMMMMZZHHHVHHVIIIIIIISSSSSSSSSHHHSEZZZZZZZZZZZ
|
||||
YYYYYYQQQQQQQQQQQZZZZDZZDDDCZZZZZZZZZZZZAZRRROOOOOOOOOOOFFFFRRRRRRRRRPRPPPPPPPTTWWWWWWWWWWWWWWEEEEMMZZHHHHHHIIIIIISSSSSSSSSSHSSSEZZZZZEEZZZZ
|
||||
YYYYYYYQQQQQQQQZZZZZDDDDDDDDZZZZZZZZZZZZZZROROOOOOOOOOOSFFFFFFRRRRRPPPPPPPPPPTTWWWWWWWWWWWWWWWWEEEMMZHHHHHHHIIIIIISSSSSSSSSSSSSSEEEEZEEEZZZZ
|
||||
YYYYYYYYYQQMQQYRRZZDDDDDDDDDZZZZZZZZRRRRRRROOOOOOOOOOOOSFFFFFFPRRRRRPPPPPPPPPTWWWWWWWWWWWWWWWWWEEMMMMHHHHHHIIIIIIISSSSSSSSSSSSSSEEEZZEEEEEZE
|
||||
YYYYYYYYYYYQQQYRRZZDDDDDDDDDMZZZZOZRRRRRROOOOOOOOOOOOOOFFFFFFPPPPRRPPPPPPPPPPTWWWWWWWWWWWWWWWMMEMMHHHHHHHHHIIIIIISSSSSSSSSSSSSSSEEEEEEEEEEEE
|
||||
YYYYYYYYYYYYYYYYYYYDDDDDDDDDMZZZZZRRRRRRROOOOOOOOOOOOOEEEFFFFPPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWMMMMMMHHHHHHHHIIIIIISSSSSSSSSSSSSSEEEEEEEEEEEEE
|
||||
YYYYYYYYYYYYYYYYYYYCDDDDDDDDZZZZZZRRRRRRRRROOOOOOOOOOOEEEEFPPPPPPPPPPPPPPPPPWWWWWWWWWWWWWWMMMMMMMMMHHHHHHHIIIIIIISSSSSSSSSSSGSSSEEEEEEEEEEEE
|
10
day12/input_test.txt
Normal file
10
day12/input_test.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
RRRRIICCFF
|
||||
RRRRIICCCF
|
||||
VVRRRCCFFF
|
||||
VVRCCCJFFF
|
||||
VVVVCJJCFE
|
||||
VVIVCCJJEE
|
||||
VVIIICJJEE
|
||||
MIIIIIJJEE
|
||||
MIIISIJEEE
|
||||
MMMISSJEEE
|
85
day12/task.txt
Normal file
85
day12/task.txt
Normal file
@@ -0,0 +1,85 @@
|
||||
--- Day 12: Garden Groups ---
|
||||
Why not search for the Chief Historian near the gardener and his massive farm? There's plenty of food, so The Historians grab something to eat while they search.
|
||||
|
||||
You're about to settle near a complex arrangement of garden plots when some Elves ask if you can lend a hand. They'd like to set up fences around each region of garden plots, but they can't figure out how much fence they need to order or how much it will cost. They hand you a map (your puzzle input) of the garden plots.
|
||||
|
||||
Each garden plot grows only a single type of plant and is indicated by a single letter on your map. When multiple garden plots are growing the same type of plant and are touching (horizontally or vertically), they form a region. For example:
|
||||
|
||||
AAAA
|
||||
BBCD
|
||||
BBCC
|
||||
EEEC
|
||||
This 4x4 arrangement includes garden plots growing five different types of plants (labeled A, B, C, D, and E), each grouped into their own region.
|
||||
|
||||
In order to accurately calculate the cost of the fence around a single region, you need to know that region's area and perimeter.
|
||||
|
||||
The area of a region is simply the number of garden plots the region contains. The above map's type A, B, and C plants are each in a region of area 4. The type E plants are in a region of area 3; the type D plants are in a region of area 1.
|
||||
|
||||
Each garden plot is a square and so has four sides. The perimeter of a region is the number of sides of garden plots in the region that do not touch another garden plot in the same region. The type A and C plants are each in a region with perimeter 10. The type B and E plants are each in a region with perimeter 8. The lone D plot forms its own region with perimeter 4.
|
||||
|
||||
Visually indicating the sides of plots in each region that contribute to the perimeter using - and |, the above map's regions' perimeters are measured as follows:
|
||||
|
||||
+-+-+-+-+
|
||||
|A A A A|
|
||||
+-+-+-+-+ +-+
|
||||
|D|
|
||||
+-+-+ +-+ +-+
|
||||
|B B| |C|
|
||||
+ + + +-+
|
||||
|B B| |C C|
|
||||
+-+-+ +-+ +
|
||||
|C|
|
||||
+-+-+-+ +-+
|
||||
|E E E|
|
||||
+-+-+-+
|
||||
Plants of the same type can appear in multiple separate regions, and regions can even appear within other regions. For example:
|
||||
|
||||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
||||
The above map contains five regions, one containing all of the O garden plots, and the other four each containing a single X plot.
|
||||
|
||||
The four X regions each have area 1 and perimeter 4. The region containing 21 type O plants is more complicated; in addition to its outer edge contributing a perimeter of 20, its boundary with each X region contributes an additional 4 to its perimeter, for a total perimeter of 36.
|
||||
|
||||
Due to "modern" business practices, the price of fence required for a region is found by multiplying that region's area by its perimeter. The total price of fencing all regions on a map is found by adding together the price of fence for every region on the map.
|
||||
|
||||
In the first example, region A has price 4 * 10 = 40, region B has price 4 * 8 = 32, region C has price 4 * 10 = 40, region D has price 1 * 4 = 4, and region E has price 3 * 8 = 24. So, the total price for the first example is 140.
|
||||
|
||||
In the second example, the region with all of the O plants has price 21 * 36 = 756, and each of the four smaller X regions has price 1 * 4 = 4, for a total price of 772 (756 + 4 + 4 + 4 + 4).
|
||||
|
||||
Here's a larger example:
|
||||
|
||||
RRRRIICCFF
|
||||
RRRRIICCCF
|
||||
VVRRRCCFFF
|
||||
VVRCCCJFFF
|
||||
VVVVCJJCFE
|
||||
VVIVCCJJEE
|
||||
VVIIICJJEE
|
||||
MIIIIIJJEE
|
||||
MIIISIJEEE
|
||||
MMMISSJEEE
|
||||
It contains:
|
||||
|
||||
A region of R plants with price 12 * 18 = 216.
|
||||
A region of I plants with price 4 * 8 = 32.
|
||||
A region of C plants with price 14 * 28 = 392.
|
||||
A region of F plants with price 10 * 18 = 180.
|
||||
A region of V plants with price 13 * 20 = 260.
|
||||
A region of J plants with price 11 * 20 = 220.
|
||||
A region of C plants with price 1 * 4 = 4.
|
||||
A region of E plants with price 13 * 18 = 234.
|
||||
A region of I plants with price 14 * 22 = 308.
|
||||
A region of M plants with price 5 * 12 = 60.
|
||||
A region of S plants with price 3 * 8 = 24.
|
||||
So, it has a total price of 1930.
|
||||
|
||||
What is the total price of fencing all regions on your map?
|
||||
|
||||
Your puzzle answer was 1402544.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
|
130
day13/code.py
Normal file
130
day13/code.py
Normal file
@@ -0,0 +1,130 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
import re
|
||||
|
||||
class Button:
|
||||
def __init__(self, cost, x, y):
|
||||
self.cost = cost
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def __str__(self):
|
||||
return f'x: {self.x}, y: {self.y}, cost: {self.cost}'
|
||||
|
||||
|
||||
class Prize:
|
||||
def __init__(self, x, y):
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def __str__(self):
|
||||
return f'x: {self.x}, y: {self.y}'
|
||||
|
||||
|
||||
class Machine:
|
||||
def __init__(self, a, b: Button, p: Prize):
|
||||
self.a = a
|
||||
self.b = b
|
||||
self.prize = p
|
||||
|
||||
def __str__(self):
|
||||
s = ''
|
||||
s += 'B_A: ' + self.a.__str__() + '\n'
|
||||
s += 'B_B: ' + self.b.__str__() + '\n'
|
||||
s += 'Prize: ' + self.prize.__str__() + '\n'
|
||||
return s
|
||||
|
||||
|
||||
def parse_input(lines: list[str]) -> list[Machine]:
|
||||
lst = list()
|
||||
brx = re.compile(r'X\+(\d+), Y\+(\d+)')
|
||||
prx = re.compile(r'X=(\d+), Y=(\d+)')
|
||||
|
||||
b_a = None
|
||||
b_b = None
|
||||
m = None
|
||||
for l in lines:
|
||||
if l.startswith('Button A'):
|
||||
m = brx.search(l)
|
||||
b_a = Button(3, int(m.group(1)), int(m.group(2)))
|
||||
if l.startswith('Button B'):
|
||||
m = brx.search(l)
|
||||
b_b = Button(1, int(m.group(1)), int(m.group(2)))
|
||||
if l.startswith('Prize'):
|
||||
m = prx.search(l)
|
||||
p = Prize(int(m.group(1)), int(m.group(2)))
|
||||
machine = Machine(b_a, b_b, p)
|
||||
lst.append(machine)
|
||||
|
||||
return lst
|
||||
|
||||
def _solve1(m: Machine) -> int:
|
||||
# why not brute-force? :)
|
||||
max_a = min(m.prize.x // m.a.x, m.prize.y // m.a.y)+1
|
||||
max_b = min(m.prize.x // m.b.x, m.prize.y // m.b.y)+1
|
||||
|
||||
costs = []
|
||||
for _a in range(max_a):
|
||||
for _b in range(max_b):
|
||||
x, y, cost = m.a.x*_a + m.b.x*_b, m.a.y*_a + m.b.y*_b, m.a.cost*_a + m.b.cost*_b
|
||||
if x == m.prize.x and y == m.prize.y:
|
||||
costs.append(cost)
|
||||
|
||||
if not costs:
|
||||
return None
|
||||
|
||||
return min(costs)
|
||||
|
||||
|
||||
def _solve2(m: Machine) -> int:
|
||||
cost = None
|
||||
times_b = (m.prize.y * m.a.x - m.prize.x * m.a.y) / (m.b.y * m.a.x - m.b.x * m.a.y)
|
||||
times_a = (m.prize.x - m.b.x * times_b) / m.a.x
|
||||
|
||||
#if 100 >= times_a >= 0 and 100 >= times_b >= 0 and times_a.is_integer() and times_b.is_integer():
|
||||
if times_a.is_integer() and times_b.is_integer():
|
||||
cost = int(times_a) * 3 + int(times_b)
|
||||
|
||||
return cost
|
||||
|
||||
|
||||
|
||||
def solve1(lines: list[str]):
|
||||
machines = parse_input(lines)
|
||||
|
||||
cost = 0
|
||||
for m in machines:
|
||||
c = _solve1(m)
|
||||
if not c:
|
||||
continue
|
||||
cost += c
|
||||
|
||||
return cost
|
||||
|
||||
|
||||
def solve2(lines: list[str]):
|
||||
machines = parse_input(lines)
|
||||
|
||||
cost = 0
|
||||
for m in machines:
|
||||
m.prize.x += 10000000000000
|
||||
m.prize.y += 10000000000000
|
||||
c = _solve2(m)
|
||||
if not c:
|
||||
continue
|
||||
cost += c
|
||||
|
||||
return cost
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#lines = Input('input_test.txt').lines()
|
||||
lines = Input('input.txt').lines()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve1(lines)) # 27157
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(lines)) # 104015411578548
|
1279
day13/input.txt
Normal file
1279
day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
15
day13/input_test.txt
Normal file
15
day13/input_test.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279
|
78
day13/task.txt
Normal file
78
day13/task.txt
Normal file
@@ -0,0 +1,78 @@
|
||||
--- Day 13: Claw Contraption ---
|
||||
Next up: the lobby of a resort on a tropical island. The Historians take a moment to admire the hexagonal floor tiles before spreading out.
|
||||
|
||||
Fortunately, it looks like the resort has a new arcade! Maybe you can win some prizes from the claw machines?
|
||||
|
||||
The claw machines here are a little unusual. Instead of a joystick or directional buttons to control the claw, these machines have two buttons labeled A and B. Worse, you can't just put in a token and play; it costs 3 tokens to push the A button and 1 token to push the B button.
|
||||
|
||||
With a little experimentation, you figure out that each machine's buttons are configured to move the claw a specific amount to the right (along the X axis) and a specific amount forward (along the Y axis) each time that button is pressed.
|
||||
|
||||
Each machine contains one prize; to win the prize, the claw must be positioned exactly above the prize on both the X and Y axes.
|
||||
|
||||
You wonder: what is the smallest number of tokens you would have to spend to win as many prizes as possible? You assemble a list of every machine's button behavior and prize location (your puzzle input). For example:
|
||||
|
||||
Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279
|
||||
This list describes the button configuration and prize location of four different claw machines.
|
||||
|
||||
For now, consider just the first claw machine in the list:
|
||||
|
||||
Pushing the machine's A button would move the claw 94 units along the X axis and 34 units along the Y axis.
|
||||
Pushing the B button would move the claw 22 units along the X axis and 67 units along the Y axis.
|
||||
The prize is located at X=8400, Y=5400; this means that from the claw's initial position, it would need to move exactly 8400 units along the X axis and exactly 5400 units along the Y axis to be perfectly aligned with the prize in this machine.
|
||||
The cheapest way to win the prize is by pushing the A button 80 times and the B button 40 times. This would line up the claw along the X axis (because 80*94 + 40*22 = 8400) and along the Y axis (because 80*34 + 40*67 = 5400). Doing this would cost 80*3 tokens for the A presses and 40*1 for the B presses, a total of 280 tokens.
|
||||
|
||||
For the second and fourth claw machines, there is no combination of A and B presses that will ever win a prize.
|
||||
|
||||
For the third claw machine, the cheapest way to win the prize is by pushing the A button 38 times and the B button 86 times. Doing this would cost a total of 200 tokens.
|
||||
|
||||
So, the most prizes you could possibly win is two; the minimum tokens you would have to spend to win all (two) prizes is 480.
|
||||
|
||||
You estimate that each button would need to be pressed no more than 100 times to win a prize. How else would someone be expected to play?
|
||||
|
||||
Figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes?
|
||||
|
||||
Your puzzle answer was 27157.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
As you go to win the first prize, you discover that the claw is nowhere near where you expected it would be. Due to a unit conversion error in your measurements, the position of every prize is actually 10000000000000 higher on both the X and Y axis!
|
||||
|
||||
Add 10000000000000 to the X and Y position of every prize. After making this change, the example above would now look like this:
|
||||
|
||||
Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=10000000008400, Y=10000000005400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=10000000012748, Y=10000000012176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=10000000007870, Y=10000000006450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=10000000018641, Y=10000000010279
|
||||
Now, it is only possible to win a prize on the second and fourth claw machines. Unfortunately, it will take many more than 100 presses to do so.
|
||||
|
||||
Using the corrected prize coordinates, figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes?
|
||||
|
||||
Your puzzle answer was 104015411578548.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
123
day14/code.py
Normal file
123
day14/code.py
Normal file
@@ -0,0 +1,123 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
import re
|
||||
from collections import defaultdict
|
||||
|
||||
class Robot:
|
||||
def __init__(self, x, y, xv, yv: int):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.xv = xv
|
||||
self.yv = yv
|
||||
|
||||
def step(self, max_x, max_y, n=1):
|
||||
for _ in range(n):
|
||||
self.x = (self.x + self.xv) % max_x
|
||||
self.y = (self.y + self.yv) % max_y
|
||||
|
||||
class Map:
|
||||
def __init__(self, x, y: int, robots: list[Robot]):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.robots = robots
|
||||
self.steps = 0
|
||||
|
||||
def __str__(self):
|
||||
field = [[0 for _ in range(self.x)] for _ in range(self.y)]
|
||||
for r in self.robots:
|
||||
field[r.y][r.x] += 1
|
||||
return '\n'.join(''.join('*' if x>0 else ' ' for x in l) for l in field)
|
||||
|
||||
def step(self, n=1):
|
||||
for r in self.robots:
|
||||
r.step(self.x, self.y, n)
|
||||
self.steps += n
|
||||
|
||||
def solve1(self) -> int:
|
||||
self.step(100)
|
||||
_x, _y = self.x // 2, self.y // 2
|
||||
field = [[0 for _ in range(self.x)] for _ in range(self.y)]
|
||||
for r in self.robots:
|
||||
field[r.y][r.x] += 1
|
||||
|
||||
q1 = 0
|
||||
for y in range(0, _y):
|
||||
for x in range(0, _x):
|
||||
q1 += field[y][x]
|
||||
|
||||
q2 = 0
|
||||
for y in range(0, _y):
|
||||
for x in range(_x+1, len(field[0])):
|
||||
q2 += field[y][x]
|
||||
|
||||
q3 = 0
|
||||
for y in range(_y+1, len(field)):
|
||||
for x in range(0, _x):
|
||||
q3 += field[y][x]
|
||||
|
||||
q4 = 0
|
||||
for y in range(_y+1, len(field)):
|
||||
for x in range(_x+1, len(field[0])):
|
||||
q4 += field[y][x]
|
||||
|
||||
return q1*q2*q3*q4
|
||||
|
||||
def solve2(self) -> int:
|
||||
while not self.has_n_adjacent(20):
|
||||
self.step()
|
||||
return self.steps
|
||||
|
||||
|
||||
def has_n_adjacent(self, n=10):
|
||||
d = defaultdict(set)
|
||||
for r in self.robots:
|
||||
d[r.x].add(r.y)
|
||||
|
||||
def search(l, n):
|
||||
for i in range(len(l) - n):
|
||||
if l[i+n-1] - l[i] == n-1:
|
||||
return True
|
||||
return False
|
||||
|
||||
for x in d:
|
||||
l = sorted(list(d[x]))
|
||||
if search(l, n):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def parse_input(lines: list[str], x, y: int):
|
||||
rrx = re.compile(r'p=(\d+),(\d+) v=(-*\d+),(-*\d+)')
|
||||
robots = list()
|
||||
for l in lines:
|
||||
m = rrx.search(l)
|
||||
r = Robot(int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)))
|
||||
robots.append(r)
|
||||
|
||||
m = Map(x, y, robots)
|
||||
return m
|
||||
|
||||
def solve1(lines: list[str]):
|
||||
#m = parse_input(lines, 11, 7)
|
||||
m = parse_input(lines, 101, 103)
|
||||
return m.solve1()
|
||||
|
||||
|
||||
def solve2(lines: list[str]):
|
||||
m = parse_input(lines, 101, 103)
|
||||
m.solve2()
|
||||
print(m)
|
||||
return m.steps
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#lines = Input('input_test.txt').lines()
|
||||
lines = Input('input.txt').lines()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve1(lines)) # 27157
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(lines)) # 8258
|
500
day14/input.txt
Normal file
500
day14/input.txt
Normal file
@@ -0,0 +1,500 @@
|
||||
p=7,85 v=-65,-36
|
||||
p=4,17 v=-37,-76
|
||||
p=60,71 v=-8,-19
|
||||
p=82,99 v=20,-59
|
||||
p=56,11 v=50,-21
|
||||
p=20,25 v=66,12
|
||||
p=57,97 v=-67,-20
|
||||
p=89,37 v=10,52
|
||||
p=32,51 v=46,56
|
||||
p=72,40 v=26,-80
|
||||
p=65,23 v=1,91
|
||||
p=74,9 v=-37,46
|
||||
p=44,72 v=-89,96
|
||||
p=49,34 v=67,1
|
||||
p=16,83 v=11,-47
|
||||
p=56,90 v=42,78
|
||||
p=42,37 v=71,-34
|
||||
p=64,16 v=-33,-50
|
||||
p=70,21 v=-42,-90
|
||||
p=31,81 v=20,-94
|
||||
p=32,8 v=-5,-38
|
||||
p=100,10 v=44,64
|
||||
p=24,93 v=-90,63
|
||||
p=45,20 v=-3,-31
|
||||
p=13,18 v=-65,30
|
||||
p=61,26 v=59,-79
|
||||
p=30,67 v=-25,39
|
||||
p=57,13 v=13,25
|
||||
p=56,27 v=-38,-55
|
||||
p=68,9 v=-92,-32
|
||||
p=81,34 v=-54,97
|
||||
p=65,40 v=-4,87
|
||||
p=7,87 v=-10,-2
|
||||
p=48,78 v=-8,-59
|
||||
p=52,62 v=-17,-98
|
||||
p=75,6 v=-79,-32
|
||||
p=6,53 v=-82,-44
|
||||
p=45,28 v=37,90
|
||||
p=53,10 v=88,-77
|
||||
p=21,35 v=-62,-36
|
||||
p=25,61 v=12,44
|
||||
p=23,96 v=54,1
|
||||
p=76,43 v=-6,-35
|
||||
p=20,47 v=-2,22
|
||||
p=82,15 v=-83,47
|
||||
p=45,71 v=-19,-11
|
||||
p=87,35 v=-45,-68
|
||||
p=81,101 v=14,-26
|
||||
p=58,42 v=17,58
|
||||
p=71,78 v=-9,-22
|
||||
p=30,97 v=20,43
|
||||
p=49,91 v=-13,-54
|
||||
p=27,86 v=45,-42
|
||||
p=26,0 v=45,-32
|
||||
p=22,92 v=41,-48
|
||||
p=95,11 v=22,-52
|
||||
p=79,47 v=81,17
|
||||
p=74,74 v=-46,5
|
||||
p=65,100 v=21,-73
|
||||
p=4,72 v=-6,73
|
||||
p=24,43 v=-18,-51
|
||||
p=56,58 v=53,-39
|
||||
p=62,27 v=-12,70
|
||||
p=43,77 v=-81,33
|
||||
p=11,15 v=-6,29
|
||||
p=60,7 v=59,71
|
||||
p=86,79 v=94,55
|
||||
p=57,29 v=-7,-6
|
||||
p=62,39 v=-33,14
|
||||
p=28,5 v=-77,26
|
||||
p=5,49 v=-67,-5
|
||||
p=10,33 v=-48,1
|
||||
p=69,4 v=89,82
|
||||
p=98,95 v=33,23
|
||||
p=4,27 v=48,-71
|
||||
p=3,24 v=-78,-38
|
||||
p=54,2 v=68,20
|
||||
p=69,14 v=30,59
|
||||
p=39,29 v=92,-16
|
||||
p=45,77 v=-55,-53
|
||||
p=98,70 v=82,27
|
||||
p=8,76 v=-4,-93
|
||||
p=26,39 v=36,-6
|
||||
p=96,88 v=-95,49
|
||||
p=24,48 v=58,-97
|
||||
p=71,67 v=-73,-16
|
||||
p=50,89 v=67,9
|
||||
p=93,3 v=-49,-89
|
||||
p=4,24 v=-94,-44
|
||||
p=28,16 v=45,-50
|
||||
p=64,36 v=72,81
|
||||
p=0,40 v=-10,-46
|
||||
p=89,54 v=10,-30
|
||||
p=16,99 v=78,-22
|
||||
p=95,32 v=69,35
|
||||
p=82,72 v=-42,-85
|
||||
p=60,96 v=-88,-42
|
||||
p=49,52 v=-76,-58
|
||||
p=40,8 v=-30,-90
|
||||
p=28,32 v=70,-27
|
||||
p=93,14 v=12,-85
|
||||
p=80,26 v=-7,-73
|
||||
p=85,74 v=-49,-70
|
||||
p=75,66 v=5,73
|
||||
p=76,30 v=39,-85
|
||||
p=35,32 v=46,17
|
||||
p=89,36 v=72,-23
|
||||
p=89,33 v=-61,52
|
||||
p=8,4 v=74,71
|
||||
p=92,102 v=-82,95
|
||||
p=66,50 v=35,97
|
||||
p=78,63 v=-61,-60
|
||||
p=42,98 v=-39,39
|
||||
p=39,83 v=-64,61
|
||||
p=51,30 v=30,75
|
||||
p=44,29 v=25,47
|
||||
p=87,89 v=24,71
|
||||
p=89,12 v=-87,-44
|
||||
p=32,60 v=79,-24
|
||||
p=96,21 v=31,-67
|
||||
p=27,24 v=58,24
|
||||
p=1,84 v=-23,-7
|
||||
p=18,67 v=-35,79
|
||||
p=35,51 v=71,97
|
||||
p=54,51 v=-42,57
|
||||
p=0,52 v=-87,80
|
||||
p=20,79 v=-33,-85
|
||||
p=89,101 v=-28,-95
|
||||
p=70,22 v=-10,-56
|
||||
p=57,22 v=29,-22
|
||||
p=87,94 v=-21,35
|
||||
p=80,15 v=95,32
|
||||
p=70,89 v=-18,30
|
||||
p=15,99 v=95,83
|
||||
p=60,56 v=55,6
|
||||
p=92,66 v=-91,-99
|
||||
p=53,82 v=89,-65
|
||||
p=20,100 v=24,-60
|
||||
p=56,58 v=-67,97
|
||||
p=7,79 v=2,-13
|
||||
p=29,23 v=-47,30
|
||||
p=94,26 v=94,87
|
||||
p=42,22 v=-46,86
|
||||
p=46,44 v=78,75
|
||||
p=83,6 v=43,-32
|
||||
p=84,2 v=-44,-89
|
||||
p=22,82 v=-1,-39
|
||||
p=49,80 v=-4,-13
|
||||
p=77,93 v=-83,43
|
||||
p=35,82 v=-89,-71
|
||||
p=24,7 v=24,-32
|
||||
p=98,64 v=13,-32
|
||||
p=40,75 v=59,73
|
||||
p=41,30 v=-5,-56
|
||||
p=39,102 v=-73,25
|
||||
p=31,40 v=58,-57
|
||||
p=95,96 v=-58,18
|
||||
p=51,64 v=-36,3
|
||||
p=74,3 v=-63,7
|
||||
p=16,67 v=66,-24
|
||||
p=69,54 v=-96,91
|
||||
p=17,62 v=-72,-64
|
||||
p=9,57 v=3,-1
|
||||
p=82,86 v=63,-81
|
||||
p=37,24 v=21,-50
|
||||
p=35,76 v=-29,-49
|
||||
p=41,4 v=69,23
|
||||
p=47,71 v=-88,32
|
||||
p=97,51 v=65,-12
|
||||
p=9,29 v=36,-33
|
||||
p=19,101 v=66,20
|
||||
p=18,19 v=-34,48
|
||||
p=45,99 v=73,15
|
||||
p=24,25 v=92,35
|
||||
p=43,83 v=97,66
|
||||
p=22,16 v=-73,-38
|
||||
p=31,82 v=-5,60
|
||||
p=67,3 v=78,-29
|
||||
p=45,69 v=59,22
|
||||
p=99,101 v=-82,66
|
||||
p=96,88 v=-6,15
|
||||
p=27,62 v=-56,51
|
||||
p=80,78 v=-62,-99
|
||||
p=76,88 v=-67,-26
|
||||
p=74,15 v=64,53
|
||||
p=77,25 v=37,-83
|
||||
p=55,47 v=-30,-57
|
||||
p=0,54 v=-32,-30
|
||||
p=46,43 v=58,-12
|
||||
p=66,66 v=-93,-97
|
||||
p=5,14 v=-23,-10
|
||||
p=60,3 v=-89,-30
|
||||
p=69,38 v=9,-28
|
||||
p=69,12 v=-25,-62
|
||||
p=69,98 v=-8,83
|
||||
p=59,32 v=-13,35
|
||||
p=15,12 v=41,-62
|
||||
p=32,71 v=-25,7
|
||||
p=93,100 v=-49,-3
|
||||
p=63,25 v=-20,-67
|
||||
p=36,28 v=37,-56
|
||||
p=44,54 v=46,-98
|
||||
p=22,99 v=24,-95
|
||||
p=33,8 v=-73,-78
|
||||
p=10,68 v=74,10
|
||||
p=84,92 v=74,70
|
||||
p=76,9 v=34,-21
|
||||
p=17,3 v=12,-51
|
||||
p=76,1 v=77,72
|
||||
p=89,76 v=-73,-23
|
||||
p=74,94 v=64,-3
|
||||
p=18,49 v=-14,68
|
||||
p=40,90 v=-9,-48
|
||||
p=60,47 v=47,58
|
||||
p=9,37 v=-27,-28
|
||||
p=66,84 v=72,66
|
||||
p=11,57 v=62,-17
|
||||
p=95,64 v=15,-69
|
||||
p=55,8 v=46,94
|
||||
p=8,92 v=-99,-24
|
||||
p=63,36 v=-97,-29
|
||||
p=38,24 v=46,-99
|
||||
p=2,39 v=-82,63
|
||||
p=66,45 v=5,29
|
||||
p=34,9 v=64,-9
|
||||
p=24,35 v=-56,81
|
||||
p=24,90 v=-90,38
|
||||
p=94,22 v=-86,78
|
||||
p=98,55 v=15,69
|
||||
p=23,40 v=-94,92
|
||||
p=51,10 v=-11,-85
|
||||
p=13,54 v=11,-30
|
||||
p=6,37 v=-61,-40
|
||||
p=0,71 v=-74,-71
|
||||
p=79,32 v=-75,24
|
||||
p=15,10 v=-35,-83
|
||||
p=100,96 v=-57,32
|
||||
p=6,65 v=-45,54
|
||||
p=20,73 v=-56,10
|
||||
p=4,102 v=41,63
|
||||
p=17,19 v=-91,68
|
||||
p=73,58 v=-79,91
|
||||
p=96,57 v=-40,74
|
||||
p=20,22 v=-9,-27
|
||||
p=56,73 v=32,84
|
||||
p=22,11 v=-56,-61
|
||||
p=21,19 v=54,-68
|
||||
p=81,24 v=-79,93
|
||||
p=52,25 v=14,71
|
||||
p=37,15 v=96,-45
|
||||
p=13,31 v=41,-67
|
||||
p=58,90 v=72,-94
|
||||
p=90,4 v=10,-3
|
||||
p=93,86 v=81,20
|
||||
p=65,85 v=-8,-19
|
||||
p=93,23 v=31,-50
|
||||
p=26,87 v=42,21
|
||||
p=73,1 v=31,-84
|
||||
p=94,52 v=-40,-51
|
||||
p=52,79 v=10,-46
|
||||
p=52,81 v=63,32
|
||||
p=85,18 v=-78,-21
|
||||
p=40,1 v=12,-95
|
||||
p=82,54 v=-36,-22
|
||||
p=77,70 v=-71,-21
|
||||
p=1,32 v=-66,-63
|
||||
p=45,3 v=-68,-66
|
||||
p=78,99 v=35,-84
|
||||
p=13,18 v=-57,87
|
||||
p=89,69 v=94,90
|
||||
p=5,35 v=-19,-34
|
||||
p=98,14 v=53,-84
|
||||
p=52,78 v=38,10
|
||||
p=84,47 v=-83,58
|
||||
p=75,86 v=-79,-42
|
||||
p=71,0 v=5,-71
|
||||
p=30,87 v=62,-71
|
||||
p=43,57 v=4,51
|
||||
p=19,18 v=83,75
|
||||
p=26,86 v=-77,-34
|
||||
p=45,4 v=79,59
|
||||
p=61,3 v=-7,86
|
||||
p=96,77 v=-45,-37
|
||||
p=86,26 v=-65,83
|
||||
p=26,39 v=-77,35
|
||||
p=9,10 v=-23,25
|
||||
p=40,83 v=-8,48
|
||||
p=44,10 v=-82,-66
|
||||
p=20,84 v=-51,-93
|
||||
p=42,67 v=71,78
|
||||
p=40,21 v=-89,76
|
||||
p=87,29 v=-63,75
|
||||
p=90,82 v=32,56
|
||||
p=30,18 v=79,-78
|
||||
p=79,72 v=-62,-82
|
||||
p=29,85 v=-18,26
|
||||
p=49,48 v=-97,-86
|
||||
p=29,27 v=-81,98
|
||||
p=45,68 v=-72,22
|
||||
p=67,34 v=-38,77
|
||||
p=12,27 v=91,58
|
||||
p=67,33 v=76,-79
|
||||
p=81,38 v=-95,-97
|
||||
p=70,3 v=-42,-20
|
||||
p=45,42 v=-34,-17
|
||||
p=98,70 v=27,73
|
||||
p=26,33 v=24,12
|
||||
p=71,21 v=-75,-84
|
||||
p=16,84 v=7,95
|
||||
p=86,93 v=-71,-69
|
||||
p=28,72 v=-42,-90
|
||||
p=87,90 v=-96,60
|
||||
p=3,74 v=78,5
|
||||
p=21,65 v=83,96
|
||||
p=6,9 v=-49,45
|
||||
p=43,11 v=-40,-42
|
||||
p=77,14 v=21,43
|
||||
p=44,61 v=-18,-4
|
||||
p=80,19 v=-96,-32
|
||||
p=13,84 v=20,50
|
||||
p=23,2 v=70,-66
|
||||
p=35,68 v=96,-47
|
||||
p=51,34 v=59,-50
|
||||
p=2,58 v=73,-12
|
||||
p=30,26 v=-26,-22
|
||||
p=79,57 v=70,50
|
||||
p=33,46 v=-5,-63
|
||||
p=99,91 v=-28,67
|
||||
p=26,35 v=71,-78
|
||||
p=80,93 v=-45,32
|
||||
p=14,39 v=-91,-77
|
||||
p=38,93 v=46,-15
|
||||
p=20,93 v=-98,-14
|
||||
p=98,12 v=-52,92
|
||||
p=21,42 v=24,-91
|
||||
p=14,9 v=70,-67
|
||||
p=100,14 v=2,76
|
||||
p=49,76 v=4,27
|
||||
p=20,29 v=32,70
|
||||
p=61,24 v=-88,24
|
||||
p=45,85 v=-46,-65
|
||||
p=59,28 v=9,30
|
||||
p=2,62 v=-69,-63
|
||||
p=77,17 v=-79,25
|
||||
p=7,37 v=2,-92
|
||||
p=93,44 v=91,-67
|
||||
p=96,15 v=62,-76
|
||||
p=62,29 v=8,-94
|
||||
p=34,13 v=49,-21
|
||||
p=93,60 v=-32,-93
|
||||
p=92,42 v=78,68
|
||||
p=9,72 v=91,27
|
||||
p=32,86 v=58,72
|
||||
p=48,19 v=-97,76
|
||||
p=4,73 v=7,68
|
||||
p=84,26 v=98,64
|
||||
p=72,9 v=-79,-79
|
||||
p=12,21 v=91,-4
|
||||
p=37,74 v=16,-7
|
||||
p=2,37 v=-61,-63
|
||||
p=69,83 v=-27,-89
|
||||
p=86,64 v=-32,68
|
||||
p=9,16 v=-98,81
|
||||
p=39,8 v=-4,-34
|
||||
p=41,46 v=43,-8
|
||||
p=16,9 v=-19,99
|
||||
p=82,4 v=-45,48
|
||||
p=81,95 v=18,54
|
||||
p=11,75 v=86,62
|
||||
p=60,86 v=25,14
|
||||
p=63,54 v=89,-30
|
||||
p=43,68 v=50,-18
|
||||
p=51,17 v=-42,-16
|
||||
p=85,70 v=52,16
|
||||
p=20,91 v=-27,-36
|
||||
p=78,36 v=-79,12
|
||||
p=83,80 v=-3,-13
|
||||
p=31,10 v=75,-78
|
||||
p=42,2 v=41,-94
|
||||
p=10,1 v=64,57
|
||||
p=59,33 v=18,14
|
||||
p=10,60 v=63,-69
|
||||
p=92,47 v=65,-17
|
||||
p=52,55 v=4,28
|
||||
p=33,59 v=-73,33
|
||||
p=46,70 v=33,-8
|
||||
p=48,33 v=77,14
|
||||
p=80,51 v=73,63
|
||||
p=5,40 v=-6,-91
|
||||
p=5,45 v=43,-92
|
||||
p=66,24 v=-50,-33
|
||||
p=10,36 v=-97,28
|
||||
p=0,84 v=14,38
|
||||
p=14,88 v=-40,-58
|
||||
p=90,23 v=-43,-73
|
||||
p=16,75 v=-73,-59
|
||||
p=36,16 v=39,-43
|
||||
p=45,51 v=79,-87
|
||||
p=67,96 v=55,34
|
||||
p=55,12 v=-42,-95
|
||||
p=84,13 v=39,36
|
||||
p=95,52 v=11,92
|
||||
p=68,82 v=99,-19
|
||||
p=36,102 v=75,-38
|
||||
p=39,45 v=-85,-74
|
||||
p=98,4 v=24,74
|
||||
p=2,40 v=40,52
|
||||
p=0,38 v=-78,53
|
||||
p=4,34 v=27,-50
|
||||
p=43,89 v=-93,55
|
||||
p=21,78 v=78,-1
|
||||
p=64,63 v=-25,21
|
||||
p=12,63 v=-60,-46
|
||||
p=83,3 v=-11,32
|
||||
p=97,71 v=10,16
|
||||
p=39,83 v=-20,10
|
||||
p=9,27 v=-74,-67
|
||||
p=84,25 v=75,-31
|
||||
p=30,100 v=-64,8
|
||||
p=37,96 v=21,32
|
||||
p=1,66 v=78,62
|
||||
p=93,75 v=-99,-58
|
||||
p=75,99 v=-66,-84
|
||||
p=57,49 v=87,28
|
||||
p=53,28 v=73,-89
|
||||
p=4,76 v=-44,96
|
||||
p=38,95 v=-71,-66
|
||||
p=48,73 v=-76,-59
|
||||
p=3,40 v=-61,-23
|
||||
p=98,91 v=-99,32
|
||||
p=47,81 v=59,-19
|
||||
p=40,95 v=71,-94
|
||||
p=93,63 v=81,28
|
||||
p=35,36 v=37,46
|
||||
p=98,73 v=63,90
|
||||
p=28,3 v=94,-15
|
||||
p=43,96 v=20,38
|
||||
p=42,70 v=-72,27
|
||||
p=66,26 v=-33,-22
|
||||
p=59,4 v=34,-3
|
||||
p=68,91 v=67,-86
|
||||
p=87,71 v=5,-41
|
||||
p=43,45 v=62,79
|
||||
p=79,86 v=-77,-96
|
||||
p=39,22 v=54,-79
|
||||
p=99,67 v=14,34
|
||||
p=62,29 v=93,-62
|
||||
p=85,99 v=35,-94
|
||||
p=15,57 v=53,-46
|
||||
p=35,43 v=-26,-58
|
||||
p=23,66 v=66,-1
|
||||
p=76,47 v=34,34
|
||||
p=84,54 v=14,54
|
||||
p=29,92 v=60,97
|
||||
p=72,12 v=-84,36
|
||||
p=6,65 v=-48,-81
|
||||
p=43,24 v=-89,1
|
||||
p=95,25 v=24,-78
|
||||
p=34,86 v=7,67
|
||||
p=90,5 v=-11,99
|
||||
p=63,4 v=-60,99
|
||||
p=17,45 v=-65,92
|
||||
p=59,75 v=-37,-8
|
||||
p=63,59 v=81,85
|
||||
p=12,85 v=34,-83
|
||||
p=45,48 v=84,26
|
||||
p=29,5 v=12,70
|
||||
p=57,94 v=-97,93
|
||||
p=29,50 v=22,-57
|
||||
p=57,3 v=50,-58
|
||||
p=90,33 v=90,52
|
||||
p=78,82 v=36,60
|
||||
p=4,64 v=44,17
|
||||
p=43,34 v=63,98
|
||||
p=87,69 v=-13,-62
|
||||
p=10,66 v=-15,38
|
||||
p=21,70 v=7,84
|
||||
p=65,52 v=-71,-80
|
||||
p=3,76 v=-2,10
|
||||
p=42,25 v=-19,59
|
||||
p=20,100 v=-32,-84
|
||||
p=44,0 v=-34,26
|
||||
p=4,26 v=2,-17
|
||||
p=84,17 v=-32,2
|
||||
p=32,62 v=-26,73
|
||||
p=21,66 v=-94,-44
|
||||
p=51,54 v=-59,85
|
||||
p=18,91 v=53,78
|
||||
p=39,55 v=80,62
|
||||
p=53,48 v=38,-86
|
||||
p=79,84 v=-66,-2
|
||||
p=33,24 v=4,-51
|
||||
p=54,76 v=-17,27
|
||||
p=15,55 v=-86,-29
|
||||
p=26,64 v=50,-70
|
||||
p=87,53 v=17,6
|
||||
p=90,71 v=14,-70
|
||||
p=42,74 v=-72,15
|
||||
p=70,100 v=68,-88
|
||||
p=25,98 v=-1,49
|
12
day14/input_test.txt
Normal file
12
day14/input_test.txt
Normal file
@@ -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
|
127
day14/task.txt
Normal file
127
day14/task.txt
Normal file
@@ -0,0 +1,127 @@
|
||||
--- Day 14: Restroom Redoubt ---
|
||||
One of The Historians needs to use the bathroom; fortunately, you know there's a bathroom near an unvisited location on their list, and so you're all quickly teleported directly to the lobby of Easter Bunny Headquarters.
|
||||
|
||||
Unfortunately, EBHQ seems to have "improved" bathroom security again after your last visit. The area outside the bathroom is swarming with robots!
|
||||
|
||||
To get The Historian safely to the bathroom, you'll need a way to predict where the robots will be in the future. Fortunately, they all seem to be moving on the tile floor in predictable straight lines.
|
||||
|
||||
You make a list (your puzzle input) of all of the robots' current positions (p) and velocities (v), one robot per line. For example:
|
||||
|
||||
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
|
||||
Each robot's position is given as p=x,y where x represents the number of tiles the robot is from the left wall and y represents the number of tiles from the top wall (when viewed from above). So, a position of p=0,0 means the robot is all the way in the top-left corner.
|
||||
|
||||
Each robot's velocity is given as v=x,y where x and y are given in tiles per second. Positive x means the robot is moving to the right, and positive y means the robot is moving down. So, a velocity of v=1,-2 means that each second, the robot moves 1 tile to the right and 2 tiles up.
|
||||
|
||||
The robots outside the actual bathroom are in a space which is 101 tiles wide and 103 tiles tall (when viewed from above). However, in this example, the robots are in a space which is only 11 tiles wide and 7 tiles tall.
|
||||
|
||||
The robots are good at navigating over/under each other (due to a combination of springs, extendable legs, and quadcopters), so they can share the same tile and don't interact with each other. Visually, the number of robots on each tile in this example looks like this:
|
||||
|
||||
1.12.......
|
||||
...........
|
||||
...........
|
||||
......11.11
|
||||
1.1........
|
||||
.........1.
|
||||
.......1...
|
||||
These robots have a unique feature for maximum bathroom security: they can teleport. When a robot would run into an edge of the space they're in, they instead teleport to the other side, effectively wrapping around the edges. Here is what robot p=2,4 v=2,-3 does for the first few seconds:
|
||||
|
||||
Initial state:
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
..1........
|
||||
...........
|
||||
...........
|
||||
|
||||
After 1 second:
|
||||
...........
|
||||
....1......
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
|
||||
After 2 seconds:
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
......1....
|
||||
...........
|
||||
|
||||
After 3 seconds:
|
||||
...........
|
||||
...........
|
||||
........1..
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
|
||||
After 4 seconds:
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
..........1
|
||||
|
||||
After 5 seconds:
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
.1.........
|
||||
...........
|
||||
...........
|
||||
...........
|
||||
The Historian can't wait much longer, so you don't have to simulate the robots for very long. Where will the robots be after 100 seconds?
|
||||
|
||||
In the above example, the number of robots on each tile after 100 seconds has elapsed looks like this:
|
||||
|
||||
......2..1.
|
||||
...........
|
||||
1..........
|
||||
.11........
|
||||
.....1.....
|
||||
...12......
|
||||
.1....1....
|
||||
To determine the safest area, count the number of robots in each quadrant after 100 seconds. Robots that are exactly in the middle (horizontally or vertically) don't count as being in any quadrant, so the only relevant robots are:
|
||||
|
||||
..... 2..1.
|
||||
..... .....
|
||||
1.... .....
|
||||
|
||||
..... .....
|
||||
...12 .....
|
||||
.1... 1....
|
||||
In this example, the quadrants contain 1, 3, 4, and 1 robot. Multiplying these together gives a total safety factor of 12.
|
||||
|
||||
Predict the motion of the robots in your list within a space which is 101 tiles wide and 103 tiles tall. What will the safety factor be after exactly 100 seconds have elapsed?
|
||||
|
||||
Your puzzle answer was 228410028.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
During the bathroom break, someone notices that these robots seem awfully similar to ones built and used at the North Pole. If they're the same type of robots, they should have a hard-coded Easter egg: very rarely, most of the robots should arrange themselves into a picture of a Christmas tree.
|
||||
|
||||
What is the fewest number of seconds that must elapse for the robots to display the Easter egg?
|
||||
|
||||
Your puzzle answer was 8258.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
282
day15/code.py
Normal file
282
day15/code.py
Normal file
@@ -0,0 +1,282 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
|
||||
L = '<'
|
||||
U = '^'
|
||||
R = '>'
|
||||
D = 'v'
|
||||
|
||||
STR_ROBOT = '@'
|
||||
STR_EMPTY = '.'
|
||||
STR_WALL = '#'
|
||||
STR_BOX = 'O'
|
||||
STR_BOX_L = '['
|
||||
STR_BOX_R = ']'
|
||||
|
||||
class Map:
|
||||
def __init__(self, grid: list[list]):
|
||||
self.grid = grid
|
||||
|
||||
def __str__(self):
|
||||
return '\n'.join(''.join(str(p) for p in line) for line in self.grid)
|
||||
|
||||
def swap(self, x1, y1, x2, y2):
|
||||
self.grid[y1][x1], self.grid[y2][x2] = self.grid[y2][x2], self.grid[y1][x1]
|
||||
|
||||
def type_is(self, x, y: int, obj):
|
||||
return type(self.grid[y][x]) == type(obj)
|
||||
|
||||
def robot_pos(self):
|
||||
for y in range(len(self.grid)):
|
||||
for x in range(len(self.grid[0])):
|
||||
if self.type_is(x, y, Robot()):
|
||||
return x, y
|
||||
|
||||
|
||||
class Instruction:
|
||||
def __init__(self, s: str):
|
||||
self.dir = s
|
||||
|
||||
def __str__(self):
|
||||
return self.dir
|
||||
|
||||
def right(self) -> bool:
|
||||
return self.dir == R
|
||||
|
||||
def left(self) -> bool:
|
||||
return self.dir == L
|
||||
|
||||
def up(self) -> bool:
|
||||
return self.dir == U
|
||||
|
||||
def down(self) -> bool:
|
||||
return self.dir == D
|
||||
|
||||
|
||||
class Point:
|
||||
def __init__(self, s=STR_EMPTY):
|
||||
self.s = s
|
||||
|
||||
def __str__(self):
|
||||
return self.s
|
||||
|
||||
|
||||
class Robot(Point):
|
||||
def __init__(self, s=STR_ROBOT):
|
||||
super().__init__(s)
|
||||
|
||||
|
||||
class Box(Point):
|
||||
def __init__(self, s=STR_BOX, left=False):
|
||||
super().__init__(s)
|
||||
self.l = left
|
||||
|
||||
def is_left(self) -> bool:
|
||||
return self.l
|
||||
|
||||
|
||||
class Wall(Point):
|
||||
def __init__(self, s=STR_WALL):
|
||||
super().__init__(s)
|
||||
|
||||
class Solution:
|
||||
def __init__(self, m: Map, inst: list[Instruction]):
|
||||
self.m = m
|
||||
self.inst = inst
|
||||
|
||||
def apply(self, cx, cy, ins: Instruction) -> bool:
|
||||
x, y = cx, cy
|
||||
if ins.up():
|
||||
y -= 1
|
||||
elif ins.down():
|
||||
y += 1
|
||||
elif ins.left():
|
||||
x -= 1
|
||||
elif ins.right():
|
||||
x += 1
|
||||
if self.m.type_is(x, y, Wall()):
|
||||
return False
|
||||
if self.m.type_is(x, y, Point()):
|
||||
self.m.swap(cx, cy, x, y)
|
||||
return True
|
||||
# we have a box
|
||||
if not self.apply(x, y, ins):
|
||||
return False
|
||||
|
||||
self.m.swap(cx, cy, x, y)
|
||||
return True
|
||||
|
||||
def apply_vert(self, cx, cy, ins: Instruction):
|
||||
x, y = cx, cy
|
||||
if ins.up():
|
||||
y -= 1
|
||||
elif ins.down():
|
||||
y += 1
|
||||
if self.m.type_is(x, y, Wall()):
|
||||
return
|
||||
if self.m.type_is(x, y, Point()):
|
||||
self.m.swap(cx, cy, x, y)
|
||||
return
|
||||
|
||||
box = self.m.grid[y][x]
|
||||
|
||||
if not self.move_box(x, y, box, ins):
|
||||
return
|
||||
self.move_box(x, y, box, ins, act=True)
|
||||
self.m.swap(cx, cy, x, y)
|
||||
|
||||
def move_box(self, cx, cy, b: Box, ins: Instruction, act=False) -> bool:
|
||||
'''here comes the ugly part :) '''
|
||||
x1, y = cx, cy
|
||||
x2 = None
|
||||
if ins.up():
|
||||
y -= 1
|
||||
elif ins.down():
|
||||
y += 1
|
||||
if b.is_left():
|
||||
x2 = x1+1
|
||||
else:
|
||||
x2 = x1-1
|
||||
if self.m.type_is(x1, y, Point()) and self.m.type_is(x2, y, Point()):
|
||||
if act:
|
||||
self.m.swap(x1, cy, x1, y)
|
||||
self.m.swap(x2, cy, x2, y)
|
||||
return True
|
||||
|
||||
if self.m.type_is(x1, y, Wall()) or self.m.type_is(x2, y, Wall()):
|
||||
return False
|
||||
|
||||
m1, m2 = True, True
|
||||
|
||||
if self.m.type_is(x1, y, Box()):
|
||||
box = self.m.grid[y][x1]
|
||||
m1 = self.move_box(x1, y, box, ins, act)
|
||||
|
||||
if self.m.type_is(x2, y, Box()):
|
||||
box = self.m.grid[y][x2]
|
||||
m2 = self.move_box(x2, y, box, ins, act)
|
||||
|
||||
if m1 and m2 and act:
|
||||
self.m.swap(x1, cy, x1, y)
|
||||
self.m.swap(x2, cy, x2, y)
|
||||
return m1 and m2
|
||||
|
||||
|
||||
def solve1(self):
|
||||
for ins in self.inst:
|
||||
x, y = self.m.robot_pos()
|
||||
self.apply(x, y, ins)
|
||||
s = 0
|
||||
for y in range(len(self.m.grid)):
|
||||
for x in range(len(self.m.grid[0])):
|
||||
if self.m.type_is(x, y, Box()):
|
||||
s += y*100 + x
|
||||
return s
|
||||
|
||||
|
||||
def solve2(self):
|
||||
for ins in self.inst:
|
||||
x, y = self.m.robot_pos()
|
||||
if ins.left() or ins.right():
|
||||
self.apply(x, y, ins)
|
||||
else:
|
||||
self.apply_vert(x, y, ins)
|
||||
s = 0
|
||||
for y in range(len(self.m.grid)):
|
||||
for x in range(len(self.m.grid[0])):
|
||||
if self.m.type_is(x, y, Box()) and self.m.grid[y][x].is_left():
|
||||
s += y*100 + x
|
||||
return s
|
||||
|
||||
|
||||
def parse_input(lines: list[str]):
|
||||
grid = []
|
||||
instructions = []
|
||||
for l in lines:
|
||||
if l.startswith(STR_WALL):
|
||||
grid.append(list(l))
|
||||
elif not l:
|
||||
continue
|
||||
else:
|
||||
instructions.extend(Instruction(s) for s in list(l))
|
||||
|
||||
for y in range(len(grid)):
|
||||
for x in range(len(grid[0])):
|
||||
s = grid[y][x]
|
||||
obj = None
|
||||
if s == STR_WALL:
|
||||
obj = Wall()
|
||||
elif s == STR_BOX:
|
||||
obj = Box()
|
||||
elif s == STR_ROBOT:
|
||||
obj = Robot()
|
||||
else:
|
||||
obj = Point()
|
||||
grid[y][x] = obj
|
||||
|
||||
m = Map(grid)
|
||||
return Solution(m, instructions)
|
||||
|
||||
|
||||
def parse_input2(lines: list[str]):
|
||||
grid = []
|
||||
instructions = []
|
||||
for l in lines:
|
||||
if l.startswith(STR_WALL):
|
||||
row = []
|
||||
for s in l:
|
||||
if s == STR_WALL:
|
||||
row.extend([s, s])
|
||||
elif s == STR_BOX:
|
||||
row.extend([STR_BOX_L, STR_BOX_R])
|
||||
elif s == STR_ROBOT:
|
||||
row.extend([s, STR_EMPTY])
|
||||
elif s == STR_EMPTY:
|
||||
row.extend([s, s])
|
||||
grid.append(row)
|
||||
elif not l:
|
||||
continue
|
||||
else:
|
||||
instructions.extend(Instruction(s) for s in list(l))
|
||||
|
||||
for y in range(len(grid)):
|
||||
for x in range(len(grid[0])):
|
||||
s = grid[y][x]
|
||||
obj = None
|
||||
if s == STR_WALL:
|
||||
obj = Wall()
|
||||
elif s == STR_BOX_L:
|
||||
obj = Box(s, True)
|
||||
elif s == STR_BOX_R:
|
||||
obj = Box(s, False)
|
||||
elif s == STR_ROBOT:
|
||||
obj = Robot()
|
||||
else:
|
||||
obj = Point()
|
||||
grid[y][x] = obj
|
||||
|
||||
m = Map(grid)
|
||||
|
||||
return Solution(m, instructions)
|
||||
|
||||
def solve1(lines: list[str]):
|
||||
s = parse_input(lines)
|
||||
return s.solve1()
|
||||
|
||||
|
||||
def solve2(lines: list[str]):
|
||||
s = parse_input2(lines)
|
||||
return s.solve2()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#lines = Input('input_test.txt').lines()
|
||||
lines = Input('input.txt').lines()
|
||||
|
||||
#part 1
|
||||
print('part 1:', solve1(lines)) # 1456590
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(lines)) # 1489116
|
71
day15/input.txt
Normal file
71
day15/input.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
##################################################
|
||||
#...##...OOO.#.O.OOO......O###...O.#..O.......O..#
|
||||
#....O...O.....O..O#O#O.O....O...OO#OOOO....OOO..#
|
||||
#..O.O..O.#..#...O...O.O....#....O..OO.#O#..O....#
|
||||
#..........OO....O..#OO...O.O.O....#..O.......#.##
|
||||
#OO.......O.....OO.....O.....O.O.#...O..O..O#.#..#
|
||||
#....#..O.#.....OOO.O......O....OO.O#OO.O...O.#.O#
|
||||
#.O#.OO....O#...OO...O.O..........O.........OO..O#
|
||||
#OO.O#.O...O.O..O.....O#O.O..O...OOO...O....#OOOO#
|
||||
#..OO.O........O..#....OOOOO..OO...O#..OO##....OO#
|
||||
#....O.O...#.O....OO...#..#...O...O...O.#..O.O...#
|
||||
##.....OO#O..O.....O##.OOO....OO..OOOO.O........O#
|
||||
#.#.#..O...#.OOO.O.......O.OO.O...O#....OO....#OO#
|
||||
#..##.O.#..#..O..O...OOO...O..O.OOOO...O.OO.#...O#
|
||||
#....O..O#.O.OO.O.........O.O.O.OO#.O.#O#..OO#.O.#
|
||||
#.....O.............#...O..O..O#.O.OO..O.OO..O...#
|
||||
#.#..O..#O...O....#..O.#.....O.....O.........O...#
|
||||
#..O..O..O#O.....O....#.O...#OO....O.....#.......#
|
||||
#O..O#......OO...OO.O..O#OOOO........O.OOO..O..OO#
|
||||
#OO...O.#...O#O..#.O.#.#....O.OO....OO.O..O.O..O.#
|
||||
#.#...#.O..O..O.......#.........#.O.O.....O..O...#
|
||||
#O.O..O...O...O..O.O.O.#..#O..OOO....O....#..#...#
|
||||
#...OO#O......O.O..OOOO#.O#........OO..#O.#OO...O#
|
||||
#O#....OO...O#..OO.#.OO....O...OO....#..O...O.O..#
|
||||
##...#........#..O....O#@O#O........O.OO..O#.O.O.#
|
||||
#OO.#....OO.O...OO...OO..O....O.O.O...O#...O.OO..#
|
||||
#.OO#..#..#O.O#..OO.#O.O#.OO..OO.#..O......#.....#
|
||||
#.#..O.O..#O..O....O....#...OO......O......O#..O.#
|
||||
#O...#.O#....OO....O...O.#.......#O....O.O#.O....#
|
||||
#....#.O...O...O........OO.#.O..O......#..#..#.O.#
|
||||
#..OO....O..O.#........O..#......O..O....#OO...#.#
|
||||
#..OO.OO#...#..#.....#..O#.#O..O.O...O.O..O.O....#
|
||||
#O.OO....O..OO.#..OOO..OO##....#.O...OOO...#....O#
|
||||
#.OOO#..#........O...O.O.#.......OO..O.O......O.O#
|
||||
#.......OO..O.O........O...OO.....O.....#.O.OOO#.#
|
||||
#OO.......OOOO.....O....O.....#.#...OO........O.O#
|
||||
#..O.OOOO...O..O.O#.OO.OO.#...OO#.OO......O..O.O.#
|
||||
#.O.O.#.O#..O.O.O...#O...O...O...O.O.O...O.#O#O..#
|
||||
#OO#........O........OO..O#O.......O..#...O......#
|
||||
#.#.#..OO.OO..O....#OO....O.OO...O#.#....#.......#
|
||||
##.#.O#O..OO.O......O..O#.......#OO#.......O.OO..#
|
||||
#.....O..O...O...#OOO.O.O...O...O..O..#...O...#.O#
|
||||
#O.##O....#.O...O.OO.......O.....O..O.O..O....O..#
|
||||
#.O...O.O..#O.#.....O..OO.....#O....O.O..O..O.O.O#
|
||||
#....#O..OO.OO#.OO...O...#.OO#...OO....O.O.......#
|
||||
#.O..O....#OOO..O......##..#O.O.......O...#O..O..#
|
||||
##O..O...O.O.......O#.......#.O#.O.O.O#..O...O.O.#
|
||||
#O.#...O.O....#.#.....O.....OO.#.O.#...#.....OO..#
|
||||
#.O.OO.O........#...#.......OO#....#..O#.O.......#
|
||||
##################################################
|
||||
|
||||
^^vv><<><><^v^v^v<^vvv><v>v>v>^v<<v>^^^><v><v^<v^v^^^<>>>>>><vv<^>v>>>^>^<^v^^^>^<^^v<<v<>>^<>>>v^<>v>>v^<vvvv<v<>>^>v>^<v^^>^<^>^<vv><v<<vv^>^>><<^^>^vv>v^^<^>v^><>>^<<^v<^<<vvv<^v<^>^>^>v>^<>v>>vvv<<v<^>>v>^v<^>>^<^vv><v<v><<>>v<^>^^^<><vvv^<>^<^^v>^><^vv<<>^^^<>v^>v^>v<^>^v<v^v><>><<^^^^><^<><>^vvvv>v>v<vv>v^v^>>vv^^v><>^^>>>>v^v>v>>v>v<<<>vvv>^v<^v^>^>v<vvv^^><^><^>>>v><v>><vv^<v^><v>^<^^^>^<v>^>vv<^>><><v^<>>>^>^^vv^<v<<<vv^>v>^><>^>^<>^>^><<^<<<>v><v>v<<<v<v^^^^<>>>^vv<<<<v<^v^>>>^^v>vv^^<<v>>^>^v>^^<<^><v<<vv^^>v>vv^v<>>^>>^<>>>^>v^^<<^v<>^<>><<<^v><<>>>><^^>>^>>><^vvv<v><<>v<v^v<^^v^^<>>>v^>^^^>v<vv<>vv><<>vv^<^v^v<^vvv>^v>>^^^<>><vv>^^>^v<>v>v<>><vvv><v^<^>^<<v>v<<v><v<<>>>v>^><<><<>^v<<v<>^>^^><^<^><>>v>^>v^v>vv^^<<vv<^>^<v>><>vvv^v>><>v<<>^<>vv<^v<v^<v>^v^<>^>>>vv>>^<><vv^<<><v>v<^vv<^>>v<v>^^^><^vvvv>^vv<vv^^<v><v<>^^<<v<^><><^^v>>^<^><v>^v>v^><<vv^>^<^^^>>>^^>>v^>v^^><><vv<^>^<>^v^<vvv<>v<>v<<^>v><v>^<>^^v^^v^<>v^vv^v^>^v><v>>v>^>^v><v<^>><<>>v^>>^<vvv^^<<<^^<v^>vv<<v^<<>^
|
||||
^>>v^<>v>>>v>v<<^<><v<v>>>v^<<>><vvv<><<v>>v^><^vvv<v<vv>^^^<^><<v><^<>>>^>>vv^^<^v<<<<>v>vv><v<v^<^^^<^v^vvv^<><>>^>^>>vv>vv<^^vv<v<v>><<vvv><^<<^<>><vvv^^<<><^v>^^^><><>>v>><^^v>^>v<<^>v>v>v<>v<^<^>vv>vv^vv<>v>^v^v<^^^<^^^^<vv^vvv^vv^v><vv<v>^v<<v<<<<<vv<^^><^v><<>v<^^^^>^<<v>vv<^<<>>v>v<><>^v>>v>><vv>>^>><>^<vv^vv^^<^>>>v><<^<>^^^>^<v^>v^><<v>^^v>>^>^<vv^^<>>>^><<>^^<^<v^v^<<^<^vv><v<>v>><<<<^^vv^^>v^v^v^>^<vvv<^<v^>^>>v<v^>v<>^v<^vv>^<v^^<^>>v<v<>v<v<<>^v<>>^>v<<v^><<v><<><v>v^<v>><v<<v^v>^^^><<^^^>v<v^><>^>^>^<<>v>>vv<<<^<>><<^<v>^v><vv><^<v<v^v<>v<vv>v>vvv>^<><>vv<<>vv><^>>><<><<v^v><>v>^v><<<v<^v<v<vv<^^vv^^vvv>^<><vv^v>>>^>>^v>^v>v<^>v^^><^><v>v^<v^^vv<^v>^>><^><v^vvv>^<^^v^v>>^v>>^^<^<>^<>>v<>>^>^^>^>v<v<<><^<^vv>^>vvvv>^>v^<<vv>^v^><>>v^v<<^<v^<^v><<^<<<>^<<>v^<^v<>>vv^vvvv^^>v<><^^>v<vv<<>v^v<<<<v>vv>v^v>>^<<<v>>^v>^<^^v>^^>v<^v<><>>><v^<<vv>^><<<^^>><^^<>>>^<<^<<^^<^^>^>vv>>v>>>v<><v^<>^><<<^^^<>^<<<<<^<v<v<^>vv<vv><^v><<^v^v<vv<<^v^<^<v>><<>^<<<>v^<^>v>v^vv<<>v<><<>^^^<<^v
|
||||
^>^<v^<<v>v>^v<<>^^^v<v<^>>^>^^v^<<^v>^^v<<vv<>v>^>^v^<v^>v^><v<<>^<^^v<v^>v>v><<v>v<^v>>vv^>^^<<v<vvvvvv>^^v^>v<>^^v^<v>^>>^vv^v<><>><v>><vv^><<vv><v^^v<v<^^v<v^v>vvvv^<>^>v^>v^^>vv^><<vv^>^^v<<^^<><^><<v<v>^>v^<<v>><^v^^^^>v>v<v^v>>v^<>v^^^^>><>^^v^<v^^<<<^>v^<^vv<>^>^^<^>^>v<^><<^^<^^<<^>v^^v<<><^<<<>v^vv<v>>><<<v^v>^<<<^><<>><vv^vvv<<>v<<<<^<^v>v>vv>v<vv<><v<^>^v^vvv>v>^>^>>>>vv>><v^v^^>>v>v<^<^<>><v^vv>^<v^>v<v<<>v><^^^<><<>>v><v<v^^><>v^>>^>><vv^>>v^^<>v^^^>^^v^vv^v^<>vvv><><><<>><>^>>v<>^^v^v^vvv<v<v<^v^vv^vv<^>^v>>^>>^^>v<^^>>^>^^><><^^>^<^<><v>v>><<vv^<>^<>>>>v<><^^v>v>^^v>^<v<>v<^>v>^>vv<<^><^v^vv<^^<v<v^v^v><<^^v<^>^<>><v^><<^v>><><v>^<<v<^>^^^^^<^<><^^^v>v><>vvv>>^<v><^<^><<^^^^v>^<<>v^^^<<<<<^v>^v^<^<v>v>v^v^^<^^<><v^<v<>^^vv>v<vv^^<^><<>^^^>vv^^v<<vv^<^<^<<<^^^v><^^^<>vv>v^v>v<<>><v^>^>>><><<^vv>^^<^<v^<vvv^<v><<>^^>^^>>v<^v>>v^>>^vv^<>v<<v^v<<^v^v>>^><^^<v^^v<><<^^>^<^>v>vv>>>>v>>>v^^^>vv>>>v<><^>>>^<v^<<v<>v<v<<vvvvvvvvv^^<>>^^<<<<vv<><^^vv<vv<^^<<>v^v^>v<<v<^>>^^^<<^v>
|
||||
<>>^<<vv>><v<vv<>>^><>>>v^^^>v>v>^v>vvvv><^v>^<^>^^vvv>vv><<v^>>>><^v<^v^>v>vvv^v<<v^<^v>><<^<<^<<^^v>vv^^><>v<^><<<>>vv>vvv<^v<>vv<v>>^<<>^>v^v<v<<>vvv^^v>^v<^<>^<>^><>v<><<^>^<v<^^^<>^<v><vvv>^<^v<vv^^>^^^>>>v<^v<<v^v<v>v^>>v>v<vv<>vv><>v><^^^^v>>v>v<^v>^v^>^vvvvv^<v^v^vv>v^<<^^><v<^v^v>>>>^v<<^^vvv<v>><v^>^^v^>>^v<v<<<^v^<^^<vv^>v<<>>v<v<<><v><v<^<>v>v>^<><^^v^^>vv^<vv^<>^^>v^><<>><<<^<v^v<>>^^^<^^>^^<v^v<<>v^^><^<>v>vv^><>^>^^^^<>>v^^v>><<>^<^v><v^v>>>vv<v><vvv>^<<<<v>v^>v>^v<^>v<><>>^v^^><^vv>^^<^^><^>vv><v^>>>^>^>v><^><vv<<<^<v<>>v><>^><v<><^^v<>vvv<<>v<^>>v<>>^^<^><<^><v^<<^^<>v^<^^^>^^<>v^>^v>>v^^^>>vv<vv^^^v>^><<>^>>><<<v^<^v<^v^v^>v^^v>^><>^^<<v<><>^vvvv>v<^<^>^vv>>^v^><vvvv^^<^>>vv<v<^>v<^>^>>^^<vv^<^<^<v<><^<<<^<v<<^^<<v><>^v<^^<>>vv<^^>^<>>v><>>><>^^v^>v><>>v>^vv^<^v^><>>v^><>^><^<<<v^^>>>^><vv<>>^<^>>>vv<>vv>v<>^><<^<^^<v><^^^^^<^>>>>><v<^>><><^^>^^<><v<<<^^<v^>^>^^>^>>><^>^><>v<<>><^<><>><v>>^v>^<<vvv^<>^vv>v<>^><v^><^^>>>^<<^v^v>v^<>v>>><^^>vv^^^>>^^>^^<<>><^><><v^v><^>
|
||||
^v<<^><><^>>>v<><<<<v<v>>v<>v<vv><^vvv^<^v>vv<v<^^vv^vvv><<^v<^^vv^v^><<><^><^>^v<>^v<^^v><><>v^<<<>v^>^>><vv^>^^>><>^>v^><>^<>^><<^^>>>v<><v><vvv<^>v>^<<vv>^^v><vv<<><>vv>^v^vv><><^^v^<v>vvv>>^<><^v>^>v>>vv>v^>>^v^^^<v>^^v<<>>v<><>v>^v<vv<v^>vv<<><<^v<>>^<<<^v^^<v<><^<^>^<vv<<>v<>^^v^><<><^<vv<^>v^>^>^<<<<<vv^v><vvv<^^<<<^^^^>^v><>>^^>>^v<<v><>><^<<>v<<^v<v^>^v<><^^>v^^^v^^<^<^^><vv^<>>v>v^<v^<>><<^^<^^>>^^^^^vv^<>^><<<><<><>><v>^<>v^^<><^<v<vv<vv<^<v^><vvvv<^<vv^^>^>vv>^<v^^^v<v>><<v<><<>v>^>v>>>><v>v^<>v^v^v<v<<^^v<><^<<<^^<^>>^v^>^v^>v^<v^v^v>v^>><v>vv><^>><>^>>>>>v^v<^<v<v><>><>^>v^^^<>>^v^<^v>v<^<<<<^v^v>v><v<<v^<><vvv<>v^>^>^>v^>><v<^v<v><v^^v>>^>v>vv<^v^<>^^^<^<^^vv<^>^>v^><^<<v<^v^v<^>><^>><>>>^v^>v<>>>>><><<^><<<^>^<v>^>><>v>v^^>><<><^v><^>v^^<<v^<>^>>^^v<>vv<^<^^<<>>>><v^><^>v^<>^<v><>^<>><<<<>>^vv<<v>>>vv^vv<><<^<vv^^v<<^<^<>^>vv^^><^><<v<vv<<><v<<^>vv^>v^>v><>vv>^v>>>v>v<>><^^<^v<><>>>^vv>^>v^vv^v>^v>v><><<^^^><>><>>>^>vv^<v<<<^^<>vv>^><>><v^v^^^^v^vv>><^<<vv<<<^<<<v><>v>>
|
||||
^^v^>^v^>>>><^<^<<<<^^v<<>^v>><<v>^v>^>><<<v<<<v^<<^>><vv^>>^>vv^<>v>>^^>><><^^<>^vv><>v^><v<vv>><^>v^^^^^v<<<v^^vv>><<^v<^<^^vv<^>>v>><^v><>v^^^<v^^<><^>^v^>vvvv><<>v><^<v^^>^<<><>v<v<<v^^vv<v<v^><<^>>^<<>^<^v>v^v^v^^<>^<>><^<^>>^^<>><vv<v^v><^<^^vvv>^v<<^v<v^^><>><^<vv<v^>^v><^v^vv<^v>^<>><^^<><v>^>^^<><^v>^^^^^>><v>^^<v^<<<><<^^<>><<>^>vv<v<>>>^v<v<v<>v<^^v^>v>v>^><v^<^v>>v^v<>^<^<>><^^>>v^><v<>>^>^^^^>>><<^<^^vv^^<<vv^>^v>^vv<^v><<vv^^^><^<<v^^^^><v>>v<v>^<^<<^v^<<^vvv^v><<^<>^<^^^v<<v^>vv<<<^<<vv>^^>^>>v>^v>>v>v>^^<v>^<^>v^vv><^^<^>^v^vv>v<v>^^v^vvv><v^^>v<^^^<v^^>v<v>v><vvv<><<^><<^<>^^^v>^<v<^>><vv<<vv><>^v>>vv<vv<<<><><^v^v<>v^>vv><>v<<>v<v>^>>v<vvv>^>^^^<><v>^>^^>^v<v^^v>vvv<v^>>><v^<<^^vv^^^<>^v<^^><^><^^<^>v^^>><><<<^><^^v<<^>^<^>^vvv>>^v^<v<^v^<vv>>>>v><>>^<^><><>^^v<^v^<>^v^^v^v<v>^>^>>><>>><v><^>>>v>>>>>^v^^<^>vv^^<<^<><v><^v><v>><v<^^^<v>^>>><v^>^v^^v<>^v>vv^<^>v<v<v^v>^<><^>v><>><v<^><<^v^>^v<>vv>^vv<<v<^>^<>><<v>v^^vv<v>vv>vvvv<v<v^<><<^>v<v<<^^vvv<v^>^>^v^>^<>v<><><>>
|
||||
^>>>><<<vv^^^>^>^<<>>>^><<v^<>>v>^><>><vv<^>v<>^^^<>v^^v><^vv<^v^<^v>>^>^v<v^v^^v>^v^<<v<<vv^^^vvv^<v^>>><vv^vvv>^v<^>><^^^^vv<>vv^v>vv<v<<vv<^<<vv<<>>vvv<<>v<>vv<vv^^<^^v<<<>>v><^vv^<>v>^<^v>^<<<v<vv>^v^>>vvvv^^<>v<v<<v^<v<<><^v<^^<<<>>v>>>v>v>>vv<>vv<v^^^v>>>^v<^^>v<^v><<^<<<<^>^v<^^v>v^^<^^^<vv><>^^<vv<^vv^<^^>><>>><><v^^>>^^<^<^v<^>v^v><^vvv^<v>v<>^<^vv<><v^>>^vv>^v>^^^<<>>^><^>^^<^>v^v>>v^v>>^^<>>>>>>>vvv<^><^>^v^>>v<^^v>^v<^<>v<^^v^^v>>^^v^<v>v><v^>^<v<<v^vvv><v^>>^>v^>vv^>>^^<<>v>v^<^v>>>^<>^^^><><v^>^^^v^>v>^><<<^^^^^<>>^<<vv^>>><v>^^<^><vv><<^v>v<>vvv><>^<^^>><v><v<^v><^v^<^>^><^v<vv<^<>vvvv>>>vvv^<><><>^v>v<^v>vv^^v>v>>vvv^^v^<vvvvv^^<<<<v^<><<><^<>^>^>>>v<>v^>><v>v>v<v^^<vv<<v<>^<^vv<^^<<<^v^v><<v>^<>v>>v^v^^vv<^>^>^vv^>^<vvv>v>>>v<^>>v><<^>v^vv<<>>^^v><vv<^<<v^^^^v><<>vv><v^<><vvv>vv<vv^><^^^<v<v<^<<v>>><<v^v>>v^<vvv<v<>^<v^^<<<><<v>><>^>^<^<v><<<>v^^vvv^v^v<v<<<>>^v^>v<<v<^v^v>v<>><<>^^^<vv><v<<^v<^<^v>v>><>vv>^v><<^>v<v>>v>v^^<>^^<v>^^vv>v<>v>^v^vv>v^<^><^^^^^<>^<v><>^<>>
|
||||
vv>^<vvv^vv^^<vv^<<>>^<<^^<<v><>^^^v^<^<^^v<><v>^<^><<<^v><v><^>^v<v>>^vv^vvv<>^v<<>>^>v^v><>^^v^>>>^><><<><v>^>>v<<v<v^^^>v><<<<<v<<<^><vv^vv>><<^^>v<<^>^^><v^v<^<^<^^^^<^^<v^^<^v<^>>^v<vv<^><>v^<v>vvv^v^^v^^vv><>>>>^^>v<v>^<<v^^><>>v<^<<<^v^>><v>>^v>^<>>>^^^>>v^>v^<^<v>^v^<>>><v^<>>^v<<vv^>v<<v<>^<^^<v><vv^vv<>>^v<<^^>><v>v<<>>>^><^v^v>><v^<^>vv<<^v<<v^^vv><>>>v^v<<^<>v<<vv^<^^<<>v>>v<v<^>>v^^<^>v^^<><<>>>^v<>vv^<>>>^<^^^^>^v>vv<<>^<<v>^<><v^<>^<<<^>vv<<v^^<^^^><vv<>^<^>>><>><vv^^^v^vvv<v^>v<v<v^>><^vv^v>^^><vv>^^^^vv<<^>>^>^^v>vv^><>>^><>>><^>><^>v^^<><>vv^<><<>^<>^v<><^><^v^>vv><<^v>^v<>>^^v^<^^^<^v><>^^^^^>>^^<>>>vvvvv>v^v<<<>>>vv^<^<vv^><>><^^<^<^^<<^>>^^^<>>><>^^vv^<^v>vv<<<v<v<vv<<>>vv>v^^vv^>^<^vv^v^v>v><vvv>>v^vv>>^vv><^v<<^>>^^^<<<<^<^v<><<v^v>>^v^v<v^>>^^v<^^^<^^<<<<^<>>^<>^>v>^v><^<^>^><^v<^^^^^vv<>^^<v>><v<<^vvv>v^>^<^><^vv<<<><>^>><v<v<<<v<<<>^^<>^><>v><><<>v><<>vv^><><>v<vvv>vv^<>^v^<^vv>><<^<<^v<<<>vv^v<v<vv^^^>>>^>>^>^v^^<v<<<>v>>v^^vv<^>>>vv^>^^<v>>v<^><v^^<>v^^<^v^>
|
||||
^<>v>vvvv>^><v<^<<v><<<v<<^^<<>^v<>v>>v>vv^>v<v<>^><>v<<v<<<>vvv^><^>^><><^v<>>>v<<><vv^vv<<^<^v<^>^>><<^^^<>vv^^^>^<v<^<<<>>><>>>v<>>v>>^^v^<>^<>v^>vv^>><<vv>^v^v><^>>v^vv<^vv<>v<vv>^<>>>^>>>><v>>^^<<>>>v<<>v<^<^^>^<<^><>v<<^v^^^v<><^v><<>^^v^^^^>v><^^v><^<^v^>>v<^>^v<<v^^^>>^v^<><>^>v>v>>>vv^>>vv><>>^>v<^^>^<>^v^v>>^vvv>><<^<>^><<>^^<^v^^^v>v^v<v^^^<v^v^^^vv>>vv<><v^v>^<><<>>>>v>v^<v<<<v^<<<<vv>^^vv><^^>^^^<<<v^^<^<^v^<^<>><>^v^v><<v<<><<>v<>^^>^^>vv<v^v<^vv>^>>^^v<<<>^v^>v>>^<<v^><><<<<v<>^<^<<v^^>>^>>v<>v<^<<>>><v^^^<v^>v<^v^>^^><vvv>v^^^>^^vv>><<v^^><<<^v<^^v^<v>v^^<<>v>vv<>><>v>v<^v^<<<^>>^^^<^v^v^><^>^<<^v^v^v<>v>^^><v<<><><vvv^v>^<v><><<v<<<^<><>>><>>v><v^^^v>^v<^v<<<^^>>v>^<<^>^^v>>^^<vvv<<<<v>^^><vvvv<>^v^vv<<^<<<<>^^>v<v<^v><>v>v<<>^<<v^v<v<>v>>^<>v><<>vvvv^<>><>v><>v^v<>vv>v>v^v>>^<^v>^>v>><v>^<vv^vv^v^^><>>>^>><>^^><<>v><v^<<<^v<<<v<v^<v>^<>^>>><<v>vv<vv<<^v>v^v<vv^v<vvvv^v>>><<<>^^^<^>>^<vv>^^^>v<vvv>vv^v<<><v<^^<<><^<<^vvv^<^v^v^^<v<>^v^^vv><vvvv><v<<v<v<^^<^v><>>v<<<>v>
|
||||
<<^^<^>^v<v<^><v^<><vv^vv^<v<>v><vv^<^v^^>^>>^vvvv>v>^v^>^><^^^^v><<<v>^vv<^<^^^v<^^<><>v<v^<<^^<>><>vv>^v><>v^>^<v<<v<<>>^^^>><<>^<v>>>v>^>>^v>>vvv^^>><^v^v^v<v<<><^<<<vv^<v<<<^v<v<<v><>^v<vvv>^><>>>>>^vv>v><>^<>^^>>>v><>>><<<>>^>><v^v<<^vv^>^>><<^<><vvvv<^<vvv^<>>^<^>>>>^v<<^^^^><><><<<<^^<^v><><<<><^<>>><>>^<<^<^>^<^^<^>^>^><<^<vv^>v^vv<^<vv^^vv<<>>v^<^<vv<><vv^v<>><^>>v<vv^^<^>v><^vv^^<^<<v>^<<v>v>v<v>>v<^>^>^^><<v<>^vvv^><<<>^><^vv><^<<>^><<^^vv<v<^^v^^^^>^v<^v<<^^^<^^v<>><><^^><v<<>^^v>v^v<>vv<v^>>^<v><>>vv><v^v>>vv>v>v<v><><>>>>v><vv>>>^><><^v<>v>>>^^^>^v^v>^<<>^>><vv<v^v>^<^<^^<vv>v^^v>^><>>v^>v>>^v<>v>v^^<<><^><vv<>>v<<^>>^v^>>>><^<<<<^<v><v>v<<v^>^v>>v<>v<><<vv>v^><<^<^v<^<^>^>^vv<<vvv<v><vv>vv>^v><>^<<vvv><^^<<v<>^v<<^<<^v^>v^vvv^v>>>v<^v>^v<v>v><<^<vvv^v<^<vv^v^^>^<v<^>>v^<<<^<^v>^v^v^<v>>^^<^v^^v^<<^<><^>^^<>^>vv^v<<^v<^vv>v><>^^^>>v^>^<^v^<^v<><v^^>>>^v><>>^v^>^><>>><v<<v<^^^><vv^>vvv><^>vv>^^^<^^<^v<v^vv^<^^<>vv^v<<>vv<<>>^^v><<v>^v<<<><v^^>^<v>><^v<vvv<v>^^^>><<<<^<^>v<
|
||||
<><<<>^^>^^v^^>^^^vv>^>>^>v^^^v<^<^>v<<><v>^>^v>^<^<<^vv<<>^><<vv^v<v>^>^^<<^^<^<^><><^vvv><<>>>>>^>><>vvvv>^v^<^<^^>v^^v^><>v<v^>><>>^<>>^<v<<<v^><vv><v<v<<v^^>^^v<v<v^<<v^vv<<<v^>^v<>>v<v>^><^<>>>vv>vv>^v^^<<<vv<^>^^<^v>>>>v^><^><<^><>>><^^^v^^>>>>^>>v^^>><vvv>v^<<>>^>v<<<v^^<^v><v^vv>v>^v^><<><^v^^^<>^<>^^^v^>><<<^^^>v<<^^vv<v^<>>v<>^<^>><<>>^<v<v>><^>^>v<^v>><<^v<v><>v><^^vv<>v<v<>v^v^<<v<<><>v<><<<<v<>v^v<>>vvvv<v>v^^><^<<^^<vv<<v^<>^<<^<v<^>^v^v^<v^<^<><^v^<^^><>><^><^<^<<><vv<^><^<<v<^^v<v^vv<<v^^v>>v>v<<<^>><^^<<>^v^v<v>>^>v>v^>^v^^v>>>^>v>v^<^v>>^^>><v<v><<>^^>v^^^><v^<>>v>>>^vv^v>><><>><>^vvv^^><>vv><<v<v^vv^<v<v<^>>>v^>>>^>v>vv^^^vv<<^<>><v<^^^^<^v>>v^^^^^>^>vv<^^><>><v><^^<>><^<>^v<>vv>>>^v>>^<<<>^v>>^vv<<<<v<>v<v>>^^^v^><^^>>vv<>^<>v^<>>v^vv<<^v<vv<<<>>v>vv><><<v<<^^>^^<vv^^<v>>v^>v^<<<^>^^^v>v>>v<>>^^^vv<>^<v^^^^vv><^v<v^v<>>^>^vvv^^^<v<<<v>>>>v<>^<^vv>^v<>v^v^>v>^^<^^v>^>>v^vv^^v^^<^<<<v^^>^>v^><<<<><v>>vvvv>vvv^<><<^v^v<<><>v><<><>^>>><<<v^<>v^v^v<v<^<>v>^<v><v<<>>^<v<<
|
||||
vv><>v<><^><>>^><><^>v><>v<<^^^^v>^<>>^<^^^^<^<>^<>>>v<vv<>>^><<vvv^><<>>>>^vv^><>^>^>v<^v<v^><^><<<^^^<>v^<v^<v^<vv<^><><<v<^^vv^<<><^^<^vv>vv^<v<^<<<v>v>^<>^<<^>v^^>v<<v^><^^^<^>v<vv^^<v>v^^>^<>^v^^<v>^^^>^^v>>^>>><^>^^>vv><v>>^v^>vv<<>>^v>v>^v<<<>^v>>v<>>^>^v>^<>vv<v^<><>v>^^>v>v<><<^^^<v>^<<vv^><<vvv^<>vvv>>><vv^^v^<<v>^v>>>>><><^v<^<<<<<v<v^v^>v^vv^><vv>><<>v><>vv^<>^<>>v<<<><<vvvv><><>^>v^v<v<v><vvv>>^><>>^<>^vvvv>v<<<vv<><v><v^>^^v<<>vv^>>>>>>v^^<v><^v^^<^v<<^><<><^^^v>vv>>><>v^<>>vv>^<vv^<<<<v<>vv>v<v<<^<^v<><>^>>^v^v><v^<^<>>>v<<^<^>vvvv^<>><<>v>><>^>^<><v^^>v><v^>^<^vv><v>>^v^^^><<^<v<><^^^^<vv>>v<><<<>>^vv^<v^><^<v<>><>>^v><v^^>v>v^<vvv^^v>>^<>>><>v<>^v<^^^v><<v>^<>>^><><>v^^>><^<^^^>v^v<>v^v>^><v^<^<v>^>vv<>v<^^<v>>vvv>^^vv^><v^^>v<v<^>v<v<<<^v>><>^<>vv<vv^<<vv<^v^^><>><<<v^<<^>v>^>v^><^<<v>><v<^^v^v>v>>><>vv^v>><<v>^>><^^^<<<v^v<vvv><<<<^v^>>v^>><^>>^<<><v>>^><>^>>^<>vv<^>^>v>^>v>v^<<<vv^v<^^vvv<<>^v>^><v<v^vv^<^^<<>>>^<vv^<v^>^v>>^^^<>^v^>^^^^><<vv^^<^^vv<><>>>v<^^><v<>>^
|
||||
^^>^^v><^><^vv<<<<^>>><v<v>^>vv^<>vv^vvv^<>>v<<v<><^<v^^>^v^^^vv>>v^<^<<>^v^>^v<<>^^>^<^vv<^^<>v>^>v<>v>>v^v<v>^<<<><>v^^>v^v>v^<<^^<>>>v^>^^vv<<<v<^v<v^v>v><>><>v<v><>>v><^<<^^^^<vv<><><^v<vvv>>v<vvv<^v>vvvv^<<^<^vv><<>^^^^v<<>vv<><vvv<v<<^v<>><><^>v^<<><^v^>^>^<>^^^>>^<<>v<^><v>>>>^v<^v>^v>^v<^>><><>>^<^>>v<<<^>v><<^<^v^vv<>><^<<<v^><>v<^^^v<v^<^<vv^v>><v<v>^<<v<>^<^v<<^v<>^v<<^>vvvv<v<<<<vv>>^^^<>v>vvvvv^v>>^<<^>^>v^<^>^v^^><^>v^<^>><^^^vvv>^<>v>v^^^>^>><<<><><<<^<vvv>^v^^<<^<^v<<<^<>>>>vv^><><v^>^v<^^>v<<v^<>>v>^<^vv<<vv><><><^v<<<>^>v^v<>v^^^^>^^>^<<>^><<^>^^^>^<^^<>><<^>^<<<v^^>^^<>^v<^><>^v>v^<>>^<<vv^^>>^^^^v<v^v>vvvv<<>v>^<<<>>v>^^>v><>>^<v^v^v><><<vv<><<<^^<<vv^<v^v^v>^vv^><vv>^v<^v<v>>^^<<<><<<v<^>><><<<<v>>^v^v<>>>v<><^^vv^v><>^<>vvvv>>>>>^>><<^>vvv^^v^>^>><<<^>^<>><vvv^>><v^<vv<^v>>>>v<^<<><^<^^>v<>>v^^^<^<vvvv<<^>>^^<^v>v>v^^v^^>v<^^<>><>>vv>^^>vv>v>vv<><v>^v^^v<^<^^>vvvv>v<<<<<^^<<v^><^>>^^v><<^>^^<v<<v<>^v^>>>^><vvv^^v><>vv>^^v>vv>v^v<<^>><<^^>^^><^<^>^>^>v>^<<><^>^^<^<
|
||||
vv>>^<v>><<<v>>^>><>><<<<^<^<<^>^>vv^v^<v^^^v>v><^<^>v^>>^v^<><<<^v^><v^vv>>>>v<><>vv<><vv><><<^<^<>><<^>^v><<vv^vv<^^<>v<>v>^>^<^<^>><>^^><vvv>v^<^<^<>v^><<<>>v<<<v^>^<>>>^v>v>v^vv><vv^>^v^<v><v^v^<>>^vv>^>>v<><>v>><^vv<<<<v^^>^<>><><^^^<><>>>v^^^^>v<v>^v^v>v^<v<<<><><><^>^v^v>^v^><<>>^><<v<^<v^v>vv^<^>v^v<^<>>>^^v><<^>><<<v^^<>>>^vv<>>vv>>>^<^^>>>^v<v^^^>^<^><<v<>>^^^^>><>v>^v><<v^<><v><v^><^<vv^><^<<v>><><^><>>v^<^<^>^^<^>^^<>>^<vv>vv<<>^<vv>>^>^<v<>v^<v><^<<v<^^<^>>^vv>^>vv^<vv<^v>v^v<vvvv^^>^^v>>>><>vv>^vv<>v^><><v>^v<<^>v<>^><v<<^vvv^>v^<<v^^>>>^^><^<<v^v>vv>v<^<<^v<>>^^<^>^^vv^^^^<^^<v<^v>><^<>^vv^><>>^v<vvv>v^^^vv<^<>>^><<>v^^^<>>^^<v^<vvv<^<<v^v<v><<v<<^>^v^><>><>^^^<><>>>v>>><vv><vvvv>^^^<^<><^^^>^v<^<^<>^^<vv>^>^v^><>>v<^<^>^><v><>vv>^v^>v^^v<><<v<><^<<>>^>^>>>v^><<vv<>^<^^v>v<<v^>>v>>^<vv>>v<v^v><<^><<><^^>v>v>>v^<><^>^<^v<>^^v<<<v<>v>>vv^><><>>^v<v>>>>^v^vvvv>><v<v<>^v<<^<v^<<v^>^<>v><<<^^^>^<^^^v>^<^^vv><>v^><<<>>^v^><<>>^<v<^^v>^>v<<<><><v^vv^v<vvv<>v>^^^^v<v><v>v>>^>^^>
|
||||
>^^v>><vvv<vv<>>vvv><>>^>>v>^v<^^vv^<>>v^^v^>>v<>^>v<^v>^^>^><><vv^>v>^vvv<<v>^v^<<>v>><^v^v>^>v^<v<^v>vv^>>v><<<<<^<vv^<>^>^<>v>v>>^^^><<^vv<<>v<><^<v<><vvv^v<^v^><<<v>vv<vvv>v>^^^<>><<v>><<>^^<><vv<^<<vv>^<<><>><vvv^>^v^vv>^^<v^<>v<>^^^>^v<^^>v^^<v>^<<v^vvv<<v<^><<v^<<>^^<><>^<><v^vv>>^^v>>v^><<<<vv<^<<vvv>^<<><<^>><>>><^v<<^^^<v^^vv><>^<>><>>v<^><<^^^><>v<<>v<><<^^v>^>>>v<>vv<>v<>^><v^^><v<>^v><><>><<^><v>>^>^><<v^>>v<v<<<><vvvvvvv><>vv>v<>>^><v<>vv^<><v><v^v>^^^^v<>>v>><<><v<v^<v^><^>>>>^<<vvv>^>v^>v^<v<>vv>v^<<<>>v<^<vvv^v^<><><<vv>v^<v<^v^>><v^>^^vvv^<><^^>^^<>v>^><>><v><>>vv<vv<^^<>v^v^v<<v<<v>><<<>>^^^vvvv>><<<v<>v>^^>^^<vv>^<<vv>v>v<><<^><<<v^<v^<vv^>>v>><>>><^v><<^<>^>v<<<vv^v^>^^^>><<^vv^<v<>^^>>>v<<^^^v>^^vv>v<<^><<vv^^>><<^<v<<v<<^<>v<<^>^<>>^<>^<^<v<v>>v^v>>^>v<^v<<>^^^^<v<^v<^<vv^<^<><^>v>^v<v^vv>^>v><^^<>v^<v>^>>>vv>v<<^v>>^^^>v><><v<<^<v^vv^<^>^<<v<<^^<v^v<><v<v<vv<vv<v^^v<^>>^^v^v^^<>>>>vv^>^><v<<v<^vv^>>^^^>v^<>^^<<v<^v^>^^^^<>^<vv^<>^<<^>>^><v^v<v<<^<><^vvvv^v<><>v>
|
||||
^<<vvv><<<<^<<<v>v^v^^<>>v<v^^v<>^<^v><>><>^<^><^vv>vv>^<^>>v^^>v>><^>v><>>^^^<<v<^<>^>^>v>^v>^<>>>>>vv^v^^v<<>^^<vv>^v<v>>^<<v<<<>^<<<^vvv<v<^<><^v<^<><<^^^<v<<vvvv<^>v<<^^^v>^><v<>^<^<><<<>^<^v<^^<><<<<v>^<<vv<^<^<v<<<>>^>v>>>>v^<<<^<^v>>v>><<vv^>v^<^v<v<vvv<><v<v>^^vv><>><^<<<<^^<^^<>><<v>>v>v^v^>^^<vv><>>>^>^^>^vvv<vvv^<vv<v<v^v^>v>^^vv^<v<^<<^v>vv<<^^v><v^>^^^>v><<v^vv^<>v><^^>>>>>^<^>>>v<<<>^v^<^^^v>v^><<>><>>v>><^><v<<<>vv<><>><>><^v^v>v^<>vv^<vv<v><vv^<vvv^^^>v^^^vv>vv^vvv<<^><v><>vv>>v><<>v<>>v>><v>vv<><>>^vv^>>v<v<vv><^>v^v>^<^>^vv>v^^<^<<v><v><<^^<^<<^>v<^>v^><v>><^><^<<<<^vvv<^><<^<^vvv>v^^<^v^^><><^vv>^vv^<<^<<v>v<<<vv<^<v^>v>^<<><>vv<v^>v^^v<^^<>v>v^^>v>v<vv<>v<<<<v>>v^^v^>^v>^>v<><v^v^vv<<vvv^<>>>v^^>^><v^^<v>^^^>^<^^v<><>>^v<><vv^^v<><>>v>>>v^^vv^v<<><v^vv<v^<>>^<>v<v^^v^>>^<<^^<<<^v^^>^v^>>><v^vv<^^><v><<<<^<>v^<^^>^v^^v<<>v<<vv^<^<^>^v^<^v^>v^<<vv><^^>>^><v<<vvv^^<>v^<v>^v<^>^^<v^<^>v><vv><<><vvvv<>>>^<^<<^^v<>v^v^<^^^^^>>>><v^v<v^^^><<v^vv^v<>^v^v>>>^<^^>vv>^vv><<v^v
|
||||
vvv>vv><<<^>^<>^^^v<v>^<<<^v<v>v<^v>^<>v^>>vv<>>><>><^^v^v><^><><<>v><<v><v<<>^v^^><^^<v^v>^v^>v<>v^vv>^^>><v>^v<^vv>>><<>^^>vv<><>v>^>^>><v<^v<^v^>^<vv<v<^>^^>><<v<^^>v<v><^v^<v>><>^<>^>>vv<>>^^<v<><v>^<v<<<<^<><vv^v<>><^<<^><<v^^>v>v<>v^^^<<v^<>><^v>>><<vvv>^v<vv<>><^<^^v><^^>><^^^<><v<^^>^^>v<v><^<^^>v<<^<>>v<^v<^<^<v>>^^>><^<^^<>v><<vv>^>^^><><^^^<v>>v^^>v^^<^^><^^v><v<<>>>><><>vv^>^><^><v<^<>^><v<^^^^><>>>^v<vv^v^>v<v<<v^<<<<^>v<v>><>^<>><>>v<^<^><vvv><>^><v<<vv^<v<^v>><<<<<><^>^<<^>>vv>v>^<<>>>v<v^^><>vvv^^>>^>^vv^^v^v^v^v^<>^<^^<<<>v<>^^^>><<>v^v^>v^v>>>^<^>v<v<^^^><<v>vv<^v<v<v^^<^v^vv^>v<^vv<vv<<>^v><^>vv<^><<^v>^><<<v>^>vv>^^^>v^<<vvv<^v>>^^<<<<^^^><v>v^v^^^>^vvv^><v^<^>v^v^vv>^><^<^>>v>>><^<<>^<^>v>vvv<^><<>><^^>v>^^v^vv^>v^<^v>v^>^^^<<<^^<^v^>>^^<^>^<^>v>>v<v>>v^<<vv>v^v^>^<v><><<^<^^v<^><^<^>v>^<>vv><<><^v^<v<v>v>>^><v>^>^^>v<^^^>vvv<v><>^^<<vv>^<^^^^v<<v<<^v<v>v^^vvvv<>>v><><v><^^v^>>^^>v><>v>^^><v>^vvv>v<<<^>v^^>>^v^^><^vv>v^v>>v^^^v<^>v<>><>>^vv<<^<>^<^<>><^<^<>>^>^^^v<
|
||||
^^>v^<^<v<<<v^<v<vvv>>v><vvv^v>v<vv^><>>>^>v^><<^^<^v^^<^<^^^v<^v><<v>>^^v<^<>v<<vv<><>>v^><>^<v<<^vv^>vv<<^^^>v^^>^vvv^v^^^v<^<>vv^v<>v^>vvvv<^<<vv>>v>><><^>vv<^>><><<v^>><^>><>v<><v^^<v><v^v^><>><v>>v<><^<<>v>v><v<>^><<v<^>^>^<<<^<^>^>v^<^<^><^^^^<<^v>v><v^>^<^>>v<<^>^>v^vv^v><>v><<vvv<v^<^><v>>v<v<^vv>vv><v>><<^vv>^>vv>^v<>><^<^^<^v^v^>v<<>v<^<^<>^<^<v^>^<>^^<v^v^v>>^>v^<v>v^<<>>><<^<v<<><><^^>^^v<^>>v<v<^^<^v<<><^vv<><>v^v<v^^v^v^>><^><<v<v><<<>>><v^^>>>v^><><v^v<>v<v<<^vv^^>^^^>^v^<><v^^>^<^^v>^^<v^>^v<<<^>v<^v><<>>v^<>^^^v<^v<<^v<>^v^><^>^><^v^><v<v^v^v<v>^>v^v<>^^v<<>>^<>vv^^^>^<^vv>>>^^v>vvv^<^v^vvvv<vv<<><v>v^^v^>^v^v^<v><>^v^vv><vvv<>><<vv<vv>v^vv<^v^v>^^<v>v^<>v^<>>vvvv<^>v^><^v<v>>>>v<<^<vv>^<<^^^^>^>>v>^vv>v^>v>^^^<^v^vv<<>v^v<><vv>>^^><<>^<<v<^>vv>v>>>v<vv>v>v<^<<<>v^<vvv<<<v>v>>v<<>><<^v<^v<^<>^><^<>v<>v<<^<<<v><^^<><^v><<^<^v<>v^>^>><>v>vv^<<v^<<vv<v^<v>v^^<>><^><><>>^^><^^vv>^<>^^>v<>vvv^>v^>v^>^<><v<<<vv<<^v^v>^<<^<^<<^v><^>^><>^><v<<>>>^^>v>><>><>^^<>>>^^>^v^<v>>>^^>
|
||||
^<<<><>>>^>^<<vv^<>v><^v<>^<^><^><v<vv^>vv><<>^><><><^v^<>^<>vv^^<>v>><^>>>><>>^^v^<^^^>><^v^v^<v<<<<^<>><v^^>^v<>vv<>><<^^^^v>^<vv<<^>>>>vv>>v>^v^<<^><v>^>vv><<<<^>^^>>^<<>^>>^<<>v<<v^v^^v^<<^v<<v>>>>>v^>v>^<^v^<^<<^>v<^>v><>vv><v^^<<>>>v>>v^v^<^<vv<>>><<^v<v^v>vv>v^<>>>vv><>><>^^>v^>v<v<v^v>>>^v<>^v<>^vvv>^<><v^>v^<v^<><v>vv^v^<^<>><<v^><^>^<^><v^>^^^>><^v^<<^<^vv<v><^^v^<v<>v^^>>^^>vvv>^^v>><vv>^vv>vv<<vv<<>^<>>>v^v>>^vvv^v^v<^>v^v^<<v><>v<<<>v<<vv<>v<>v<>v<<v<v<>><^^^>v^>v>>^><><>^>^^>^<>>^>>v><<<<^^<v<><>>>^<v<<^^v^>^><^^vvvv<<>vv>^>^><^v>v>>vv<>^>>^>^<vv<>^<<^^v<^<>vv>vv<v>^v>v<<>v<^vv><^>v>>^><^vvvvv<<>^>>>^<<<<^><<><v<><<<^<<<>>v^vv>v<<^>^v^<^>vv^>>>^<>^v^v^vv>v>v><<v<>><v^v>^<v>^>^v^^<<v^v<><v<v^vv>v>v<v<v>>v<^v<<vvv><^<<<><^v^>v^>v<><^v>>^<^v>^><><>><>^<^<<<<^>^><^vv>v^^<^v^v>>^vv<<<^>>v^>^>>><<v>^>>><<v>^>v<><>v<v<>>vvv>^><>^>vv^^>v><>>^v^<<^v^v>>>>>vv^<<^>^>^^v>vv<<v>>^^^vv^<v<>>v^>v<v><v^v^^<^<<>^>v<^>v<<>>^><>v^>><^v>^>>v>^><vv<vv>><^><><<><>>v><><^>>vv<^>>^>v<<^<>v>^>v<^
|
||||
><^<<vvv^^>>^^>v<^<v<>v<vvvvv><^v>>>^<^^>^>>><vv<>v<^vv<<vv<<v^<^><<>^^v^<v<<>^><v^>^>vv<>>>v>^><vv^<><<>v^v><v^v<v>^^<<<>^^>v<><^^>^<>v>vv<vv<^<>^<>^>v><>^^v>v<v<<^<^v<>v<^^vv^<>v><^>vvv<>><<^>v^<<v<<^^v<^v<<^>v><>^vv<>^<<vv^^<^v<^<vv>>^>v<^<v<>><><>^<v^^^^>^>^v<>^v>v><<^^<v>^>>><v^>>^^<^v><<v>>>>v<<>>>^><>v>>v<^^vv>^^v^<vv>^<v>><v<^^>v^^><^<^^<<>>v>>v<<<v>><>v<<vv>v><vv^<^<vvv^>><vv>^^>>v^<^<<<<<<<<<>^>>vv<^^^>>vv^><>^>><^^v<^<v^v^>^<<^>vv>^^>vv>^<<v<<v<^^<vv>v<<<v^>^^>^><^<<>^v^>^>v^<v^vv>>>^<vv<<>>^>>^^^<^>v^^>v^<v>^<^<v<^vvvvvvvvv^><^>^>><vv<<^v<>^>^v><>>^^<^>v<^<>^>>^>v><^v^<<>>vv^<v>v<v><v^^>^><^v^>^<v^^vv>>v^vv^v<<v<vv<^v><>^>vvv>^vvvv<<^vv^<<^^v^>v<^^^<^^v^v<^v><>>><^vv<><^>^^vv>>>v>>^<vvv^><^^vvvv^vv^>^>^><^>v^^<<^v^><vv^^v^<v>>>v^><^v><><<v^>>><v<^<^<><<>><<^v>>^^^v<>><>>v<^vv<v>><v<<^^<^><><^^>vv<v><v><vvvv<<><>><^><v<^>>>v^<>vv>^>v<<>vv>>^v^<<v^<v^^><v><^^^>v^<v>v<><><>^>>>v^<<>>v>^v<<>^>^>^<><^^v^^<>vv<<<vv^<^v^>^<>v<<^v>><^>v<v^^<^v>^<><^<<^<^<v^^<>>vv<><v<^v>^^<^<^<<>^>
|
21
day15/input_test.txt
Normal file
21
day15/input_test.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
||||
|
||||
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
|
||||
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
|
||||
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
|
||||
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
|
||||
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
|
||||
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
|
||||
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
|
||||
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
|
||||
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
|
||||
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
|
411
day15/task.txt
Normal file
411
day15/task.txt
Normal file
@@ -0,0 +1,411 @@
|
||||
--- Day 15: Warehouse Woes ---
|
||||
You appear back inside your own mini submarine! Each Historian drives their mini submarine in a different direction; maybe the Chief has his own submarine down here somewhere as well?
|
||||
|
||||
You look up to see a vast school of lanternfish swimming past you. On closer inspection, they seem quite anxious, so you drive your mini submarine over to see if you can help.
|
||||
|
||||
Because lanternfish populations grow rapidly, they need a lot of food, and that food needs to be stored somewhere. That's why these lanternfish have built elaborate warehouse complexes operated by robots!
|
||||
|
||||
These lanternfish seem so anxious because they have lost control of the robot that operates one of their most important warehouses! It is currently running amok, pushing around boxes in the warehouse with no regard for lanternfish logistics or lanternfish inventory management strategies.
|
||||
|
||||
Right now, none of the lanternfish are brave enough to swim up to an unpredictable robot so they could shut it off. However, if you could anticipate the robot's movements, maybe they could find a safe option.
|
||||
|
||||
The lanternfish already have a map of the warehouse and a list of movements the robot will attempt to make (your puzzle input). The problem is that the movements will sometimes fail as boxes are shifted around, making the actual movements of the robot difficult to predict.
|
||||
|
||||
For example:
|
||||
|
||||
##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
||||
|
||||
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
|
||||
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
|
||||
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
|
||||
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
|
||||
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
|
||||
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
|
||||
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
|
||||
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
|
||||
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
|
||||
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
|
||||
As the robot (@) attempts to move, if there are any boxes (O) in the way, the robot will also attempt to push those boxes. However, if this action would cause the robot or a box to move into a wall (#), nothing moves instead, including the robot. The initial positions of these are shown on the map at the top of the document the lanternfish gave you.
|
||||
|
||||
The rest of the document describes the moves (^ for up, v for down, < for left, > for right) that the robot will attempt to make, in order. (The moves form a single giant sequence; they are broken into multiple lines just to make copy-pasting easier. Newlines within the move sequence should be ignored.)
|
||||
|
||||
Here is a smaller example to get started:
|
||||
|
||||
########
|
||||
#..O.O.#
|
||||
##@.O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
<^^>>>vv<v>>v<<
|
||||
Were the robot to attempt the given sequence of moves, it would push around the boxes as follows:
|
||||
|
||||
Initial state:
|
||||
########
|
||||
#..O.O.#
|
||||
##@.O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move <:
|
||||
########
|
||||
#..O.O.#
|
||||
##@.O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move ^:
|
||||
########
|
||||
#.@O.O.#
|
||||
##..O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move ^:
|
||||
########
|
||||
#.@O.O.#
|
||||
##..O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move >:
|
||||
########
|
||||
#..@OO.#
|
||||
##..O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move >:
|
||||
########
|
||||
#...@OO#
|
||||
##..O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move >:
|
||||
########
|
||||
#...@OO#
|
||||
##..O..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#......#
|
||||
########
|
||||
|
||||
Move v:
|
||||
########
|
||||
#....OO#
|
||||
##..@..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move v:
|
||||
########
|
||||
#....OO#
|
||||
##..@..#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move <:
|
||||
########
|
||||
#....OO#
|
||||
##.@...#
|
||||
#...O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move v:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#..@O..#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move >:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#...@O.#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move >:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#....@O#
|
||||
#.#.O..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move v:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#.....O#
|
||||
#.#.O@.#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move <:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#.....O#
|
||||
#.#O@..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
|
||||
Move <:
|
||||
########
|
||||
#....OO#
|
||||
##.....#
|
||||
#.....O#
|
||||
#.#O@..#
|
||||
#...O..#
|
||||
#...O..#
|
||||
########
|
||||
The larger example has many more moves; after the robot has finished those moves, the warehouse would look like this:
|
||||
|
||||
##########
|
||||
#.O.O.OOO#
|
||||
#........#
|
||||
#OO......#
|
||||
#OO@.....#
|
||||
#O#.....O#
|
||||
#O.....OO#
|
||||
#O.....OO#
|
||||
#OO....OO#
|
||||
##########
|
||||
The lanternfish use their own custom Goods Positioning System (GPS for short) to track the locations of the boxes. The GPS coordinate of a box is equal to 100 times its distance from the top edge of the map plus its distance from the left edge of the map. (This process does not stop at wall tiles; measure all the way to the edges of the map.)
|
||||
|
||||
So, the box shown below has a distance of 1 from the top edge of the map and 4 from the left edge of the map, resulting in a GPS coordinate of 100 * 1 + 4 = 104.
|
||||
|
||||
#######
|
||||
#...O..
|
||||
#......
|
||||
The lanternfish would like to know the sum of all boxes' GPS coordinates after the robot finishes moving. In the larger example, the sum of all boxes' GPS coordinates is 10092. In the smaller example, the sum is 2028.
|
||||
|
||||
Predict the motion of the robot and boxes in the warehouse. After the robot is finished moving, what is the sum of all boxes' GPS coordinates?
|
||||
|
||||
Your puzzle answer was 1456590.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
The lanternfish use your information to find a safe moment to swim in and turn off the malfunctioning robot! Just as they start preparing a festival in your honor, reports start coming in that a second warehouse's robot is also malfunctioning.
|
||||
|
||||
This warehouse's layout is surprisingly similar to the one you just helped. There is one key difference: everything except the robot is twice as wide! The robot's list of movements doesn't change.
|
||||
|
||||
To get the wider warehouse's map, start with your original map and, for each tile, make the following changes:
|
||||
|
||||
If the tile is #, the new map contains ## instead.
|
||||
If the tile is O, the new map contains [] instead.
|
||||
If the tile is ., the new map contains .. instead.
|
||||
If the tile is @, the new map contains @. instead.
|
||||
This will produce a new warehouse map which is twice as wide and with wide boxes that are represented by []. (The robot does not change size.)
|
||||
|
||||
The larger example from before would now look like this:
|
||||
|
||||
####################
|
||||
##....[]....[]..[]##
|
||||
##............[]..##
|
||||
##..[][]....[]..[]##
|
||||
##....[]@.....[]..##
|
||||
##[]##....[]......##
|
||||
##[]....[]....[]..##
|
||||
##..[][]..[]..[][]##
|
||||
##........[]......##
|
||||
####################
|
||||
Because boxes are now twice as wide but the robot is still the same size and speed, boxes can be aligned such that they directly push two other boxes at once. For example, consider this situation:
|
||||
|
||||
#######
|
||||
#...#.#
|
||||
#.....#
|
||||
#..OO@#
|
||||
#..O..#
|
||||
#.....#
|
||||
#######
|
||||
|
||||
<vv<<^^<<^^
|
||||
After appropriately resizing this map, the robot would push around these boxes as follows:
|
||||
|
||||
Initial state:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##....[][]@.##
|
||||
##....[]....##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move <:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##...[][]@..##
|
||||
##....[]....##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move v:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##...[][]...##
|
||||
##....[].@..##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move v:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##.......@..##
|
||||
##############
|
||||
|
||||
Move <:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##......@...##
|
||||
##############
|
||||
|
||||
Move <:
|
||||
##############
|
||||
##......##..##
|
||||
##..........##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##.....@....##
|
||||
##############
|
||||
|
||||
Move ^:
|
||||
##############
|
||||
##......##..##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##.....@....##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move ^:
|
||||
##############
|
||||
##......##..##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##.....@....##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move <:
|
||||
##############
|
||||
##......##..##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##....@.....##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move <:
|
||||
##############
|
||||
##......##..##
|
||||
##...[][]...##
|
||||
##....[]....##
|
||||
##...@......##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move ^:
|
||||
##############
|
||||
##......##..##
|
||||
##...[][]...##
|
||||
##...@[]....##
|
||||
##..........##
|
||||
##..........##
|
||||
##############
|
||||
|
||||
Move ^:
|
||||
##############
|
||||
##...[].##..##
|
||||
##...@.[]...##
|
||||
##....[]....##
|
||||
##..........##
|
||||
##..........##
|
||||
##############
|
||||
This warehouse also uses GPS to locate the boxes. For these larger boxes, distances are measured from the edge of the map to the closest edge of the box in question. So, the box shown below has a distance of 1 from the top edge of the map and 5 from the left edge of the map, resulting in a GPS coordinate of 100 * 1 + 5 = 105.
|
||||
|
||||
##########
|
||||
##...[]...
|
||||
##........
|
||||
In the scaled-up version of the larger example from above, after the robot has finished all of its moves, the warehouse would look like this:
|
||||
|
||||
####################
|
||||
##[].......[].[][]##
|
||||
##[]...........[].##
|
||||
##[]........[][][]##
|
||||
##[]......[]....[]##
|
||||
##..##......[]....##
|
||||
##..[]............##
|
||||
##..@......[].[][]##
|
||||
##......[][]..[]..##
|
||||
####################
|
||||
The sum of these boxes' GPS coordinates is 9021.
|
||||
|
||||
Predict the motion of the robot and boxes in this new, scaled-up warehouse. What is the sum of all boxes' final GPS coordinates?
|
||||
|
||||
Your puzzle answer was 1489116.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
|
110
day16/code.py
Normal file
110
day16/code.py
Normal file
@@ -0,0 +1,110 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
import heapq
|
||||
sys.setrecursionlimit(15000)
|
||||
|
||||
L = '<'
|
||||
U = '^'
|
||||
R = '>'
|
||||
D = 'v'
|
||||
|
||||
EMPTY = '.'
|
||||
WALL = '#'
|
||||
START = 'S'
|
||||
END = 'E'
|
||||
|
||||
|
||||
class Maze:
|
||||
def __init__(self, lines: list[list[str]]):
|
||||
self.grid = lines
|
||||
for y in range(len(self.grid)):
|
||||
for x in range(len(self.grid[0])):
|
||||
if self.grid[y][x] == START:
|
||||
self.s = (x, y)
|
||||
elif self.grid[y][x] == END:
|
||||
self.e = (x, y)
|
||||
|
||||
def __str__(self):
|
||||
grid = [r.copy() for r in self.grid]
|
||||
return '\n'.join(''.join(row) for row in grid)
|
||||
|
||||
def start(self) -> tuple[int, int]:
|
||||
return self.s
|
||||
|
||||
def end(self, pos: tuple[int, int]) -> bool:
|
||||
return self.e == pos
|
||||
|
||||
def is_wall(self, pos) -> bool:
|
||||
x, y = pos
|
||||
return self.grid[y][x] == WALL
|
||||
|
||||
|
||||
def search(m: Maze) -> int:
|
||||
x, y = m.start()
|
||||
state = (x, y, 1, 0) # x diff is 1 (we are facing right), y diff is 0
|
||||
|
||||
queue = []
|
||||
visited = set()
|
||||
heapq.heappush(queue, (0, state))
|
||||
visited.add(state)
|
||||
|
||||
while queue:
|
||||
cost, state = heapq.heappop(queue)
|
||||
x, y, xd, yd = state
|
||||
|
||||
if m.end((x, y)):
|
||||
return cost
|
||||
|
||||
options = [
|
||||
# move forward
|
||||
(cost+1, (x+xd, y+yd, xd, yd)),
|
||||
# turn
|
||||
(cost+1000, (x, y, -yd, xd)),
|
||||
(cost+1000, (x, y, yd, -xd)),
|
||||
]
|
||||
|
||||
for opt in options:
|
||||
cost, state = opt
|
||||
x, y, _, _ = state
|
||||
if m.is_wall((x, y)):
|
||||
continue
|
||||
if state in visited:
|
||||
continue
|
||||
|
||||
visited.add(state)
|
||||
heapq.heappush(queue, (cost, state))
|
||||
|
||||
return -1
|
||||
|
||||
def solve1(lines: list[list[str]]):
|
||||
m = Maze(lines)
|
||||
res = search(m)
|
||||
return res
|
||||
|
||||
|
||||
def solve2(lines: list[list[str]]):
|
||||
maze = Maze(lines)
|
||||
return ''
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
lines = Input('input_test.txt').lines_as_lists()
|
||||
#part 1
|
||||
print('test part 1:', solve1(lines))
|
||||
#part 2
|
||||
print('test part 2:', solve2(lines))
|
||||
|
||||
lines = Input('input_test2.txt').lines_as_lists()
|
||||
#part 1
|
||||
print('test 2 part 1:', solve1(lines))
|
||||
#part 2
|
||||
print('test 2 part 2:', solve2(lines))
|
||||
|
||||
lines = Input('input.txt').lines_as_lists()
|
||||
#part 1
|
||||
print('part 1:', solve1(lines)) # 90460
|
||||
|
||||
#part 2
|
||||
print('part 2:', solve2(lines))
|
141
day16/input.txt
Normal file
141
day16/input.txt
Normal file
@@ -0,0 +1,141 @@
|
||||
#############################################################################################################################################
|
||||
#.......#...#.#.........................#.......#...#...........#...#.....#.............#.............#.......#.....#.....#................E#
|
||||
#.#####.#.#.#.#.#######.#####.###.#.#.#.#.#.###.#.#.#####.###.#.###.#.###.#.#.###.#####.#####.#######.#.#####.#.#.###.#.#.#######.###.#####.#
|
||||
#.....#...#.#.........................#.#.#.#.#...#.......#.....#...#.#.#...#.....#...#.............#...#...#...#.....#.#...#...#.........#.#
|
||||
#.###.#####.#######.#####.#.###.#######.#.#.#.#############.#.###.###.#.#####.#######.#######.#####.#.###.#.#####.#####.###.#.#.#.#.#.###.#.#
|
||||
#.#.#...#.#.........#.....#...#.#.......#.#.#.#...#.....#...#.....#...#.....#...#.......#...#.................#.........#.#...#.#.#...#...#.#
|
||||
#.#.###.#.###########.#######.#.#.#######.#.#.#.#.#.###.#.###.###.#.###.###.#.#.#.#####.#.#.#.#.#.#.###.#####.#.#.#######.#####.#.###.#####.#
|
||||
#.#...#.#.........#.....#...#...#...#.......#.#.#.#...#.#.#...#...#.#.....#...#.#.....#...#.#.#.#.#...#.....#.................#...#...#.....#
|
||||
#.#.###.#######.###.###.#.#.#######.#.###.###.#.#.#.###.#.###.#####.#.#.#.###.#.#.###.#####.#.#.#.###.#####.#.#.#.#.#.###.###.#####.#.#.#####
|
||||
#.#...#.....#...#...#.#...#.......#.#.#.....#...#.#.#...#...#.....#.......#...#.#...#.....#.....#.#.#.#.....#.#.#.#.#.#...#.#...#.....#.#...#
|
||||
#.###.#####.#.#.#.###.#####.#.#####.#.#.###.#.###.#.#.#####.#.###.#####.###.#.#.###.#####.#######.#.#.#.#####.#.#.###.#.###.#.###.###.#.###.#
|
||||
#.#...#.#...#.#.#.........#.#.#.....#.....#.#...#.................................#.#...#.#...#...#.#.#...#.#...#.#...#.#...#.#...#.#.#.#...#
|
||||
#.#.#.#.#.###.#######.#####.#.#.###########.#########.#.#####.#.#.###.#.#####.#.#.#.#.#.#.###.#.###.#.###.#.#####.#.###.#.#.#.#.###.#.#.#.###
|
||||
#...#...#...#.........#.....#.#...#...#.....#...................#.............#.#.#.#.#.#...#.#.#...#.....#...........................#.#...#
|
||||
#.#####.###.#.#########.#####.###.#.#.#.#####.#####.#######.#.#.#######.#####.#.#.#.#.#.###.#.#.###.#######.#######.#.#.#.###.###.#.#.#.###.#
|
||||
#.....#.#.#.#.#...#...#.#.......#...#.#...........#.#.......#.#...........#.....#.#.#.#.#...#.........#.....#.......#.#.#.#.....#.#.#...#...#
|
||||
#.###.#.#.#.###.#.#.#.#.#.###########.#########.###.#.#######.###########.#.#####.#.###.#.###.#####.###.###.#.#######.#.#.#.#####.#.#.###.###
|
||||
#...............#.#.#...#...#.......#.........#.#.....#...#...........#...#.#.....#.#...#...#.#...#.#...#.#...#.......#.#.....#...#...#.....#
|
||||
#.#.#####.#######.#.#####.###.###.#.#########.###.###.#.#.#.###.#######.###.###.###.#.#####.###.#.###.#.#.#######.###.#.#####.#.#####.#.#.#.#
|
||||
#.#.....#.....#...#...#...#.....#.#.#.......#.....#...#.#.#.....#.......#...........#...........#.#...#...........#...#.....#.#.#.....#.#...#
|
||||
#.#####.###.###.#####.#.###.#.###.#.###.###.#######.###.#.#####.#.#######.###.#.#########.#######.#.###.#####.#.###.#######.###.#.#####.#.###
|
||||
#.#...#...#.#...#.....#...#.#.....#.....#.#...#.....#...#.......#...#...#.#...#...........#...#...#.#...#...#.#.#.........#.....#...#...#...#
|
||||
#.#.#.###.###.#####.#######.#.###########.###.#.###.#########.#####.###.#.#.#########.###.#.###.###.#####.#.#.#.#.#######.#######.#.#.###.#.#
|
||||
#...#.#...........#...#.....#.................#...#.........#.....#...#...........#...#...#...#...........#.#.#.#.#.....#.#...#.#.#.#...#...#
|
||||
#.###.#.###.###.#.#.#.#.#.#############.###.#####.#########.#########.###.#######.###.#.#####.#############.###.###.###.#.#.#.#.#.#.###.#.#.#
|
||||
#...#.#...#...#.#.#.#.............#...#...#.#...#...#.....#.........#...#.......#...#...#.....#...#...#.....#...#...#...#...#.#...#.#...#.#.#
|
||||
#.#.#.#.#.###.#.#.#####.#.#######.###.###.###.#.###.#.#######.#####.###.#####.#####.###.#.###.#.#.#.#.#.#####.#.#.###.#######.#.###.#.###.#.#
|
||||
#...#.#.#.#...#.#.....#...#...#.....#.....#...#...#.#.#.....#.....#...#.....#.#...#...#.#.#...#.#...#...#.........#.#.#.....#.#...#...#.#.#.#
|
||||
#.#.#.###.#.###.#####.#.###.#.#####.#.#.#.#.###.###.#.#.###.#####.#.#.#####.###.#.#.#.#.#.#####.#####.#.#.###.###.#.#.###.###.#####.#.#.#.#.#
|
||||
#...#...#...#...#.#...#.#...#...#.#...#.#.#.#...#...#.#...#.........#.#.....#...#.....#...#...#...#...#.#...#...#.#.....#.........#.#...#.#.#
|
||||
#.#####.#.#####.#.#.#####.#####.#.#.###.###.#.#.#.###.###.#########.###.#####.#########.###.#.###.#.###.###.###.#.#####.#########.#.#.#.#.#.#
|
||||
#...#...#.....#...#.#.....#.....#.#.#...#...#.....#...#.#.#.........#.......#.....#.....#...#...#.#.#.#...#.#.......#.#.....#...............#
|
||||
#.#.#.###.###.###.#.#.#####.#.#.#.#.#.###.#########.#.#.#.#.#########.###.#.#.###.#######.#####.#.#.#.###.#.#.#.###.#.#####.#.#.###.#.#.#.#.#
|
||||
#.#.#...#.....#...#.#.#.....#...#...#...#.........#.#...#.#.#.....#...#...#.....#...#...#.#.......#.#.....#.#.#.....#...#...#.#.#.#.#.#.#.#.#
|
||||
#.#.###.#.#####.###.#.#.###########.###.#########.#.#.###.#.#.#.###.###.###########.#.#.#.#########.#####.###.#.#####.###.###.#.#.#.#.###.#.#
|
||||
#...#...............#.#...............#.......#...#.#.#...#...#.........#.........#...#.#.....#.........#.....#...#...#...#...#.#.....#...#.#
|
||||
#.###.###.#.#.###.###.###########.###########.#.###.#.#.#######.###.#.###.#######.#####.#####.#.#######.#.#######.#.###.###.###.#####.#.#####
|
||||
#.#.#.#...#...#...#...#.......#...#.....#.....#.....#.#.........#...#.#.#.#.....#...........#.......#...#.#.....#.#.#...#.....#...#...#.....#
|
||||
#.#.#.#.#.#.###.###.###.#####.#.###.###.#.###########.###########.###.#.#.#####.#####.#########.###.#.#####.###.#.#.#.###.###.###.#.#.###.#.#
|
||||
#...#.#.#.#.#...#...#...#...#.#.....#...#.#.........#.#.#.....#.#.....#.#.......#.....#...#...#.....#.......#.#...#.#.#.#.#...#.#...#...#.#.#
|
||||
#####.#.#.#.#.###.###.#####.#.#####.#.###.#.#######.#.#.#.#.#.#.#.#####.###.#.#.#.#####.#.#.#.###.###########.#####.#.#.#.#.#.#.#######.###.#
|
||||
#.....#.#.#.#.......#.#.....#.#...#.#.#...#.......#.#.#...#.#.#.......#...#.#.#.#.....#.#...#...#.#.....#...........#.#...#.#...............#
|
||||
#.#####.#.#.#########.#.#.###.#.#.###.###.#.#######.#.#.###.#.#######.#.#.#.#.#######.#.#####.#.#.#.###.###.#####.###.#####.###.###.#.#.#.#.#
|
||||
#.#...#.#...#.#.......#.#...#.#.#.#...#...#.#...#...#.#...#.#.......#...#.#.#.#.......#...#...#.#.#.#.......#...#.#...#.....#.#...#.#.#.....#
|
||||
#.#.###.#.###.#.#######.#.#.#.#.#.#.###.###.#.#.#.###.###.#.#######.###.###.#.#.#########.###.#.#.#.###.###.#.#.###.###.#####.###.###.#####.#
|
||||
#.#.....#.....#...#...#...#.#...#...#...#...#.#.#...........#.....#...#.#...#...#.......#...#.....#...#.....#.#.....#...#.............#...#.#
|
||||
#.#.#####.#######.#.###.###.#.#######.###.###.#.#############.#######.###.###.###.#####.###.#######.#.#.#####.#########.#.###########.#.#.#.#
|
||||
#.#...............#...#...#.....#...........#.#...#.....#...#.........#...#.#...#...#.....#...#...#...#...#...#.#.......#.#.....#...#.#.#.#.#
|
||||
#.#######.#########.#.#.###.#####.###########.#.#.#.###.#.#.#.#########.###.###.#####.#####.#.#.#.#.#.#####.###.#.#.#####.#.###.###.#.#.#.#.#
|
||||
#.........#.......#.#...#...#.....#...#.....#...#...#...#.#.#.......#...#...#...#.....#.......#.#.#.#.....#...#.#.#.....#.#.#.#...#.....#.#.#
|
||||
#.###.###.#.#.###.#.###.#.###.#####.#.#.###.###.#####.###.#.#####.#.#.###.###.###.#####.#####.#.###.#####.###.#.#.#####.###.#.###.###.#####.#
|
||||
#.#...#.........#.#.....#...........#.#.#.......#.....#...#.........#...#.........#.....#...#.......#...#...#.#.#...#...#.......#...#.#.....#
|
||||
#.#.#.#.#######.#.#.#######.#####.###.#.###########.#########.#.#######.#.#########.#####.###.#########.###.#.#.###.#.###.#######.#.###.#####
|
||||
#.#.#...#.....#.#.#.#.....#.....#...#.#...........#.........#.............#.........#.#.......#.......#...#...#.....#.#...#.........#...#...#
|
||||
#.#.#.###.###.#.###.#.###.#####.#####.###########.#####.###.###.#.#########.#########.#.#########.#.#.#.#.#####.#####.#.###.#####.#.#.#####.#
|
||||
#.#.#...#.#...#.....#.#.#.#...#...#.....#.#...#...#...#...#.......#.......#.#...#.......#.......#.#.#...#.#...#.#.....#.#...#.....#.#.#...#.#
|
||||
#.#.#.#.#.#.#########.#.#.#.#.###.#.###.#.#.#.#.###.#.###.###.#.###.#####.#.#.#.#.#.#####.#.###.###.#####.###.#.#.#####.#.###.#.#.#.#.#.#.#.#
|
||||
#.....#...#.............#...#...#...#.....#.#.#.#...#...#...#.#...#.#.......#.#.#...#...#.#...#...#.....#...#...#.....#.#...#.#...#.#...#...#
|
||||
#####.#########################.#######.###.#.#.#.#####.#.#.#.#####.#####.###.#.#.#####.#.###.###.#####.###.#.#######.#.###.###.#.#.#######.#
|
||||
#...#.#.......#...#.............#.....#.#...#.#.......#.#.#.......#.....#.#...#.......#...#.#.#...#...#...#.#.#.....#.#.#.#...#.#.#.#.....#.#
|
||||
#.#.#.#.#.###.###.#.#####.#####.#.###.#.#.###.#########.#####.###.#.###.###.###.#####.###.#.#.###.#.#.###.#.#.#.###.#.#.#.###.###.#.#####.#.#
|
||||
#.#.#.#.#...#...#.#.#...#.#...#.#.#...#.#.#.......#...#.#...#.#...#...#.......#...#.#...#...#...#.#.#.#...#.#.#.#...#.#.#...#...#...#.....#.#
|
||||
#.#.#.#####.###.#.#.#.#.#.#.#.###.#.#####.#######.#.#.#.#.#.#.#.#####.###########.#.###.#.#####.#.#.#.#.###.###.#.###.#.#.#####.###.#.#####.#
|
||||
#.#.#.#.....#.....#...#...#.#...#.#.....#...#...#...#.#...#.#.#.....#...#...#.....#...#.#.#.....#...#...#...#...#.#...#.#.#.......#...#.....#
|
||||
#.#.#.#.#.#######.#####.#.#.###.#.#####.###.#.#.#.###.#####.#.#####.#.#.###.#.#####.###.###.#############.###.###.#.#.#.#.#.#.###.#.###.#####
|
||||
#.#.....#.#...#.......#.#.#...#...#...#.....#.#.#.....#...........#...#.....#...#.....#.....#.....#.#.....#...#.#.#.#...#.#.#...#.#.....#...#
|
||||
#.###.#####.#.#########.#####.#####.#.#######.###.#####.#####.#.#####.#####.#.#.#####.#######.###.#.#.#####.###.#.#.#####.#.###.#.#.###.#.#.#
|
||||
#.....#.....#...........#.....#.#...#.........#...#.....#...#.#.....#...#.....#.#.....#.........#.#.#.......#.#...#...#...#...#...#...#...#.#
|
||||
#####.#.#.#############.#.#####.#.#######.###.#.#####.###.###.#####.###.#####.#.#.###.#########.#.#.#########.#.#####.###.#.#.#######.#.#.###
|
||||
#.......#.#.......#.....#.#.........#...#.#.#.#.#.....#.....#.....#.........#.#.#...#.....#.....#.....#.....#.#.#.....#.....#.......#...#...#
|
||||
#.#####.#.#.#####.#####.#.#########.#.#.#.#.#.#.#.#.#####.#.#####.#########.###.#.#.#####.#.#########.#.###.#.#.#.#####.###.#####.#####.###.#
|
||||
#.#...............#...#.#.......#.....#.#.#.#.#.#.#.#...#.#...#...#.....#.......#.#.#...#...#...#...#...#.#.#.#.#.#.....#...#...#.....#.....#
|
||||
#.###.#.#.#.###.###.#.#########.#######.#.#.#.#.#.#.#.#.###.###.###.#############.#.#.#.#####.#.#.#.#####.#.#.#.#.#.###.#.#####.#####.#.###.#
|
||||
#.......#.#.#...#...#.........#...#...#.#.#...#.#.#...#...#.#...#...#.......#...#.#.#.#.....#.#...#.......#...#.#.#...#.#.........#.........#
|
||||
#.#####.#.#.#.#.#.#####.#.#.#####.#.#.#.#.#####.#.#######.#.#.###.#.#.#####.###.#.#.###.###.#.###########.###.#.#.#####.#########.#.###.#.#.#
|
||||
#.#.....#.#.#.....#.....#.#.....#...#.#.#...........#.....#.......#...#.#...#...#.#...#.....#...#.......#.......#...#...#.............#...#.#
|
||||
#.#.#######.#.#####.###.#.#####.#.###.#####.#########.###.#############.#.###.#.#.###.#.#######.#.#####.#######.###.#.#.#####.#########.#.#.#
|
||||
#.#...#.....#.......#.....#.......#...#...#.......#...#...#...#.......#...#...#.#.....#...#.....#.#...#...#...#...#.#.#.#...#.....#.....#.#.#
|
||||
#####.#.#####.#######.###.#.#.#.#.#.###.#.#######.#.###.###.#.#.#####.#.###.#.#.###.#.###.#.#####.###.###.#.#.###.#.#.###.#.#####.#.###.###.#
|
||||
#.....#.#.....#...#.....#.#.....#.#.#...#.......#...#.#.....#...#.#...#.#...#...#...#.#...#.#...#...#.#...#.#.....#.#.....#...#...#...#.....#
|
||||
#.###.#.#.###.###.#.###.#.#####.###.#.#########.#####.#.###.#####.#.#.#.#####.#.#.###.#.###.#.#.###.#.#.###.#.#####.#.#######.#.#####.#.#####
|
||||
#...#.#.#...#...#...#...#...#...#...#.#...#...#.#.......#...#.....#.#.#.#.....#.#.#...#.......#.#.#.#.#.....#...#...#.......#.#.#...........#
|
||||
#.#.###.###.#.#.#####.###.###.###.#.#.#.#.#.#.#.#.#######.###.###.#.###.#.#######.#.###########.#.#.#.#######.###.#########.#.#.###.###.#.#.#
|
||||
#.#...#.#...#.#.#...#.#...#...#...#.#.#.#.#.#.#.#.#.......#.#...#.#...#.#.#.......#...........#...#.#...........#.#...#.....#.#...#.......#.#
|
||||
#####.#.#.###.#.#.#.#.#.###.#.#.#####.#.#.#.#.#.###.#######.###.#.###.#.#.#.#########.#######.#.###.#######.###.#.#.#.#####.#.###.###.#.###.#
|
||||
#.....#...#...#...#...#.#.#.#.#.....#.#.#...#.#.....#.........#.#...#.#.#.....#.............#.#.#...#.....#...#.....#.....#.#.#.#.....#.....#
|
||||
#.#########.#.#########.#.#.#.###.#.#.#####.#.#######.###.#.###.#.###.#.#####.#.#######.#####.###.###.###.###############.###.#.###.###.###.#
|
||||
#...#.....................#.#.#.....#...#.....#.....#.#...#.#...#.........#...#.#.....#.#.....#...#...#.#.#.......#...#.....#.#...#...#.....#
|
||||
#.#.#.#######.#####.#######.#.#.###.###.#.###.###.###.#.#.#.#.###.#.#####.#.###.#.#####.#.#.###.#.#.###.#.#.###.#.#.#.#####.#.#.#.###.#.###.#
|
||||
#.#.#.#...........#.........#.#.#...#...#.#.......#...#.#.#...#.#.#.......#.....#.........#.#...#...#...#...#...#...#.#...#...#.#.#...#.#...#
|
||||
#.#.#.#.#####.#.#.#.#########.#.#####.###.#######.#.###.#.#####.#.#################.#####.###.#####.#.#.#####.#######.#.#.#######.#.#####.#.#
|
||||
#.#...#.#.......#.#...#.......#.......#.......#...#.....#.......#.#...............#.#.........#.....#.#.#...#.......#.#.#.......#.......#.#.#
|
||||
#.#######.###.#######.###.#####.#.#####.#####.#####.#############.#.#####.#######.###.###.#.#####.###.#.#.#.#.###.#.#.#.#.#####.###.###.#.#.#
|
||||
#.....#...#.........#...#...#...#...#...#...#.......#.....#.......#...#...#...........#...#.......#...#...#...#.#.#.#.#.......#...#.....#.#.#
|
||||
#####.#.###.#.#####.###.#####.#####.#.###.#.#########.###.#.#.#######.#.###.#######.#######.#######.###########.#.###.#.#####.###.#.#####.#.#
|
||||
#...#.#...#.#.....#.....#...........#.#...#...#.....#...#...#.#.....#...#...#...#...#.............#.#...........#.....#...#.......#...#...#.#
|
||||
#.###.###.#.#.###.#####.#.#.#.#######.#######.#.###.###.#####.#.#.#.#.#.#####.#.#.###.#####.#.#####.###.#.#.###.#######.###.###.#####.###.#.#
|
||||
#.................#...#.#.#.........#.#.....#.....#...#.....#.#...#...#.....#.#.#.#...#...#.#.#.......#.#.#.#.#.#.......#...#.#...#...#.....#
|
||||
#.#######.#.#.#####.#.#.#.#####.#####.#.###.#######.#.#####.#####.#########.#.#.#.#.#####.#.###.#.###.#.#.#.#.#.#.#####.#.###.###.#.###.#.#.#
|
||||
#.#.....#.#.#.....#.#...#.....#...#...#...#.........#...#.#.#.....#.......#...#.#.#.#.....#...#.#...#...#...#.#...#.....#...#.#...#.....#...#
|
||||
#.#.###.###.#.###.#.#######.#.###.#.###.#.#############.#.#.#.#####.#.#.#.#####.#.#.#.###.###.#.#.###########.#####.#######.#.#.#########.#.#
|
||||
#.#.#.....#.#.#.#...........#...#...#...#...#.....#.....#.#...#...#.#.#.#...#...#.#...#.#...#...#.....#.......#.....#.......#.#.........#...#
|
||||
#.#.#####.#.#.#.###############.#####.#####.#.#####.#####.###.#.#.###.#.#.#.#.#########.###.#######.#.#.###.###.#####.#.#####.#########.#####
|
||||
#.#.....#...#.....#.....#.......#.#...#...#.#.#.....#...........#.....#.#.#.#.#.....#.....#...#...#.#.#.#...#...#.......#.............#.#...#
|
||||
#.#####.###.#####.#.###.#.#######.#.#####.#.#.#.###########.###########.#.#.#.#.#.###.#.#####.#.###.#.#.#####.###.#####.#.#.#########.#.#.#.#
|
||||
#...#...#...#...#.#...#...#.....#.......#.#.#...#...........#.....#.....#.#...#.#.#...#.#.....#...#.#...#...#.#.#.......#.#.....#...#.#...#.#
|
||||
#####.#######.#.#####.#######.#.#######.#.#.#.###.###########.#.###.#####.###.#.#.#.###.#.#######.#.#####.#.#.#.###.#.#####.###.#.#.#.#####.#
|
||||
#...#.........#.........#...#.#...#.......#.#.....#.....#.........#.#.#...#...#.#...#.#...#.......#.....#.#.........#.....#.#...#.#.#.#...#.#
|
||||
#.#.###############.###.#.#.#.###.#########.#######.###.#.#######.#.#.#.###.###.#####.#########.#######.#.###########.###.#.#.###.###.#.#.#.#
|
||||
#.#.#.................#...#...#.#...........#.......#.#...#.....#.#.#.#...#...#.....#.........#.....#...#...........#...#...#.............#.#
|
||||
#.#.#.###.#####################.#############.###.#.#.#####.###.#.#.#.###.###.#####.#######.#.#####.#.#####.#######.#.###.#.#.###.#######.#.#
|
||||
#.#...#.#.#.....#...#.....#...#.....#.......#.....#...#.....#.#...#.#...#.........#.....#...#.....#.#...........#...#.#...#.#...#.........#.#
|
||||
#.#.###.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#####.###.#.#####.###.#.#.#######.#########.#.#######.#.#######.###.#.#####.#######.###.###.###.#
|
||||
#.#...#...#...#.#.#.#.#.#...#.#...#...#.........#...#.......#.....#.#.#.....#.........#...#.....#.....#...#.#...#.....#.......#.#.......#...#
|
||||
#.#.###.#####.#.#.#.#.#.#####.###.#############.###.#.#####.#.#####.#.#.#.#########.#######.#.###.###.#.#.###.#######.#######.#.#######.#.###
|
||||
#.#...#...#...#.#.#...#...#...#...#.....#.....#.#...#.....#.......#.#.#.#.....#.....#.....#.#...#.#...#.#.....#.....#.........#.#...#...#.#.#
|
||||
#.#.#.#.###.###.#.#######.#.#.#.###.#.#.###.#.#.#.#.###.#.#.#####.#.#.#.#####.#.###.#.###.#.###.#.#.###.#######.#.#.###########.#.#.#####.#.#
|
||||
#.#.#...#.....#.#.#.....#.#.#.#...#.#.#.#...#.#...#.....#.#.....#.#.#.#...#...#.#...#.#.#...#.#...#...#...#.....#.#.......#.....#.#.......#.#
|
||||
#.###.#.#.###.#.#.#.#.###.#.#.###.#.#.#.#.#########.###########.###.#.###.#.###.#####.#.###.#.#######.###.#.#####.#######.#.#####.#########.#
|
||||
#.....#.#.#...#...#.#...#...#...#.#.#.#.#.......#.....#.......#.....#.....#...#...#...#...#...........#.#...#...#.....#.#...#.....#.........#
|
||||
#.###.#.#.###.#########.#####.###.###.#.#####.#.#.###.#.#####.###.###########.###.#.###.###.#####.###.#.#####.#######.#.###.#.#########.###.#
|
||||
#.#.#.#.#.#...........#.....#...#.....#...#...#.....#.#.#...#.......#...........#...#.......#.....#.#.....#.#.......#.#.....#...#.........#.#
|
||||
#.#.#.#.#.#.#########.#.#.#####.#########.#.#######.#.#.#.#.#.#####.#.#########.#####.#####.#.#####.#####.#.#.#.###.#.#########.###.###.#.#.#
|
||||
#.#.#.#.#...#.......#.#.#...#.....#.....#.#.....#...#.#.#.#...#.#...#.#.#.......#.#...#.......#.....#.#...#...#...#.#.........#...#.#.....#.#
|
||||
#.#.#.#.#########.#.#.#####.#.#####.###.#.#.###.#.###.#.#.#####.#.###.#.#.#######.#.###.###.###.###.#.#.###.#.###.#.#########.###.#.###.#.#.#
|
||||
#.#.#.#...........#.#.......#.....#...#...#...#...#.#...#.....#...#...#.#.....#.......#.....#...#...#.#...#...#.....#.......#.#...#.....#.#.#
|
||||
#.#.#.#######.#.#.#.#######.#.###.###.#######.#####.#######.#.#.###.###.#####.#.###.#.#####.###.#.###.###.#####.#.#.#.###.#.#.#.#######.#.#.#
|
||||
#...#...#...#...#.#.....#.#.#.#...#.#...#...#.#.......#...#.#.#.....#.......#...............#...#.......#.....#.#...#.#...#.#...#.......#...#
|
||||
#.#.#.#.#.#######.###.#.#.#.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#######.#####.#.#.#.#.#.#.#####.#####.#########.#.#.#####.###.#####.#####.###.#
|
||||
#.......#...#...#.....#...#...#.#.....#...#.#...#...#...#...#.#.....#...............#...#.........#.#.......#...#.......#.#...#...........#.#
|
||||
#####.###.#.#.#.#.###.#######.#.#.###.#####.#####.#.#########.#.###.#.#.#.#.#.#.#.#.#.###.#######.###.###.#.#############.###.#.#######.#.#.#
|
||||
#.....#...#.#.#.......#.......#.....#...#.#.#...#.#.....#.....#.#...#.#.#.#.#...#.#...#...#.....#...#...#.#.....#...#...#.....#.#.......#.#.#
|
||||
#.###.#####.#.###.#####.#########.#.###.#.#.#.#.#.#####.#.#####.#####.#.###.###.#.#####.###.#####.#.#.###.#.###.###.#.#.#.#####.#.#####.#.#.#
|
||||
#.#.......#.#...#.......#.....#...#.#...#.#...#...#.....#...#...#.....#...#.#.....#...#.#.#.......#...#...#.....#...#.#.#.....#...#.....#.#.#
|
||||
#.#.#####.#.#.###.#########.#.#.#.#.#.###.#########.#######.#.###.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###.###.#####.###.#.#####.#####.###.#.#.#
|
||||
#...#...#.#...#...#.......................#...#...#.......#.#.....#.......#...#.....#.#.#.......#...#...#.........#...#.#.....#.........#...#
|
||||
#.#####.#.###.#.#.#.#.###.###.#.#.#.#####.#.#.#.#.#.#####.#.#.#####.#####.#####.#####.#.#.#######.#.#.#####.#####.#.###.#.#####.#####.#.#.###
|
||||
#.#...#.#...#.#.....#...................................#...#...#...#.........#...#.#...#.#.....#...#.#.........#.#.#.#.#.....#.#...#...#...#
|
||||
#.#.#.#.###.#####.#.###.###.#.#.#.###.#.###.#.#.###.#.#########.#####.#######.#.#.#.#######.###.#.#.#.#.###.###.###.#.#.#####.###.#.#.#.###.#
|
||||
#S..#.....#.............#.......#.....#.....#.......#.................#.........#...........#.....#.#.........#.......#...........#...#.....#
|
||||
#############################################################################################################################################
|
15
day16/input_test.txt
Normal file
15
day16/input_test.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###.#
|
||||
#.....#.#...#.#
|
||||
#.###.#####.#.#
|
||||
#.#.#.......#.#
|
||||
#.#.#####.###.#
|
||||
#...........#.#
|
||||
###.#.#####.#.#
|
||||
#...#.....#.#.#
|
||||
#.#.#.###.#.#.#
|
||||
#.....#...#.#.#
|
||||
#.###.#.#.#.#.#
|
||||
#S..#.....#...#
|
||||
###############
|
17
day16/input_test2.txt
Normal file
17
day16/input_test2.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
#################
|
||||
#...#...#...#..E#
|
||||
#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#...#...#.#
|
||||
#.#.#.#.###.#.#.#
|
||||
#...#.#.#.....#.#
|
||||
#.#.#.#.#.#####.#
|
||||
#.#...#.#.#.....#
|
||||
#.#.#####.#.###.#
|
||||
#.#.#.......#...#
|
||||
#.#.###.#####.###
|
||||
#.#.#...#.....#.#
|
||||
#.#.#.#####.###.#
|
||||
#.#.#.........#.#
|
||||
#.#.#.#########.#
|
||||
#S#.............#
|
||||
#################
|
84
day16/task.txt
Normal file
84
day16/task.txt
Normal file
@@ -0,0 +1,84 @@
|
||||
--- Day 16: Reindeer Maze ---
|
||||
It's time again for the Reindeer Olympics! This year, the big event is the Reindeer Maze, where the Reindeer compete for the lowest score.
|
||||
|
||||
You and The Historians arrive to search for the Chief right as the event is about to start. It wouldn't hurt to watch a little, right?
|
||||
|
||||
The Reindeer start on the Start Tile (marked S) facing East and need to reach the End Tile (marked E). They can move forward one tile at a time (increasing their score by 1 point), but never into a wall (#). They can also rotate clockwise or counterclockwise 90 degrees at a time (increasing their score by 1000 points).
|
||||
|
||||
To figure out the best place to sit, you start by grabbing a map (your puzzle input) from a nearby kiosk. For example:
|
||||
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###.#
|
||||
#.....#.#...#.#
|
||||
#.###.#####.#.#
|
||||
#.#.#.......#.#
|
||||
#.#.#####.###.#
|
||||
#...........#.#
|
||||
###.#.#####.#.#
|
||||
#...#.....#.#.#
|
||||
#.#.#.###.#.#.#
|
||||
#.....#...#.#.#
|
||||
#.###.#.#.#.#.#
|
||||
#S..#.....#...#
|
||||
###############
|
||||
There are many paths through this maze, but taking any of the best paths would incur a score of only 7036. This can be achieved by taking a total of 36 steps forward and turning 90 degrees a total of 7 times:
|
||||
|
||||
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###^#
|
||||
#.....#.#...#^#
|
||||
#.###.#####.#^#
|
||||
#.#.#.......#^#
|
||||
#.#.#####.###^#
|
||||
#..>>>>>>>>v#^#
|
||||
###^#.#####v#^#
|
||||
#>>^#.....#v#^#
|
||||
#^#.#.###.#v#^#
|
||||
#^....#...#v#^#
|
||||
#^###.#.#.#v#^#
|
||||
#S..#.....#>>^#
|
||||
###############
|
||||
Here's a second example:
|
||||
|
||||
#################
|
||||
#...#...#...#..E#
|
||||
#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#...#...#.#
|
||||
#.#.#.#.###.#.#.#
|
||||
#...#.#.#.....#.#
|
||||
#.#.#.#.#.#####.#
|
||||
#.#...#.#.#.....#
|
||||
#.#.#####.#.###.#
|
||||
#.#.#.......#...#
|
||||
#.#.###.#####.###
|
||||
#.#.#...#.....#.#
|
||||
#.#.#.#####.###.#
|
||||
#.#.#.........#.#
|
||||
#.#.#.#########.#
|
||||
#S#.............#
|
||||
#################
|
||||
In this maze, the best paths cost 11048 points; following one such path would look like this:
|
||||
|
||||
#################
|
||||
#...#...#...#..E#
|
||||
#.#.#.#.#.#.#.#^#
|
||||
#.#.#.#...#...#^#
|
||||
#.#.#.#.###.#.#^#
|
||||
#>>v#.#.#.....#^#
|
||||
#^#v#.#.#.#####^#
|
||||
#^#v..#.#.#>>>>^#
|
||||
#^#v#####.#^###.#
|
||||
#^#v#..>>>>^#...#
|
||||
#^#v###^#####.###
|
||||
#^#v#>>^#.....#.#
|
||||
#^#v#^#####.###.#
|
||||
#^#v#^........#.#
|
||||
#^#v#^#########.#
|
||||
#S#>>^..........#
|
||||
#################
|
||||
Note that the path shown above includes one 90 degree turn as the very first move, rotating the Reindeer from facing East to facing North.
|
||||
|
||||
Analyze your map carefully. What is the lowest score a Reindeer could possibly get?
|
||||
|
121
day9/code.py
Normal file
121
day9/code.py
Normal file
@@ -0,0 +1,121 @@
|
||||
import sys
|
||||
sys.path.append('../aoclib')
|
||||
|
||||
from aoclib import Input
|
||||
|
||||
class FS(object):
|
||||
def __init__(self, s: str):
|
||||
self._initial = s
|
||||
counter = 0
|
||||
self.blocks = []
|
||||
for i in range(0, len(s), 2):
|
||||
file_len = int(s[i])
|
||||
self.blocks.extend([counter for _ in range(file_len)])
|
||||
|
||||
if i+1 >= len(s):
|
||||
break
|
||||
|
||||
space_len = int(s[i+1])
|
||||
self.blocks.extend(['.' for _ in range(space_len)])
|
||||
counter += 1
|
||||
self.free = 0
|
||||
|
||||
def __str__(self):
|
||||
return ''.join([str(n) for n in self.blocks])
|
||||
|
||||
def reset(self):
|
||||
self.__init__(self._initial)
|
||||
|
||||
def defragment(self):
|
||||
for i in range(len(self.blocks)-1, -1, -1):
|
||||
if self.blocks[i] == '.':
|
||||
continue
|
||||
next = self._next_free()
|
||||
if not next or next >= i:
|
||||
break
|
||||
# swap
|
||||
self.blocks[next], self.blocks[i] = self.blocks[i], self.blocks[next]
|
||||
|
||||
def smart_defragment(self):
|
||||
files = self._get_files()
|
||||
for file in files:
|
||||
for span in self._get_spans():
|
||||
file_len = file[2] - file[1]
|
||||
span_len = span[1] - span[0]
|
||||
if (span[1] - 1) >= file[1]:
|
||||
break
|
||||
if file_len <= span_len:
|
||||
self.blocks[span[0]:span[0]+file_len] = [file[0] for _ in range(file_len)]
|
||||
self.blocks[file[1]:file[2]] = ['.' for _ in range(file_len)]
|
||||
break
|
||||
|
||||
def solve1(self):
|
||||
self.reset()
|
||||
self.defragment()
|
||||
return sum([x[0] * int(x[1]) if x[1] != '.' else 0 for x in enumerate(self.blocks)])
|
||||
|
||||
def solve2(self):
|
||||
self.reset()
|
||||
self.smart_defragment()
|
||||
return sum([x[0] * int(x[1]) if x[1] != '.' else 0 for x in enumerate(self.blocks)])
|
||||
|
||||
|
||||
|
||||
def _next_free(self, start=0) -> int:
|
||||
try:
|
||||
i = self.blocks.index('.', start)
|
||||
return i
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _get_files(self):
|
||||
files = []
|
||||
|
||||
end, start = 0, 0
|
||||
|
||||
i = len(self.blocks)-1
|
||||
while i > 0:
|
||||
if self.blocks[i] == '.':
|
||||
i -= 1
|
||||
continue
|
||||
end = i+1
|
||||
start = i
|
||||
for j in range(i, -1, -1):
|
||||
if self.blocks[j] != self.blocks[i]:
|
||||
break
|
||||
start = j
|
||||
files.append((self.blocks[i], start, end))
|
||||
i = start-1
|
||||
|
||||
return files
|
||||
|
||||
def _get_spans(self):
|
||||
spans = []
|
||||
start = self._next_free()
|
||||
while start:
|
||||
end = start
|
||||
for i in range(start+1, len(self.blocks)):
|
||||
if self.blocks[i] != '.':
|
||||
break
|
||||
end = i
|
||||
spans.append((start, end+1))
|
||||
start = self._next_free(end+1)
|
||||
|
||||
return spans
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#s = Input('input_test.txt').raw()
|
||||
s = Input('input.txt').raw()
|
||||
|
||||
fs = FS(s)
|
||||
|
||||
#part 1
|
||||
#print('part 1:', fs.solve1())
|
||||
|
||||
#part 2
|
||||
print('part 2:', fs.solve2())
|
1
day9/input.txt
Normal file
1
day9/input.txt
Normal file
File diff suppressed because one or more lines are too long
1
day9/input_test.txt
Normal file
1
day9/input_test.txt
Normal file
@@ -0,0 +1 @@
|
||||
2333133121414131402
|
72
day9/task.txt
Normal file
72
day9/task.txt
Normal file
@@ -0,0 +1,72 @@
|
||||
--- Day 9: Disk Fragmenter ---
|
||||
Another push of the button leaves you in the familiar hallways of some friendly amphipods! Good thing you each somehow got your own personal mini submarine. The Historians jet away in search of the Chief, mostly by driving directly into walls.
|
||||
|
||||
While The Historians quickly figure out how to pilot these things, you notice an amphipod in the corner struggling with his computer. He's trying to make more contiguous free space by compacting all of the files, but his program isn't working; you offer to help.
|
||||
|
||||
He shows you the disk map (your puzzle input) he's already generated. For example:
|
||||
|
||||
2333133121414131402
|
||||
The disk map uses a dense format to represent the layout of files and free space on the disk. The digits alternate between indicating the length of a file and the length of free space.
|
||||
|
||||
So, a disk map like 12345 would represent a one-block file, two blocks of free space, a three-block file, four blocks of free space, and then a five-block file. A disk map like 90909 would represent three nine-block files in a row (with no free space between them).
|
||||
|
||||
Each file on disk also has an ID number based on the order of the files as they appear before they are rearranged, starting with ID 0. So, the disk map 12345 has three files: a one-block file with ID 0, a three-block file with ID 1, and a five-block file with ID 2. Using one character for each block where digits are the file ID and . is free space, the disk map 12345 represents these individual blocks:
|
||||
|
||||
0..111....22222
|
||||
The first example above, 2333133121414131402, represents these individual blocks:
|
||||
|
||||
00...111...2...333.44.5555.6666.777.888899
|
||||
The amphipod would like to move file blocks one at a time from the end of the disk to the leftmost free space block (until there are no gaps remaining between file blocks). For the disk map 12345, the process looks like this:
|
||||
|
||||
0..111....22222
|
||||
02.111....2222.
|
||||
022111....222..
|
||||
0221112...22...
|
||||
02211122..2....
|
||||
022111222......
|
||||
The first example requires a few more steps:
|
||||
|
||||
00...111...2...333.44.5555.6666.777.888899
|
||||
009..111...2...333.44.5555.6666.777.88889.
|
||||
0099.111...2...333.44.5555.6666.777.8888..
|
||||
00998111...2...333.44.5555.6666.777.888...
|
||||
009981118..2...333.44.5555.6666.777.88....
|
||||
0099811188.2...333.44.5555.6666.777.8.....
|
||||
009981118882...333.44.5555.6666.777.......
|
||||
0099811188827..333.44.5555.6666.77........
|
||||
00998111888277.333.44.5555.6666.7.........
|
||||
009981118882777333.44.5555.6666...........
|
||||
009981118882777333644.5555.666............
|
||||
00998111888277733364465555.66.............
|
||||
0099811188827773336446555566..............
|
||||
The final step of this file-compacting process is to update the filesystem checksum. To calculate the checksum, add up the result of multiplying each of these blocks' position with the file ID number it contains. The leftmost block is in position 0. If a block contains free space, skip it instead.
|
||||
|
||||
Continuing the first example, the first few blocks' position multiplied by its file ID number are 0 * 0 = 0, 1 * 0 = 0, 2 * 9 = 18, 3 * 9 = 27, 4 * 8 = 32, and so on. In this example, the checksum is the sum of these, 1928.
|
||||
|
||||
Compact the amphipod's hard drive using the process he requested. What is the resulting filesystem checksum? (Be careful copy/pasting the input for this puzzle; it is a single, very long line.)
|
||||
|
||||
Your puzzle answer was 6310675819476.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
|
||||
--- Part Two ---
|
||||
Upon completion, two things immediately become clear. First, the disk definitely has a lot more contiguous free space, just like the amphipod hoped. Second, the computer is running much more slowly! Maybe introducing all of that file system fragmentation was a bad idea?
|
||||
|
||||
The eager amphipod already has a new plan: rather than move individual blocks, he'd like to try compacting the files on his disk by moving whole files instead.
|
||||
|
||||
This time, attempt to move whole files to the leftmost span of free space blocks that could fit the file. Attempt to move each file exactly once in order of decreasing file ID number starting with the file with the highest file ID number. If there is no span of free space to the left of a file that is large enough to fit the file, the file does not move.
|
||||
|
||||
The first example from above now proceeds differently:
|
||||
|
||||
00...111...2...333.44.5555.6666.777.888899
|
||||
0099.111...2...333.44.5555.6666.777.8888..
|
||||
0099.1117772...333.44.5555.6666.....8888..
|
||||
0099.111777244.333....5555.6666.....8888..
|
||||
00992111777.44.333....5555.6666.....8888..
|
||||
The process of updating the filesystem checksum is the same; now, this example's checksum would be 2858.
|
||||
|
||||
Start over, now compacting the amphipod's hard drive using this new method instead. What is the resulting filesystem checksum?
|
||||
|
||||
Your puzzle answer was 6335972980679.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
Reference in New Issue
Block a user