diff options
author | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
---|---|---|
committer | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
commit | 8777ff071f7bb37631baa7b6717ad29961e50911 (patch) | |
tree | 6d59c4ed58e454b960339c3d1151f0a879e8d7cb /aoc2021/day-09 | |
parent | 6156a9ef7be4012063a042aafb4e9b0d7eadde8e (diff) | |
download | gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.tar.gz gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.zip |
sorting by language
Diffstat (limited to 'aoc2021/day-09')
-rw-r--r-- | aoc2021/day-09/day-09.livemd | 138 | ||||
-rw-r--r-- | aoc2021/day-09/day-09.rkt | 59 | ||||
-rw-r--r-- | aoc2021/day-09/input.txt | 100 |
3 files changed, 0 insertions, 297 deletions
diff --git a/aoc2021/day-09/day-09.livemd b/aoc2021/day-09/day-09.livemd deleted file mode 100644 index 3b984a5..0000000 --- a/aoc2021/day-09/day-09.livemd +++ /dev/null @@ -1,138 +0,0 @@ -<!-- vim: set syntax=markdown: --> -<!-- livebook:{"persist_outputs":true} --> - -# Advent of Code 2021, Day 9 - -## Short problem summary - - - -**Part 1.** Find the total "risk level" of all the local minima on a relief map, represented by a -100 $\times$ 100 array of integers from 1 to 9. Only orthogonal neighbors count. -The risk level is the elevation plus one. - -**Part 2.** Find the product of the areas of the three largest basins on the relief map. Basins are regions -bordered by the edges of the map or by points with elevation 9. -Again, only orthogonal neighbors count. - -## Setup - -I'm using [Nx](https://github.com/elixir-nx/nx/tree/main/nx#readme) tensors -since this problem will require a lot of arbitrary indexing. - -```elixir -Mix.install([ - {:nx, "~> 0.1.0-dev", github: "elixir-nx/nx", sparse: "nx", override: true} -]) -``` - -```output -:ok -``` - -Bringing in the data as a new 2D tensor: - -```elixir -floor = - with {:ok, data} <- File.read("input.txt") do - data - |> String.trim() - |> String.split("\n") - |> Enum.flat_map(&String.graphemes/1) - |> Enum.map(&String.to_integer/1) - |> Enum.chunk_every(100) - |> Nx.tensor(names: [:y, :x]) - end -``` - -```output -#Nx.Tensor< - s64[y: 100][x: 100] - [ - [7, 6, 5, 9, 9, 9, 1, 0, 9, 8, 9, 9, 9, 8, 7, 6, 5, 7, 9, 9, 1, 0, 1, 2, 9, 8, 7, 9, 9, 9, 9, 8, 7, 6, 4, 3, 2, 1, 2, 3, 4, 5, 9, 8, 7, 4, 3, 4, 5, 5, ...], - ... - ] -> -``` - -## Part 1 - -For a given coordinate $(x, y)$, we want to examine its orthogonal neighbors, -but only the ones that exist within the map. - -```elixir -defmodule Day09.Part1 do - def neighbors({x, y}) do - [{x + 1, y}, {x - 1, y}, {x, y + 1}, {x, y - 1}] - |> Enum.filter(fn {x, y} -> x >= 0 && x < 100 && y >= 0 && y < 100 end) - end -end -``` - -```output -{:module, Day09.Part1, <<70, 79, 82, 49, 0, 0, 7, ...>>, {:neighbors, 1}} -``` - -Now scan the whole array to check each cell's neighbors, -and return the "risk level" for each local minimum, then accumulate the sum. - -```elixir -risk_level = - for x <- 0..99, - y <- 0..99, - reduce: 0 do - acc -> - Day09.Part1.neighbors({x, y}) - |> Enum.all?(fn {xn, yn} -> floor[x][y] < floor[xn][yn] end) - |> if(do: acc + Nx.to_number(floor[x][y]) + 1, else: acc) - end -``` - -```output -591 -``` - -## Part 2 - -Now we need to recursively walk outwards from each previously-unwalked point -until we can't walk any further. An agent will keep track of the visited points. - -```elixir -defmodule Day09.Part2 do - def walkable?({x, y} = coords, tensor, pid) do - Nx.to_number(tensor[x][y]) < 9 && not Agent.get(pid, fn m -> Map.has_key?(m, coords) end) - end - - def walk_it(coords, tensor, pid) do - if walkable?(coords, tensor, pid) do - Agent.update(pid, fn m -> Map.put(m, coords, true) end) - - for c <- Day09.Part1.neighbors(coords) do - walk_it(c, tensor, pid) - end - |> Enum.reduce(1, fn x, acc -> acc + x end) - else - 0 - end - end -end -``` - -```output -{:module, Day09.Part2, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:walk_it, 3}} -``` - -```elixir -{:ok, tracker} = Agent.start_link(fn -> %{} end) - -for x <- 0..99, y <- 0..99 do - Day09.Part2.walk_it({x, y}, floor, tracker) -end -|> Enum.sort(:desc) -|> Enum.take(3) -|> Enum.reduce(fn x, acc -> acc * x end) -``` - -```output -1113424 -``` diff --git a/aoc2021/day-09/day-09.rkt b/aoc2021/day-09/day-09.rkt deleted file mode 100644 index d550a9e..0000000 --- a/aoc2021/day-09/day-09.rkt +++ /dev/null @@ -1,59 +0,0 @@ -#lang racket - -(require threading - "../../jj-aoc.rkt") - -(define sea-floor-data - (for/vector ([l (in-lines (open-day 9))] #:unless (equal? l "")) - (~>> l string->list (map (λ~>> ~a string->number)) list->vector))) - -(define max-rows (vector-length sea-floor-data)) -(define max-cols (vector-length (vector-ref sea-floor-data 0))) -(define-values (min-rows min-cols) (values 0 0)) - -(define (vector2d-ref vec coord) - (match-define `(,r ,c) coord) - (~> vec (vector-ref r) (vector-ref c))) - -(define (adjacent coords) - (match-define `(,r ,c) coords) - `((,(add1 r) ,c) (,(sub1 r) ,c) (,r ,(add1 c)) (,r ,(sub1 c)))) - -(define (valid-coordinate coord) - (match-define `(,r ,c) coord) - (and (>= r min-rows) (< r max-rows) (>= c min-cols) (< c max-cols))) - -;; part 1 -(define (lowest-point? vec coord) - (for*/and ([neighbor (in-list (adjacent coord))] #:when (valid-coordinate neighbor)) - (< (vector2d-ref vec coord) (vector2d-ref vec neighbor)))) - -(for*/sum ([r (in-range min-rows max-rows)] [c (in-range min-cols max-cols)] - [coord (in-value `(,r ,c))] - #:when (lowest-point? sea-floor-data coord)) - (add1 (vector2d-ref sea-floor-data coord))) - -;; part 2 -;; all the basins are bordered by the edges or by ridges of elevation 9, -;; so it's not really necessary to start at a low point -(define walked (make-hash)) - -(define (walkable? vec coord) - (and (< (vector2d-ref vec coord) 9) (not (hash-has-key? walked coord)))) - -(define (walk-the-basin vec coord) - (cond - [(walkable? vec coord) - (hash-set! walked coord 'visited) - (add1 (for/sum [(neighbor (in-list (adjacent coord))) #:when (valid-coordinate neighbor)] - (walk-the-basin vec neighbor)))] - [else 0])) - -(define basins - (for*/list ([r (in-range min-rows max-rows)] - [c (in-range min-cols max-cols)] - [coord (in-value `(,r ,c))] - #:when (walkable? sea-floor-data coord)) - (walk-the-basin sea-floor-data coord))) - -(~> basins (sort >) (take 3) (apply * _)) diff --git a/aoc2021/day-09/input.txt b/aoc2021/day-09/input.txt deleted file mode 100644 index 322b31f..0000000 --- a/aoc2021/day-09/input.txt +++ /dev/null @@ -1,100 +0,0 @@ -7659991098999876579910129879999876432123459874345567890126678999876588975767899323456989767899432101 -8998789987898765467891239868899876541012398765123456789234567897643467894656798912399878948678944212 -9867678976789878598954398756789997632343459873234569898765679999856578943547987893989865434567894323 -7654567895896989679767499847994398755456579987656778969876892198767989652129876889876976725678965734 -8767678954345698799898987659943219876577694598787889545987931019879996543298965679965987438789876799 -9898789921239799898989899798794399987688965679898993534598942123989987654987654567894596549899989987 -4969999892398989987876789987689989998789898789979992123989653934598798965976543678943987678999999876 -3459898789497878976545678986567878999895679898768989239879869896789659879865432469432198799998789765 -2498765699976567995434389765434567899934989977655679356965998789896545989865321258921019999987678954 -3987654398765456789321238979325456799329898766434798999876797698987432198754310347894329789876567893 -4696543219876967998910147998214345678998789954323987689999977567898543479885541456789498678988678932 -5987654423987878987521236987601234567891678893219876567898765479987654567976632367899987569899789321 -6798767834698989997432345698524568698932456789398765466989876567898765689987545478959768456789893210 -7899898945679499876545656997434578799843569892987654345678989679999876799798658569349654367878964322 -8977999498789398987896769876545689998767678931999869656789698789999987987698767895498743212567895433 -9656789329898987899929879987676790199898989949877998767896559899878998977569978999987654323458986654 -8797995434987896989434989798989891987919499896765569888921434998767789865452989998998795434569997765 -9979899549876785678945995639698999876329398764354456999990125899545678954321299987899987895678949878 -9865678998765434567899894324567892985498999863212347898989436798434599876210389996789999998789434999 -7654567899896647978989789212459921296987899954393478987678945987324879965341567895679891019998959865 -8543878901987656789765678901268933459876999895989569658567959876412568897432467894599789923987898654 -9212389919898767897654577892999545998765798789878978945456899954323456789576578923989679899876789543 -9543457898769879986543456789889959876543987676567899432345789976436567897697989219878565678965678932 -8754568987654989765432347898767899989432976543456964321012498987545679998989892109867434699764567891 -9867689298543299986541034987656789998743989654677895632134987898696789989878789298754324789543488989 -1978792129654569987732129874543567897654799965789976853239876799989999878765678999865455697601245678 -0989893098765678998653298763212375789795679878994989966398754889879898765464569899976566789212346789 -9898954239987789998784987654301234699989789989873398765459765678968789884323456789987677894323456898 -8777895345698999899895698976214345789878999997762129876589896789345678965434567999898989976564568967 -7656976457899019767987899765423456789569899876543299987678987891234569876545898998769394987875679456 -6546899568992198657898939878534677893456789987654989898789398932347678999856789889843212398986989345 -5435688979879932545679929989665788902569991298779878789899299543458789798767895678932101569997890123 -4323567899767891434589898998776899543457899999898768655978987654569899679878934569643219878998921254 -6764579987658910123456797879887899656568978789987653234567998785678998532989545678954399989999432765 -7875689998767891234567896569998998967989767698798767145678999896789987643498756789765989992987543876 -8976796899878932545678997998769467899899854599659898657789985959897898784569867899876978931098954987 -9697895799989873467889989999652348999799965678943939768999664543956789895679878979989867892129895698 -4598954569899964578999878987643499997689978789432129879998543212345678976989989459899756789298789789 -3499543798798765699998767898984987843579899996583235989987632105468789987899992398789898999987678991 -4985432987679876789999658989876986532498798889874346798798743236589893498989891987678989459986568990 -9876521296567987899876545878989875421987656778965498987669654587679999999876789898547678998765456789 -9876432987678998998765434569998767410996545567896569896556965689789987898865676789435589765432369999 -3987543498799549769886325679987654329877434456789698789439879789899976987764545678923459879321287899 -4599656789989432458997212568999769498764321298999987688956989897999899876743236789212398998932456998 -9798767897678921367989323459998998999875210147899876567897891956789798765432145794301987897893569997 -8999878996569432349876534569987687898654321236789767456789932345679659976545012689419876896789878986 -7899989987458943499998765678976546789985434545678954345679543567789545987983234568998765645678989565 -6789199654347896589989876789987434579876545758789543237789654579895434499874356789329874234567893434 -5679298789756789678976987899874323459987859767899654345678965989965421298765667895499932125689932123 -4568999898969898789765698998765212398498869878998765656789879898965432399876878976987891034567894034 -3456789987898999899894329987654323987349978989999898767896999797896743987987899989896789123678985125 -2346899876767892999989212398765499876567989999899959878934987676989659876798945698765695434679876789 -1256998765458993498979903459876989987698999999789943989949898455678998765759899987654989545689989899 -4349879876569989986567894967989878999789989897678892099898789334569987674545678998743478957897696999 -5478968987678979765456999898998767879899876789546789298788699212989876543234567998932569768998565678 -6568956998789569876567897789999857867998975695437995987657598909898995432123459886521678989895434567 -7678939879892458987678956699896645456987764789567894696543467898767986321019598765432789496789323878 -8789998765901456798789545598775435349876543999698943495432356789656997432198969876547892345689439989 -9895987654312345789899434459654324234987875898789212989321234896549876545997656989856921234579998997 -6954398767433566789998921398743210125698986789894309878540145789432997859876543398767890123467897686 -5695999876544678998787892987654341234589987895999498765431236894320989767987432129898921294878987575 -4989899987698789987656789398765492395678998934998989896549898965999878979876421012969939989999098464 -2976789998789899876543789249876989989989239019887678987656789879878767898985432123457898679889198323 -9895678999894968987654590123989879978990129198764569998987894998765459987899543434568987546778987634 -8654547899923656798985891294598768969893298998765678999598912349821398795698976546699876435569876545 -6543336789012349899876789989987656756789987899976789989499909496543989654567898687987665523456987676 -7652125978923598987987899878996541234567896569899899978987898987859878965678998789876563212345698787 -6543234567894987876798998769876532345978943456799998767896987598998969898799989898765432101234569898 -7685346878999876765689987655989645567899212566778987658965398459987856789899978999876543212385789999 -8876798989998765434569976743498756789956401234568998789876999349876546899988769899987654525678999999 -9987899697989954323798765632359867899543212345679239899989899956997635789879656789999769434789898989 -4599996546567893212987654321235978998764637566989139999998789899986523998967545698999898945699787678 -3499989435457899433498765435348989689895547677891098988997655798765439897645634567899976896789676567 -2989978921345678994569876546757894578987678788992987677893234569898698765430125698999865689896543456 -9879868935458789989778987987868943989998989999789987566989123456989789876321234789997684578965432123 -8965657899599999878989998999979659899879596545678976435778934569879894987432545679876543467896673294 -7654545698989997569999999998989799789965432434789897324567895979964933498545789789987432456998784989 -6543234987978965478999899987899987656974321023498788212379976798763212379676899899997544567899999878 -5432129876568896567898789656789976549875432164589654323568987987654343456987895978999655778956798967 -4321019987456789678987698943495987678987543765678965454569998998765454567898954567898776789345987954 -5432998765345698989996587992976798789798765897789876875678999869876569878979943459979987893212986543 -6549879876234767899985456789897899997659897899897987996789998754997878989767892598965398994323497632 -7698765438123456789876323496789992198943998943956998987899987643298989997656999987890139989434598745 -8899954321014567899865212345678989989894989012345899498989998759109499998747988976789239878965987656 -9998765732125678999954345489789679878789876543456789349678939998912349876434567895678949867896798767 -4349876653346789998769497679898998765699998754678991234569019887893498765325658934589998758659999878 -4239999778659899899898989989967987854897899869789893965678998766799987654312349898699896549237899989 -9398999889767998789987978995459876543786789878898789896799987655678998895401256789798765432126789997 -8987899999879987678976567894398765432645699989997678789929876543767899986212868999899654321034599896 -7856789432989876569875456894298764321237989899986565678910987432347678997343479756998789532123456789 -6545678921098765454986587932129879854349876799867434568924596541234599987654569545689898743454567895 -5436889932129854323697698943234988765698765987654523567895987762345789598968678934578999654765678954 -4321968894298765634598789954445699878987654599763212348997898943579893459899789545678998765878789875 -5872456789349878745679897895768789989877653459894103456789999874568932598789897676789129878989899986 -8763878995467989856789976979879899998765432345989294567899899865679943987699998989899234989299999899 -7654567896568995977891234568999978919876521239878989678956756978989894976568999195978976790199899788 -8765698987878923988910123456789567923987432399765679789432347989998769876456789234567897892988698677 -9878789498999219899321256587995456894898643989813478997643458994987656987567894345679998999876545556 -2989893219879998765432347898932345995798759876524567899856969543499897897698987457989899298765434345 -1099954523467899876545456999545476789899899976435788923987897652101998998789876567897654349854321237 |