diff --git a/2021/day15/input b/2021/day15/input new file mode 100644 index 0000000..8c28487 --- /dev/null +++ b/2021/day15/input @@ -0,0 +1,100 @@ +1968464916112191391611281151919845361299153415891198154268959132641114694817612267218838462583491879 +1525711216133142195619415736511844811196712782556111378172222212112846932272411896119155816624819212 +2143631162361912221922237361391393339328231912118313179363187197511971887961771617331732194239586227 +2521625314121441899413948951224935654611261168644252173433111379118144918591261352845133931111363211 +3419116395171316754263144619316121119141789791156176133491119172413835731812143128339462157211714832 +4524964153247428319314129912911299537321149133376523131712395239297611385551521232187248866732262314 +3711569922572112311111231381621569819613115824152623211149153892114351938526483513994131899221246184 +9372218211227923291116514163647131281542651458928544319272115333829653212283218213572346151271148314 +7252439612436928721197324142761165133345614518725427643227211291261848311822364911669219447123922134 +3124222285338327514911622121557639192231775721619241455811912419714186296111754892144116269518316174 +5113431512416811186162119586184219513154115654732512834832944622331272212673422211413215473168541114 +8918761263115111432573131417344914456815121312151143626751572997964931367144931111322221919431184539 +2315112868211215119123391436214851892132438117198411361732935213389219321913111286356991581617112311 +8213439278426518916841321158915338871751157511511512411526362572186581353252493251161642321331319238 +3814648212312217732224215365116422292413315931251182667691212141251192261129314133611341111121183625 +1632153282115827199494219478516848819429439421146162464381572116271251127191323111921221781821561229 +2964993982275411123511321114194422113815922449458312261195939424115899991846139318433141623175699422 +3185911132222225882128911425231711193121162114993245158813396433493132142156112353212191881311222243 +2597419176117872623372257547963288114359198274123111217111515117134582471213835379443482187231716921 +1156128452723117148178522621611191136116514111135527613613518738572952213915169837111312119876125721 +8232332331311591318439824111216968834143211892318778976161332121429244151178389953221281123441111113 +2321966882423191161139314598311457179989165191214751117411811412971757518116913242314292957532412983 +5176118365231113228253112189957159351158513473428824359199457932137469329915812169531133176131715211 +7651131457228491985123334121791142316224345141412388137921745363819214421812123122111415171218423211 +3462391917297997812111394356232391771437391419149441431342312821371511368751471167152824426236119229 +4673185152112592819181865591613249119154112282337391342192979211292112114221121795165339253212146534 +4234957215119118622851122121288184214119123159675381781924921392139651738861641324135449311387528341 +5219623922594391372919236718332186133284187961852865774318269243651818144191524996159111313242918421 +7163473192149725221212261161211451212213312989111233514933331991243913291411726828442295192918336141 +9122121522342158355114591229418954411929582133466671811425725985313519796543513459188229991411919219 +1792321481168175515583211914355119425236113438217255811327548818533439118112225647992411894311221942 +6235961521362362331146957118417134195221372115174333562114577921453125915976317129248126331176514522 +1315322174651119927411853861313118318521851637512417779171141549468491216918151477196121583981631755 +3941512442333131733964938141131332181187172121911135919752637339812991513231411212596255623611113539 +4221411783221181622948692351164312639511911592521128119211739941244427471111892925571131192573439919 +1179196115212251261629513312991614794161983441112259261137256511915723118319332739142153922123143117 +4231711395216212819875423823212711161196111827533224932197941859731111442899614524483228527617386378 +3918246317283515329158129197374311321211714111832117967254272122116518731213341117948182114211224847 +2923818147359817264926711219234482591493138155147251119914129565392391271176111137476683621547214217 +1961381361734232123843911261247113619353513993323262598118181179514371422883549929231394584165211832 +8514111722951326162613191813346231172214441618781818362213597235884114841316169219182995612563233821 +1365732542831964731216313272619283721242171451815356121331113311623984432353118721938919562191451111 +2822939361319198155191312193217341726142263417942332122271866654334531117199731412186215315146877927 +1111454359813524123761969515729922437711147235265451492183352723992156214643584182711682754226151263 +2977234336552255461792636551916673213921564434121847731352815474153152211858923499436981622823142348 +1292116131548485823181118519834219267112994518194931139252194529133187389422531711195274926683516371 +4911191361188766113552115172265138293791321889212169645451869671991412161748416412312612856411243186 +1317171178186646329441152426228813263661198721323128341111326617211726491932473921125915111382162198 +1185112194772921899819164227599216312811921688121293758432648221118311682142211822211438864221158113 +4542913914281291351283313249391816267798761311622914884369113218553165256697957132933611942925155261 +4494431146129213351534929615418612524813688423431931398914972311152141513154988119419614671251497111 +9623781247216311684114814216291279421121111133322113443333261553655145212128395757147123414315523289 +5321158321169288211432611617339989115915699522248123124468123741112916981113251279212342226718119572 +3474561211372227212241133695812932236239356434494845611611717313598811351571451453513995711211431833 +8112861219127115311321991221176277548738413781747479942776125183321215594862116111775124614156181132 +4962761786242336114125151132266391316125134395336121111216174625111123821122755643641261588223833941 +4198791539415131939214719356144111462292386514121424212196639132151862123635134187812272994532554718 +4598231121311615611917161815226991221461112165262118216421252531152312223292442184491316842394264422 +6239922321177627293489322115395696297817393991218913471197221121271165841514312479855362119521884969 +1129114429442542251149132165119424383113411921471754121121214319237527583191735143212464219732392112 +1651231731856554191881141112413451251172218323241241662928111731271512822142161717213123118613613958 +4298112947145118999241658624222911212348432972424642451312255991211325333571286324481199944628374392 +2761216221111199295216838121731331169992911428481193317316457213225122995618911861614181331811151242 +4129378113472816127482433662823529814712133421698191248182391953151395229111932982436827873314521119 +1591561822112619623231519742542149141689376414216738233473231111332139316451913219341561438221397874 +3927251379311586676539123444146199319136274351291218146428138112816811112992452159548481616112158814 +9412114216661113751181221282182423133313612415161191211331589216172472359989471911138112692441934134 +2223225313925912191371119962371229122143953359523119746452516412252465926211817191299112619176196217 +1346158412389516131916991159321171727892967134931688661131511835391329289921283696234673819265582175 +1522461841192567446612342131217417151616649916394676931424334131645279316115831134257161411114339316 +2918271212143975123191492589111415816122658247911522114911751889713836923119752121583492316934222783 +2335822567917124981467893564192215151353297122123129212261122319967914112586924611514581622672125171 +5262413541889891181929911314153212728724291811815629411322228137335534214312958167399318199354579921 +9149219511885776119163152492427744911141613211121114715212251229291241137566488625114213223212151148 +1181157118724317911213711358719188263574762499564922141213462748611178379228521173951691928154154412 +3213211513627293819429164224237122932214895451454614242621317522471165136382297232654725159128311114 +4484732912114211553149811921421351313119141219414157143619532522811639911376191311111137331991152913 +1262277731165542116111282477417427466617265711322672119177456936322531711241935314283119112931271932 +8214487123411419964129118129254247918442832196374131848261379849412854112626271519928536312355117313 +1832123949338931145313411211931537496181431511219182279284211859131676523211671295264677294311151228 +1113331952811742119875195316449591311261618916825111517632719398311919141292213725149811219913814311 +2183432231291181121671961945221637251379192299935371391132618747113147599983122713361339112821364318 +1241549642129923318162112113915337861432341899721968116332321232337371311172285444693912311175852346 +6943425149126562165738742539622666221429574222528297996511562211917121698495184521192211121392891925 +3953911963215814161264113995511685544211797184319295131476823118129122192826662468114521116322441136 +6116346345651121664941991121121311413328951552314256113457889116194327118619533491348898152231235194 +1953441191249162186952321591361417162859225311123722633854535156121327211121914511731241246272342113 +7116541293114612191134544214846918511122329126131849271259313569415571115134141815215312113894888172 +2129212414488722182372398711847475194188444222531918316111338511967921142317492122141511831529112878 +7299971148111133521137477211291393539983146478512354451435418118599937354197118811351825126562471838 +3221753129222942924161143512659426819184812455272916714683133423132121128513161681618521251882367126 +7514395613933634141312211145243355553271117322417232972862411211881312311684714718127539314131613781 +3755164181884737344157241191441917282435985872268369128914871211246781489161614827272731214553141912 +1213151346851191527143987929944819185122171119431928512718341126514385311264471629211116125461472177 +7945119111919535234662132621944641673221471944118212216712891297182783944744711859271919395411258142 +2833123313293199844711314521199719361191931438661222212228993111111497111395122621712972371139939619 +4321293489656698521653282414295113191986252764513991554331562212629412621454111114271569299317726181 +3131241189731335231214319872311119789921512392816123597387128412667119915386414217195129492221913482 +7136132513132281639712311618231211268291831313425125189328161681993353119711511196639111622963441181 +4516311181565123296194779671456321611329615324411382743419111219951224135411334613154142168712942561 diff --git a/2021/day15/main.go b/2021/day15/main.go new file mode 100644 index 0000000..322b022 --- /dev/null +++ b/2021/day15/main.go @@ -0,0 +1,144 @@ +package main + +import ( + "fmt" + "os" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +var cave h.CoordByteMap +var debug bool + +func main() { + debug = len(os.Args) > 1 && os.Args[1] == "--debug" + inp := h.StdinToStringSlice() + cave = h.StringSliceToCoordByteMap(inp) + fmt.Println("# Part 1") + part1() + fmt.Println("# Part 2") + part2() +} + +var visited map[h.Coordinate]bool +var distance map[h.Coordinate]int +var curr h.Coordinate + +func part1() { + distance = make(map[h.Coordinate]int) + visited = make(map[h.Coordinate]bool) + for k := range cave.Field { + visited[k] = false + distance[k] = h.MAX_INT + } + curr = h.Coordinate{ + X: 0, + Y: 0, + } + distance[curr] = 0 + visited[curr] = true + + work() + fmt.Println(distance[h.Coordinate{X: cave.Width - 1, Y: cave.Height - 1}]) +} + +func work() { + // Find the unvisited node with the smallest tentative distance + var c h.Coordinate + cDist := h.MAX_INT + for k, v := range distance { + if visited[k] { + continue + } + if v < cDist { + cDist = v + c = k + } + } + + check := getNeighbors(c) + for _, v := range check { + if !visited[v] { + if b, ok := distance[v]; !ok || b > distance[c]+getInt(v) { + distance[v] = distance[c] + getInt(v) + } + } + } + visited[c] = true + + // if we still have unvisited nodes, recurse + if moreWork() { + work() + } +} + +func moreWork() bool { + for i := range visited { + if visited[i] == false { + return true + } + } + return false +} + +func part2() { + // Build the full cave + expandCave(5) + part1() +} + +func getInt(c h.Coordinate) int { + return int(cave.Opt(c, '0')) - int('0') +} + +func getNeighbors(c h.Coordinate) []h.Coordinate { + var ret []h.Coordinate + for _, n := range []h.Coordinate{c.North(), c.East(), c.South(), c.West()} { + if v := cave.Opt(n, 'Z'); v != 'Z' { + ret = append(ret, n) + } + } + return ret +} + +func expandCave(size int) { + oH, oW := cave.Height, cave.Width + for i := 1; i < size; i++ { + for y := 0; y < oH; y++ { + for x := 0; x < oW; x++ { + ny := (oH*i + y) + prev := h.Coordinate{ + X: x, + Y: (oH*(i-1) + y), + } + pv := cave.Get(prev) + var v byte + if pv == '9' { + v = '1' + } else { + v = pv + 1 + } + cave.Put(h.Coordinate{X: x, Y: ny}, v) + } + } + } + for y := 0; y < cave.Height; y++ { + for i := 1; i < size; i++ { + for x := 0; x < oW; x++ { + nx := (oW*i + x) + prev := h.Coordinate{ + X: (oW*(i-1) + x), + Y: y, + } + pv := cave.Get(prev) + var v byte + if pv == '9' { + v = '1' + } else { + v = pv + 1 + } + cave.Put(h.Coordinate{X: nx, Y: y}, v) + } + } + } +} diff --git a/2021/day15/testinput b/2021/day15/testinput new file mode 100644 index 0000000..ab80887 --- /dev/null +++ b/2021/day15/testinput @@ -0,0 +1,10 @@ +1163751742 +1381373672 +2136511328 +3694931569 +7463417111 +1319128137 +1359912421 +3125421639 +1293138521 +2311944581