2021 day 9.

This commit is contained in:
Mikaël Capelle 2023-12-22 21:26:13 +01:00
parent 82fab771ab
commit d7d7837c1f
3 changed files with 141 additions and 5 deletions

View File

@ -1,13 +1,44 @@
import sys import sys
from collections import defaultdict from math import prod
from dataclasses import dataclass
lines = sys.stdin.read().splitlines() values = [[int(c) for c in row] for row in sys.stdin.read().splitlines()]
n_rows, n_cols = len(values), len(values[0])
def neighbors(point: tuple[int, int]):
i, j = point
for di, dj in ((-1, 0), (+1, 0), (0, -1), (0, +1)):
if 0 <= i + di < n_rows and 0 <= j + dj < n_cols:
yield (i + di, j + dj)
def basin(start: tuple[int, int]) -> set[tuple[int, int]]:
visited: set[tuple[int, int]] = set()
queue = [start]
while queue:
i, j = queue.pop()
if (i, j) in visited or values[i][j] == 9:
continue
visited.add((i, j))
queue.extend(neighbors((i, j)))
return visited
low_points = [
(i, j)
for i in range(n_rows)
for j in range(n_cols)
if all(values[ti][tj] > values[i][j] for ti, tj in neighbors((i, j)))
]
# part 1 # part 1
answer_1 = ... answer_1 = sum(values[i][j] + 1 for i, j in low_points)
print(f"answer 1 is {answer_1}") print(f"answer 1 is {answer_1}")
# part 2 # part 2
answer_2 = ... answer_2 = prod(sorted(len(basin(point)) for point in low_points)[-3:])
print(f"answer 2 is {answer_2}") print(f"answer 2 is {answer_2}")

View File

@ -0,0 +1,100 @@
9656799999432123456997667932987634348988901234569972123973212398999898743234578999878965345989412345
8746789898543235689879457891396521236567892347698763299865101987898789652123459998767893239874323458
7657896797654348798968346799987430123456943458987654987654219876747688943435698967656789098765434567
8767945698967859987653235678976521234567894569998785698765345965434567894566987654345678999886548698
9878936989898967998842123799988432345678965679989976789876459876123998999879876543234567999998657789
9989759876789899987651012989999654676789896899877899893987898765017899997989977532123456789879767899
9899898765698789998763123467898765699998789998766568932998989854146789876598765431012345678969878989
9787987974545698999873234578989876987899678987653456949899876543235678995439876532123478989654989678
7656896653432367897654348989678989876996589978321239898787987665366789989321987543234569996543294569
6542985432101256789865457892569998765989439865430149764656798878457899878910197655345699965432123468
7699876543232345699978767893478998654879921996521398943245679987678978567891298876758789899543234589
9989989854345467789989898976569999743467892987432987852134789998789765456789469987899898798954387678
8978998765676778990195999989678987654568909876549896721012878979999879345899878998963934567895698789
7867999876789989321234989999889998987678912987898765432124568965345998976901989029652123458986789899
6756889987899995435345678901999989598789329898969976543234567891299987899893499198743239567899899989
5345678998969876568856789899539976439899498789458987654545678910988956789789598999874358678989999878
3245588999654987678767898788998765323978987672387898765677989899877545695679987898765456789679878567
2133457899865698789898987657897654312369876521256789898788996789765421234989996799976768994598765456
1012345678976789897979998546789762101459985432345698969899345678973210199898765689989879323987654345
2123456789998899976567899434998979299998976543456987654901236789894391985795454767898989212398943234
3234567896789999875478996524567898987897897654567898783212345898765989674889323656987898901999892123
4365788945678998983239987678978987645656789765799969999476556969879876563479312345896567899898789012
5458899656789987899945699899989996534345679879893459878987768956989995412458923456789456998787678923
6867898767999876767896789954399897621236989997992398768998878945999989325567894567992368987654589434
9878939878999765456789899876998765432347895456789987657899999656789878934678985688954979998543678945
8989921989998754345678912999879876749456954397990198845679998769898969895989876999769899876452345796
7797890999989643234678993987764989898987895989891987932348999878987658789999987894998789985321234589
6646789899878932123456789896653299987898939876799876541256896989876545678999898923987679876542345678
5437898768967893236589898765432129876999329865789987652367955798767534567898769219876565987643456789
6545698657657789345679989654321098765695409784679898783458944987654323456789954329765434598754767893
8656798743245678956799878979434998654989598643566799854769432198765412577899895498979123799865698912
9778999894657889767898767898749876543878969432345689965878945987654323989976789987898945678977899101
9889899985769999878987656797657998652569654321298999876989656798768734896565699876787896789988956912
3998769876778954989898545679769876543478998910187892987998969989899656789454598765576997895699349893
2987645987889643498765434568978997655599987651456891098987898778949767895323459874445689934569298789
1985432398995721239897655678989999876789299732345993129986889654339878944413569763234796545678997689
9876543569954310398989767899199896989892196545456789298765678943210989432102698752125689698789976567
0987654567899451987679878954398765496989987656769899987654567894321296563213987643014578999898965456
1398875698998969876556989995459654345678998767898999874323476989432987674345987532123567899987894345
2989976789997898765443293989598743233459899898997898765212345678943498789456896543234598909876743234
9878989899876739874321012378987654102398799989875689654323466789994989898967997654345689412985432123
8767899956965323965632323569876543212399678976554678995567587999989878987898998765467897329876741012
7656789345953219876745456789987656323987567895443456789878678999876567896999019876569976535987899124
2345698999894923987896567896798767434598978987321234998989789998765458345892123987698998976899998934
1235987986789894998987878965439898765989989876510127897699898999854341237789239998987899989998987895
0129876545656789879598989896910999879876599765431456789534967898765210125678998999876787899987656989
9234995434345678965439196789891299989987678976542345678923456789874321434567897998765476799876545678
8945986325234799654321015798789989996598789989753658789212369892986476545698956899656365689995434569
7897995410125679965432123987678678965439894198764767994349498943996589656789346798743234578989323478
6789894323234567897693939876584589896520943299875879765598967899898698767893234989654125689873212369
5556789654356789998989899965423456789699954987976989876987656987769789978932129876543236798764201256
4345679965678893459876799854312345678987899876598991987976549876549890989543234989654345899854342345
1234567896789902398765689763201456899876798765439790999885434985432991299954345698769656789996456976
0145698919893212398764568954342567979985459886545699898766323976421289989895456799898767996987567987
1256789323994323459873487895656878967894398987676789797652109876534569876789567989989878945698878998
2345678999689934598932456976789989656789997699887897679843212987675698765678979878878989234589989129
3476789987567896987541237897895798787999896543999989498765323498789988654568998765767896545678999099
4587899976434679876532698998954679898998798432365679339865454679899876543678999544254898656789998978
7698999874323567998643459999543569999987654321234890123976565678989987654567898432123789767999987867
8789998765213898989654589987656998798798943210126789234597698789678998775689987521035678978999976756
9899987654345799879867678999899899677679854322287898949989989893459789987793298643146789989998865545
7998998785956789769878789934987766543598765643398967898765678932545679999894389743287894393987654334
5387899899897893456989897823496543432349876754679456987654567891234567894976569654398993212398710123
4286789998789954567896945312987932101345989867989347898943498992345698943987698795456789101239853234
3045789987698995778965432109899893232346899978993212349874679989456789932198999987567893234345954345
2134569865567989899879844398786789345456789989654324498765899978987896891099998998678954545467977656
3245698654456778999997656979645678959867898998995455569876998767898945692989987998789765656579998797
9959987843345569998989869868734567893978987687789569699989998756789434989876576899890998767898989898
7898765432123498987879998759823678991989876545678978789990987645678959878789445778921239898997778999
6989887753012397976867897642102899989998765434567899999892998534589998764621234567899399999876567895
5878999864129986545456789543234999878999543212678959898789876523569987653210123456998989998765456894
4569459954298865434345897676349898767987654104588969765698765434678998767821234767897778999987567893
3679598765987654321237898765498789656898983223467899878789897645678959898532345678976569896598678912
2998999879876543210136789877897676545789765434689999989895998656789544999643658789785458789439789323
9887891989987984334545678989987543235678978585693298793934569877894323498754769897654345678929899654
5776790994098875455676789796798763124569987678789109652123488989994212349865878989643234589214978969
4665689873129986566788997654569653023678998789893298743456567895789109456976989878510145679323469998
3534999865434597679899679932398762124589209899984349654567789964899298967987898764321234578934678987
2329898986597698789934567891987643236799919959875498765689891095998987998998949865986465678958789976
1019767899989999892123458910399754568899898945986789898789999989987876989219439877896568789769899895
2398756798978899975234567891239865678938767996797899999891298777896865878901921998989679899878998794
4987645987659798764356789932445978789324456789898989899930987656985434767899890129878989999989987643
9865434596545679875678899945566989893212345999999876789321986549876323457895791298967899998799875432
8754322987634789986789999896678997932101969899898765895439997998765412568934942987856789897698764321
7652101298945678997998988789789236893399898789799654976998998987654324569929899876545476789539875210
8743212349896789999887875678990145994988789677678967899876799398767434567898789986434365689123986929
9854529498789899898766434567891956789876643534567898998765989219976565678987678954321234678934999898
8765698987678998789654323458999897899985432423458999989854978901987676789997569854210176789549898787
9876987976589989698767454567898789989894321012567899876543467892398787899986498769321289998798766656
3989876645459876569878765698923678976789463123478999965432456799459898979876359998434799999897655545
2198765432398965456989876789434569765699954354589789654321347988998959567965219876545678988976543234
1099876541987654367896987898765678954578895455696599796542459977796543459894323987957989477895432123
2989987650199763212345698929987789543456789566789678989763598765689921298765434599768995356789921012
9879998753298654523456999019898897652569899678899789979878689874577890349876545699879654247698892123
8768999865349767684567899998769976543478998789979899869989789843456789456987656789989543123456789434
7656899965459888785678999896658987654567899894567988758899899652345678987898767896798762012348996545
4645788987567999898789998765347998765678987943459876546789998761234569999979898945679843234459987676
3434567987678932949899987643246899876799986212345986323499869810123478934567999637789954345678998789
2123456798889431234989998432143456989897695401234595434987654321234599123456798548898765456789239892
3012348999995432345678999543012345699976543212345976545698975432346789245678987656789876797890123921

View File

@ -0,0 +1,5 @@
2199943210
3987894921
9856789892
8767896789
9899965678