Advent of code Day 9

I’m very satisfied for my solution today.
This problem fits very well with AdamsTowel matrixes.
You can see a video description of my solution at
(https://www.youtube.com/watch?v=tSTDJlICst8)
Some highlights of the solution:
(1)

(new=that.with(row=…


This content originally appeared on DEV Community and was authored by Marco Servetto

I'm very satisfied for my solution today.
This problem fits very well with AdamsTowel matrixes.
You can see a video description of my solution at
(https://www.youtube.com/watch?v=tSTDJlICst8)
Some highlights of the solution:
(1)

(new=that.with(row=\row-1\) catch error Any _ void \add(new))

This is making a new coordinate and adding it to the list under construction. If the coordinate would be outside of the matrix, an error is raised and ignored.
(2)

sizes=I.List()( for i in Range(seeds.size()) 
    \add(Match.Count()(for v in matrix \add(v==i+100I)))
    )

Here we taint the seeds using a number much bigger than any height.
The number can be tracked back as the corresponding seed index.

(3)

GrowBasin={class method Void(mut Matrix matrix)=(
  for c in matrix.coords() var h in matrix {
    if h>=9I return void
    return for ci in Near(c) if matrix.val(ci)>99I return h:=matrix.val(ci)
    }

To grow a basin one step, we search for all the coordinates c of height h; if there is a ci near c that is tainted with a basin number, we taint the current height too.

Here is the full code.

reuse [L42.is/AdamsTowel]

Fs = Load:{reuse[L42.is/FileSystem]}

Matrix = Collection.matrix(I.List,row=100I, col=100I)

Coords = Collection.list(Matrix.Coord)

Split={class method S.List (S that)=\()(//should be in adamsTowel
  for c in that.replace(S"" with=S",").split(S",")\add(c)
  )}
Near={class method Coords (Matrix.Coord that)=Coords()((
  (new=that.with(row=\row-1\) catch error Any _ void \add(new))
  (new=that.with(row=\row+1\) catch error Any _ void \add(new))
  (new=that.with(col=\col-1\) catch error Any _ void \add(new))
  (new=that.with(col=\col+1\) catch error Any _ void \add(new))
  ))}
GrowBasin={class method Void(mut Matrix matrix)=(
  for c in matrix.coords() var h in matrix {
    if h>=9I return void
    return for ci in Near(c) if matrix.val(ci)>99I return h:=matrix.val(ci)
    }
  )}
NeedsMore={class method Bool(read Matrix matrix) = 
  Match.Some()(for e in matrix \add(e<9I))  
  }
PopMax ={class method I (mut I.List that)=(
  var i = 0I
  var e = 0I
  for ei in that, ii in Range(that.size()) if ei>e (
    e:=ei, i:=ii
    )
  that.remove(i)
  e
  )}

MainPart2 = (
  input = Fs.Real.#$of().read(\"input")
  matrix = Matrix(\()(
    for s in input.split(S.nl()) for si in Split(s) \add(I(string=si))
    ))
  seeds = Coords()(for c in matrix.coords() h in matrix (
    min = Match.All()(for ci in Near(c) \add(matrix.val(ci)>h))
    if min \add(c)
    ))
  for c in seeds, i in Range(seeds.size()) (matrix.set(c val=i+100I))
  while NeedsMore(matrix=matrix) ( GrowBasin(matrix=matrix) )
  sizes=I.List()( for i in Range(seeds.size()) 
    \add(Match.Count()(for v in matrix \add(v==i+100I)))
    )
  v1=PopMax(sizes)
  v2=PopMax(sizes)
  v3=PopMax(sizes)
  Debug(v1*v2*v3)//882942
  )


This content originally appeared on DEV Community and was authored by Marco Servetto


Print Share Comment Cite Upload Translate Updates
APA

Marco Servetto | Sciencx (2021-12-09T10:03:34+00:00) Advent of code Day 9. Retrieved from https://www.scien.cx/2021/12/09/advent-of-code-day-9/

MLA
" » Advent of code Day 9." Marco Servetto | Sciencx - Thursday December 9, 2021, https://www.scien.cx/2021/12/09/advent-of-code-day-9/
HARVARD
Marco Servetto | Sciencx Thursday December 9, 2021 » Advent of code Day 9., viewed ,<https://www.scien.cx/2021/12/09/advent-of-code-day-9/>
VANCOUVER
Marco Servetto | Sciencx - » Advent of code Day 9. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/12/09/advent-of-code-day-9/
CHICAGO
" » Advent of code Day 9." Marco Servetto | Sciencx - Accessed . https://www.scien.cx/2021/12/09/advent-of-code-day-9/
IEEE
" » Advent of code Day 9." Marco Servetto | Sciencx [Online]. Available: https://www.scien.cx/2021/12/09/advent-of-code-day-9/. [Accessed: ]
rf:citation
» Advent of code Day 9 | Marco Servetto | Sciencx | https://www.scien.cx/2021/12/09/advent-of-code-day-9/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.