day10 - unpolished

This commit is contained in:
Stefan Harmuth 2024-12-10 09:18:31 +01:00
parent 34801a6490
commit 7fc22b858a
8 changed files with 171 additions and 0 deletions

78
day10.py Normal file
View File

@ -0,0 +1,78 @@
from collections import deque
from tools.aoc import AOCDay
from tools.coordinate import Coordinate
from tools.grid import Grid
from typing import Any
def find_nine(grid: Grid, start: Coordinate) -> int:
q = deque([start])
seen = set()
nines = set()
while q:
pos = q.popleft()
cur_val = grid.get(pos)
if cur_val == 9:
nines.add(pos)
continue
if pos in seen:
continue
seen.add(pos)
for next_pos in grid.getNeighboursOf(pos, includeDiagonal=False):
if grid.get(next_pos) == cur_val + 1:
q.append(next_pos)
return len(nines)
def find_nine_ways(grid: Grid, start: Coordinate, next_val: int = 1) -> int:
if next_val == 9:
return sum(1 for x in grid.getNeighboursOf(start, includeDiagonal=False) if grid.get(x) == 9)
else:
return sum(
find_nine_ways(grid, x, next_val + 1)
for x in grid.getNeighboursOf(start, includeDiagonal=False)
if grid.get(x) == next_val
)
class Day(AOCDay):
inputs = [
[
(1, "input10_test2"),
(2, "input10_test3"),
(4, "input10_test4"),
(3, "input10_test5"),
(36, "input10_test"),
(644, "input10"),
],
[
(3, "input10_test7"),
(81, "input10_test"),
(1366, "input10"),
],
]
def parse_input(self) -> Grid:
return Grid.from_data(self.getInput(), default=0, translate={"[0-9]": int})
def part1(self) -> Any:
grid = self.parse_input()
trail_heads = [
Coordinate(x, y) for y in grid.rangeY() for x in grid.rangeX() if grid.get(Coordinate(x, y)) == 0
]
return sum(find_nine(grid, trail) for trail in trail_heads)
def part2(self) -> Any:
grid = self.parse_input()
trail_heads = [
Coordinate(x, y) for y in grid.rangeY() for x in grid.rangeX() if grid.get(Coordinate(x, y)) == 0
]
return sum(find_nine_ways(grid, trail) for trail in trail_heads)
if __name__ == "__main__":
day = Day(2024, 10)
day.run(verbose=True)

53
inputs/input10 Normal file
View File

@ -0,0 +1,53 @@
78760345801298896321001230110976301870134341034545687
69671236989367765410678345221885432963233452127632796
10589987670456001323569896336797010154324569498101845
23478678561032132124428987445788923245013478545613932
12034569432983045034310176596657654356932103456754301
06123765301874126965223456780345543267843212769861212
67610854322965437876104320691275676189732301890770023
98545921013456946766782111234987089078721450321981167
23434530145697854325693003435672128569670965492843298
10127647654787765014234512345965432154589876782194587
01018758943439890143109671236878941003432106543087656
10129667872108743232198780987567650012343267890989943
78734531231065654651015697898232109871054154901077830
69632340345676544543234506701145696780567063212566321
12541256543989035672103215012098785991278343103455410
01230167612108120780043454123210034876369752101769511
43456898909817431891012763204987121765459861019878700
32197899768746532982367874215672100894312772923467011
44089432897655673675498985365523456783203689876554322
43476521784554984566780189474310327894104501298458943
32562340603443295432110276589210016765067898347457654
41001456512782106798023345341232108778754106756346655
58989867425691065897654301250343419689603245891258743
67670198304781478654761298765430589576512231230969512
50501078213210569763890181056521677433443100945872402
41432189362387659812083212347893478922109811876721321
32343276651096543202144307438982560013078320125630430
21054565789823430143435698729861011224565410432145561
78769834658712894354998705610154398348901565589006776
69876765541006765267888214567863287657652651671217889
56945454532214890122379823098978101098343780980368923
47834503654323012001456702112109780123210891276456914
32322112567410163100014511003498898194541201345567805
01012012398789654011723621014586767087687632436679876
01201034498218765327898734765675432101598543567987015
32789125567309014456783349898987013216967845678872126
45694876323418123242124456787016524567856934569543034
34543945410567032103023456689145434787643021078676545
67432876509878749854510965670236543694532122189089496
78761789034569858987627874321987231243231821672102387
89450321123988567546596765345698100340100910565201256
44321450210676875654587034276765657654327823434389855
32340565012363966703456123189894398789016434325670765
01051876765454567812890012007654289430145045410581678
98762998898323234906721063218723176521032156921892569
45101237012210105415430874349812067898149867865433454
36788946543101076010987965456701098778928766456521043
29897654218760187623875478309898105667810610347876542
10898743009451296874566329214321234354320521298985031
01734542112321345987017812105670985012131494567874120
45629610321030996506323901078987876543012383456923454
30018723478945887215489765212985432692105672321012765
21167634569876774345677894303876501783234561030109876

8
inputs/input10_test Normal file
View File

@ -0,0 +1,8 @@
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732

4
inputs/input10_test2 Normal file
View File

@ -0,0 +1,4 @@
0123
1234
8765
9876

7
inputs/input10_test3 Normal file
View File

@ -0,0 +1,7 @@
...0...
...1...
...2...
6543456
7.....7
8.....8
9.....9

7
inputs/input10_test4 Normal file
View File

@ -0,0 +1,7 @@
..90..9
...1.98
...2..7
6543456
765.987
876....
987....

7
inputs/input10_test5 Normal file
View File

@ -0,0 +1,7 @@
10..9..
2...8..
3...7..
4567654
...8..3
...9..2
.....01

7
inputs/input10_test7 Normal file
View File

@ -0,0 +1,7 @@
.....0.
..4321.
..5..2.
..6543.
..7..4.
..8765.
..9....