diff --git a/2021/09/09.py b/2021/09/09.py new file mode 100644 index 0000000..4c44c34 --- /dev/null +++ b/2021/09/09.py @@ -0,0 +1,69 @@ +hmap = {} +with open("input.txt") as f: + lines = f.read().split('\n') + height = len(lines) + width = len(lines[0]) + for i, line in enumerate(lines): + for j, n in enumerate(line): + hmap[(i,j)] = int(n) + +def adjacent(i,j): + adjacent = [ + (i-1,j), + (i+1,j), + (i,j-1), + (i,j+1) + ] + return [ (i,j) for (i,j) in adjacent if (-1 < i < height) and (-1 < j < width) ] + +# part 1 +lowpoints = [] +for i in range(height): + for j in range(width): + current = hmap[(i,j)] + neighbors = [hmap[(x,y)] for (x,y) in adjacent(i,j)] + if current < min(neighbors): + lowpoints.append(current) +risk = 0 +for h in lowpoints: + risk += (h + 1) +print(risk) + +# part 2 +basins = [] +allpoints = set( + [ (i,j) + for i in range(height) + for j in range(width) + ] +) +def which_basin(i,j,hmap): + """ + Identifies the basin that (i,j) is part of. + """ + basin = set() + visited = set() + q = [(i,j)] + + while q: + (x, y) = q.pop() + if (x,y) not in visited: + visited.add((x,y)) + if hmap[(x,y)] != 9: + basin.add((x,y)) + neighbors = [] + q += [(m,n) for (m,n) in adjacent(x,y) if (m,n) not in visited] + return basin + +identified = set() +for i in range(height): + for j in range(width): + if (i,j) not in identified: + basin = which_basin(i,j,hmap) + for point in basin: + identified.add(point) + basins.append(basin) +three_biggest_basins = sorted([len(basin) for basin in basins], reverse=True)[0:3] +from math import prod +part2 = prod(three_biggest_basins) +print(part2) \ No newline at end of file diff --git a/2021/09/input.txt b/2021/09/input.txt new file mode 100644 index 0000000..5355069 --- /dev/null +++ b/2021/09/input.txt @@ -0,0 +1,100 @@ +9874321292198975458901239986401245679543234590129878943236789999863345679876578901978456778910976423 +9965434789987854346893498793212357898753125789998767954345789987651266799765457899854234567899997910 +9876545695986543234989987654323569999654247999898757895456793499540656989755348999765195678978999891 +5988856894597654345678999876435678998765348998789546796569894568932349876543257998976989989569998789 +6799768943498785656789456987545989579876456789689235689878965679899499986432167577989878993468987678 +7999879894679896777892349987656993467987598996563124598989876799767989997621012356798767892389898465 +9899998796789987888921298798867894678998789876432012457899987987655678998543143456789659910198764343 +5789997689891298999210987689988965789469898765432123678989999876543568987654554567998799791999953212 +4579886578910989434991396578999879894398979876543267989567789998712456999875665678929898679899999923 +6797675487899876526889987467899989999987654998665348995434678939901267899988776899019976535678987899 +8965452346789865435679876578999894698996543239765467894324579129894345678999988992198765324579876798 +9894321257894976576789987889698743987989992123986567975434598999789966989129999789349896545698654567 +6789432345995987987999999996569654596577889965987678996945997876567897891098945689467987657976543456 +5678943489989998998999898995459875987465679896799789879899876743456789932987334999978998798989942465 +4599976568978989999998767889310989876323568789989898965789985432579899949996229879899869939399861254 +7678997679767869899987656778921299975212345679765977896895796431298989898765109768789654321298750123 +8799398989756556799786545568942349954326656789763256789954989910987676789843297655678969572359842354 +9892129996545445988654335459959498765545767899854345898769878899886545998764987643789998765498756878 +3932099987632339876543212367898999876787878998765656789899765798765434899979843212456999879699867889 +2393989998741024987543101234567899987899989659878767893987654597654323789998732104767898998789978998 +1989878999843266898754215345788969998930296545989979992098543129973212679876543212378987679992989456 +9876767998764356999865326456799457999321989432599898789198762098765323567999698345679996565894599568 +8765659899875667899987547567892398998949878921398779564989654599896464778998796456789876434789798999 +8954345799986878989798658789943456987894567892987654453578966789987975689999987967894989545678987989 +7543234689498989877659879999654667976789779999876543212346987894398986799989598978943498956989876567 +5432129795239998767545990198765678985678989998987662103567899999459997898765439989912987967898965475 +6554578894346899843235689239876789876789697897998743215678912398967998999875323499899986898987893234 +7685678965456987656123579345987899998993466976899764376789904987899899789996784789798765989656999645 +9796789876767999764334989956798999659201245998939878988897899896789653678987895679679989878537898997 +9898998989878998765445996898989998995313359899910989999976798765678932489899998789543298767423957989 +3959987693989989876567895789978987989924599789892997896545987654687893599767999896532129854212345678 +2348799432397879997678964598767576567895978656789765987659976743556789678956799974321045965102389789 +0147698921236568998989532349754321389999767545699986798798765432345678989347899865432129873216578995 +1234597990123459219297543498765410499997656434987897899979987631496789690157899976559998765323679343 +2349986789245569109109694589879531459876542123456789999762198542387899532378989987698759865445789212 +3498965678976678998999887678998952378997683012567890198951019653498978943489678998797643986776789101 +4987654549797789456789998789987967456789794324778932987943434966579769894596559879898759997887893212 +5698643235679896567899989899876798767898765446989993986799659899789656789689349765929898999998985543 +6987654456998997678999978989765989898959898767897989985678969768997647898789234954310987894319976754 +7898765769897898899998765678954578989431939878956879874789498756795438999892129865499876789423987976 +8999879898756789910987654567893465678910123989543768953499319897976656796931012976987654597975699987 +9998989987645699991296423458921234567891234599532359767988998969988768895432323987899543456797893499 +9997698765436987889999101568953345798932359698763579899876797655399879996654435699998932345689932349 +9876579876545696877898242679854656799985498987654578999754986543212989989766545998767891234579321098 +9775454987679985656987656898765767899876997899786799999643497654523599978987699897658799545678932987 +8654323498798974345798987999976898954989876899999899878932198976654569867899989654347678968799899876 +6543212349987661256999098998989999743299987988899989768921019899767698754568979792124567899896799765 +7684102478999543569892129897991987654368999876789878959432398798998979843979757989235678998975678976 +8878523567987654799789246796510199875456798765198766698943497656789567959897646879345789597643467897 +9865439798998786987678957895423469976788899854097954577894989899993469869765434567976898489932345699 +6976598989459897976568978976534567897899998762196543456789878978932346979887123578987897567896556789 +5987987978969989875459899987676699989998999973987654567899955767891237898765012356899998989997678998 +4699876567898776984345789998787988878987998765698765678998643456899998999654323589999989794649789026 +3498765456799665695656898999899867569876649976799876789987654667978789998765537678989976543239893245 +2239875349896543469868976989998754398764534989890987997699768778965678999877645789667899694398999656 +1099874235789662356989765678987654239973223498921298986543979899354567895988789897545798989987698787 +2987663124578954967999854579998766345985104567892349897932989943213678934599996936435987879543459898 +3976543023679869899898743498989897459876715779954556789893497654101289025698654321029976768932346999 +9865432146789998789797654987678989968987896898767967896789589864262568934989896543198765457891097989 +9876563237899987698689765976565679899998997999979878985679678987653478949876987654239985376789989674 +5988678945999876576578996985434598778999698987989989764568989698754567899545799865349873265679976543 +4399989856789986432456789543129987669899899996592099543456996549765678978426578976598762123457897632 +3297798767899987964589899653298976545799998789439978432349897639876989764212376987679854348967898544 +9975689899978998875678978969987895434598998677998764321298789321987899543101345698889975457898999656 +8764789934569899876789467998976789321987797566899954210965678939998998654213456899999876567899789767 +9643489946698797997892348987675699490196542365789854399899789998999897654338767998754988678925678979 +8776567897997676798951257896544568989984321234698769988678991987898798965445698999543298789434567899 +9887879999876545679432345986432345678976542345799998776589890976765679896676789989694349897547698998 +6998999989987858989543456796543456789987653456967897655458789865454598779788895878989459987698789476 +4239998975498767897654568987994579896498764878943498432345678986323989568999934567979598998789892345 +5345987654329878969795979099876689965349876989432987651234789875459876479989423989867987989899954756 +5467898743210989978976789123997791094234997896521098862345699986599765345678964698754346678999865677 +6568929854332397899987898236789892989375698997432129877657789997989876234599879989543234598987987789 +7679019965465456794598997545899919879986999989643334998779996899878987945789998767434123457896598892 +8989998987698767893459989656898939767899898879965455799892025698767998986898987654321012356789439993 +9797897698799988976569878967897898656789767767896566893943934599748799998967899976542153467899546789 +5556986439999799897898769898956984345697656856789677892969895987635689869456789987654767578998958893 +4349987746997689789997657799439876767987643447899789999898789997546789954347894398786777679997899932 +4298987659876545678976546689323998998988532138967992398765678999869899875956901239898898789876689321 +9987598767989756789683634578939889319875421012347890239854789998978954989898913398999989897664598910 +8976459889899867897542123456998778929876732123456789398753678987989763098789994987999878976543767891 +7984341996789978965432012359894567999998543234687893987654567896799862198697889996789767989432349943 +6543210345678989997543143598763456789497654356798901999865678965679654297576678945678959876543998964 +8765431256789899987656264598654567892398767467899219865976789954778976986464569123799643988999897895 +9996932345698798999894347698765678901299978578989397654989899853567897985323678934895432499987656989 +9889893476789577899975498979878789312987989989679986543296998762456789875412357895996591991298545678 +9765789687895456789989569656989897993976593096578997410145699851267899965101345976789989789987656789 +9896999798954345878999678948997976889998432123479994321234987540348999754212468897997875679898787898 +9987979899999234569898789139986565678987643234567989932355699631259398767323456789966764598769898957 +8998967999887956779789894398765454568998754645679878895456798743459219975456567898755323987654929346 +7899543597676799898657999999654323456799876896998768789578899854598934989567778999544212598732101245 +6789432976545678987545298898743212347913987939876456699789967967987895698779899989432103496543212356 +5678943987435899998932187799993201237895698924954334578994359879896789789989999978999312987695323467 +3567899876596910976543345698789513456987789939890123689965212996785678996490198969988924598987834678 +2778943989989921297655456898689434589998999899789235789754329985634579987321987858877895989898945689 +3469642498979892398986987996578995678919988689699946899866598764323789996469976646566789977659867792 +6578931987656789989497899975434989789109876534587897896977899876545678987998765431345699867345978893 +7989649896648799875398989764325678997219765423466798954989965998656789599869896542476789643236989954 +8999798765536689953239579875537889765329899312345899653297543569767894469953987656789898754547897995 +9212987654324567892123457986756999976434987501234999867898321349898902398654599877899999865679976789 \ No newline at end of file diff --git a/2021/09/sample.txt b/2021/09/sample.txt new file mode 100644 index 0000000..610bad9 --- /dev/null +++ b/2021/09/sample.txt @@ -0,0 +1,5 @@ +2199943210 +3987894921 +9856789892 +8767896789 +9899965678 \ No newline at end of file diff --git a/2021/12/12.py b/2021/12/12.py new file mode 100644 index 0000000..eb40868 --- /dev/null +++ b/2021/12/12.py @@ -0,0 +1,42 @@ +adj = {} +with open("input.txt") as f: + for line in f.read().split('\n'): + [node1, node2] = line.split('-') + if node1 not in adj: + adj[node1] = set() + if node2 not in adj: + adj[node2] = set() + if node1 in adj and node2 in adj: + adj[node1].add(node2) + adj[node2].add(node1) + +search = [['start']] +paths = [] +while search: + path = search.pop() + current = path[-1] + for cave in adj[current]: + if cave == 'end': + paths.append(path+[cave]) + elif cave.isupper() or cave not in path: + search.append(path+[cave]) + +print(len(paths)) + +search = [(['start'], True)] +paths = [] + +while search: + path, flag = search.pop() + current = path[-1] + for cave in adj[current]: + if cave == 'end': + paths.append(path+[cave]) + elif cave == 'start': + continue # skip this case bc we can't go back + elif cave.isupper() or cave not in path: # big cave or unvisited, + search.append((path+[cave],flag)) # so explore further + elif flag: # we still haven't visited a cave twice, + search.append((path+[cave],False)) # so go there and explore, but remember we've used our exception + +print(len(paths)) \ No newline at end of file diff --git a/2021/12/input.txt b/2021/12/input.txt new file mode 100644 index 0000000..012ca7e --- /dev/null +++ b/2021/12/input.txt @@ -0,0 +1,21 @@ +KF-sr +OO-vy +start-FP +FP-end +vy-mi +vy-KF +vy-na +start-sr +FP-lh +sr-FP +na-FP +end-KF +na-mi +lh-KF +end-lh +na-start +wp-KF +mi-KF +vy-sr +vy-lh +sr-mi \ No newline at end of file diff --git a/2021/12/sample1.txt b/2021/12/sample1.txt new file mode 100644 index 0000000..898cd56 --- /dev/null +++ b/2021/12/sample1.txt @@ -0,0 +1,7 @@ +start-A +start-b +A-c +A-b +b-d +A-end +b-end \ No newline at end of file diff --git a/2021/12/sample2.txt b/2021/12/sample2.txt new file mode 100644 index 0000000..ef30b81 --- /dev/null +++ b/2021/12/sample2.txt @@ -0,0 +1,10 @@ +dc-end +HN-start +start-kj +dc-start +dc-HN +LN-dc +HN-end +kj-sa +kj-HN +kj-dc \ No newline at end of file diff --git a/2021/12/sample3.txt b/2021/12/sample3.txt new file mode 100644 index 0000000..da6e083 --- /dev/null +++ b/2021/12/sample3.txt @@ -0,0 +1,18 @@ +fs-end +he-DX +fs-he +start-DX +pj-DX +end-zg +zg-sl +zg-pj +pj-he +RW-he +fs-DX +pj-RW +zg-RW +start-pj +he-WI +zg-he +pj-fs +start-RW \ No newline at end of file