From d7d7837c1f8663f37d78b9fed8242fc6a80bb550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Fri, 22 Dec 2023 21:26:13 +0100 Subject: [PATCH] 2021 day 9. --- src/holt59/aoc/2021/day9.py | 41 +++++++-- src/holt59/aoc/inputs/holt59/2021/day9.txt | 100 +++++++++++++++++++++ src/holt59/aoc/inputs/tests/2021/day9.txt | 5 ++ 3 files changed, 141 insertions(+), 5 deletions(-) diff --git a/src/holt59/aoc/2021/day9.py b/src/holt59/aoc/2021/day9.py index 992bf35..850131d 100644 --- a/src/holt59/aoc/2021/day9.py +++ b/src/holt59/aoc/2021/day9.py @@ -1,13 +1,44 @@ import sys -from collections import defaultdict -from dataclasses import dataclass +from math import prod -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 -answer_1 = ... +answer_1 = sum(values[i][j] + 1 for i, j in low_points) print(f"answer 1 is {answer_1}") # part 2 -answer_2 = ... +answer_2 = prod(sorted(len(basin(point)) for point in low_points)[-3:]) print(f"answer 2 is {answer_2}") diff --git a/src/holt59/aoc/inputs/holt59/2021/day9.txt b/src/holt59/aoc/inputs/holt59/2021/day9.txt index e69de29..3a934e3 100644 --- a/src/holt59/aoc/inputs/holt59/2021/day9.txt +++ b/src/holt59/aoc/inputs/holt59/2021/day9.txt @@ -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 diff --git a/src/holt59/aoc/inputs/tests/2021/day9.txt b/src/holt59/aoc/inputs/tests/2021/day9.txt index e69de29..6dee4a4 100644 --- a/src/holt59/aoc/inputs/tests/2021/day9.txt +++ b/src/holt59/aoc/inputs/tests/2021/day9.txt @@ -0,0 +1,5 @@ +2199943210 +3987894921 +9856789892 +8767896789 +9899965678