🏡 part2.nim

Day 03 part 2

var
  inputData = newSeq[string]()
  position = 0

for l in "input.txt".lines:
  inputData.add(l)

proc findValue(position: var int, valMatch: string, inputData: seq[string]): seq[string] =
  var 
    ones, zeros: int
    matcher: char
    data = inputData
  if data.len == 1:
    position = 0
    return data
  for d in data:
    if d[position] == '1':
      ones.inc
    else:
      zeros.inc
  if valMatch == "more":
    if ones >= zeros:
      matcher = '1'
    else:
      matcher = '0'
  else:
    if ones < zeros:
      matcher = '1'
    else:
      matcher = '0'
  data.keepItIf(it[position] == matcher)
  position.inc
  result = findValue(position, valMatch, data)

var oxygen = fromBin[int](findValue(position, "more", inputData)[0])
var co2 = fromBin[int](findValue(position, "less", inputData)[0])

Answer is: 2775870

import sequtils
import strutils
import strformat
import nimib

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

nbInit
nb.title = DOCNAME

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

nbCode:
  var
    inputData = newSeq[string]()
    position = 0

  for l in "input.txt".lines:
    inputData.add(l)

  proc findValue(position: var int, valMatch: string, inputData: seq[string]): seq[string] =
    var 
      ones, zeros: int
      matcher: char
      data = inputData
    if data.len == 1:
      position = 0
      return data
    for d in data:
      if d[position] == '1':
        ones.inc
      else:
        zeros.inc
    if valMatch == "more":
      if ones >= zeros:
        matcher = '1'
      else:
        matcher = '0'
    else:
      if ones < zeros:
        matcher = '1'
      else:
        matcher = '0'
    data.keepItIf(it[position] == matcher)
    position.inc
    result = findValue(position, valMatch, data)

  var oxygen = fromBin[int](findValue(position, "more", inputData)[0])
  var co2 = fromBin[int](findValue(position, "less", inputData)[0])

nbText: fmt"""
Answer is: **{oxygen * co2}**
"""

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