🏡 part2.nim

Day 09 part 2

const 
  CAVEW = 100
  CAVEH = 100

type
  Heightmap = array[CAVEW, array[CAVEH, int]]

var
  cave: Heightmap
  biggestBasins = newSeq[int](4)
  score = 1

proc readFile(fn: string) =
  var j: int
  for line in fn.lines:
    for i in 0..<line.len:
      cave[i][j] = ($line[i]).parseInt
    j.inc

proc `$`(x: Heightmap): string =
  for j in 0..<CAVEH:
    for i in 0..<CAVEW:
      result.add($(x[i][j]))
    result.add('\n')

proc fillBasin(x: var Heightmap, i, j: int): int =
  x[i][j] = 9
  result.inc
  if i+1 < CAVEW and x[i+1][j] < 9:
    result.inc(x.fillBasin(i+1, j))
  if j+1 < CAVEH and x[i][j+1] < 9:
    result.inc(x.fillBasin(i, j+1))
  if i>0 and x[i-1][j] < 9:
    result.inc(x.fillBasin(i-1, j))
  if j>0 and x[i][j-1] < 9:
    result.inc(x.fillBasin(i, j-1))

readFile("input.txt")

for j in 0..<CAVEH:
    for i in 0..<CAVEW:
      if cave[i][j] < 9:
        var bSize = cave.fillBasin(i, j)
        biggestBasins[0] = bSize
        biggestBasins = biggestBasins.sorted

for bSize in biggestBasins[1..3]:
  score *= bSize

Answer is: 987840

import strutils
import algorithm
import strformat
import nimib

const 
  DAY = 9
  PART = 2
  DOCNAME = fmt"d{DAY:02}p{PART}"

nbInit
nb.title = DOCNAME

nbText: fmt"""
# Day {DAY:02} part {PART}
"""

nbCode:
  const 
    CAVEW = 100
    CAVEH = 100

  type
    Heightmap = array[CAVEW, array[CAVEH, int]]

  var
    cave: Heightmap
    biggestBasins = newSeq[int](4)
    score = 1

  proc readFile(fn: string) =
    var j: int
    for line in fn.lines:
      for i in 0..<line.len:
        cave[i][j] = ($line[i]).parseInt
      j.inc

  proc `$`(x: Heightmap): string =
    for j in 0..<CAVEH:
      for i in 0..<CAVEW:
        result.add($(x[i][j]))
      result.add('\n')

  proc fillBasin(x: var Heightmap, i, j: int): int =
    x[i][j] = 9
    result.inc
    if i+1 < CAVEW and x[i+1][j] < 9:
      result.inc(x.fillBasin(i+1, j))
    if j+1 < CAVEH and x[i][j+1] < 9:
      result.inc(x.fillBasin(i, j+1))
    if i>0 and x[i-1][j] < 9:
      result.inc(x.fillBasin(i-1, j))
    if j>0 and x[i][j-1] < 9:
      result.inc(x.fillBasin(i, j-1))

  readFile("input.txt")

  for j in 0..<CAVEH:
      for i in 0..<CAVEW:
        if cave[i][j] < 9:
          var bSize = cave.fillBasin(i, j)
          biggestBasins[0] = bSize
          biggestBasins = biggestBasins.sorted

  for bSize in biggestBasins[1..3]:
    score *= bSize

nbText: fmt"""
Answer is: **{score}**
"""

nb.filename = fmt"../../html/{DOCNAME}.html"
nbSave