🏡 part2.nim

Day 05 part 2

type
  Ocean = array[1000, array[1000, int]]
  Line = tuple
    xa, ya, xb, yb: int

var
  hydroLine: Line
  ocean: Ocean

proc newLine(lineStr: string): Line =
  var xa,ya,xb,yb: int
  discard scanf(lineStr, "$i,$i -> $i,$i", xa, ya, xb, yb)
  hydroLine = (xa: xa, ya: ya, xb: xb, yb: yb)
  result = hydroLine

proc markLine(self: var Ocean, l: Line) =
  var
    curx = l.xa
    cury = l.ya
    vecx, vecy: int
  if l.xa < l.xb:
    vecx = 1
  elif l.xa > l.xb:
    vecx = -1
  if l.ya < l.yb:
    vecy = 1
  elif l.ya > l.yb:
    vecy = -1
  while true:
    self[curx][cury].inc
    if curx == l.xb and cury == l.yb:
      return
    else:
      curx.inc vecx
      cury.inc vecy

proc countScore(self: Ocean): int =
  for i in 0..<ocean.len:
    for j in 0..<ocean[i].len:
      if ocean[i][j] > 1:
        result.inc

for l in "input.txt".lines:
  var parsedLine = newLine(l)
  ocean.markLine(parsedLine)

Answer is: 18144

import strscans
import strformat
import nimib

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

nbInit
nb.title = DOCNAME

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

nbCode:
  type
    Ocean = array[1000, array[1000, int]]
    Line = tuple
      xa, ya, xb, yb: int

  var
    hydroLine: Line
    ocean: Ocean

  proc newLine(lineStr: string): Line =
    var xa,ya,xb,yb: int
    discard scanf(lineStr, "$i,$i -> $i,$i", xa, ya, xb, yb)
    hydroLine = (xa: xa, ya: ya, xb: xb, yb: yb)
    result = hydroLine

  proc markLine(self: var Ocean, l: Line) =
    var
      curx = l.xa
      cury = l.ya
      vecx, vecy: int
    if l.xa < l.xb:
      vecx = 1
    elif l.xa > l.xb:
      vecx = -1
    if l.ya < l.yb:
      vecy = 1
    elif l.ya > l.yb:
      vecy = -1
    while true:
      self[curx][cury].inc
      if curx == l.xb and cury == l.yb:
        return
      else:
        curx.inc vecx
        cury.inc vecy

  proc countScore(self: Ocean): int =
    for i in 0..<ocean.len:
      for j in 0..<ocean[i].len:
        if ocean[i][j] > 1:
          result.inc

  for l in "input.txt".lines:
    var parsedLine = newLine(l)
    ocean.markLine(parsedLine)

nbText: fmt"""
Answer is: **{ocean.countScore}**
"""

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