diff --git a/2021/four.nim b/2021/four.nim index 33400bf..d098430 100644 --- a/2021/four.nim +++ b/2021/four.nim @@ -1,4 +1,4 @@ -import std/[strutils, sequtils, options, math, parseutils, sets, strformat] +import std/[strutils, sequtils, options, math, parseutils, sets, strformat, algorithm] import ./common type Board = object @@ -38,7 +38,7 @@ proc squidBingo(inputLines: seq[string]): int = boards.add board board = Board(entries: @[], checked: @[]) continue - board.entries.add [l[0..1], l[3..4], l[6..7], l[9..10], l[12..13]].mapIt(it.strip()) + board.entries.add l.split(' ').filterIt(it != "").mapIt(it.strip()) boards.add board @@ -68,48 +68,43 @@ proc loseSquidBingo(inputLines: seq[string]): int = boards.add board board = Board(entries: @[], checked: @[]) continue - board.entries.add [l[0..1], l[3..4], l[6..7], l[9..10], l[12..13]].mapIt(it.strip()) + board.entries.add l.split(' ').filterIt(it != "").mapIt(it.strip()) boards.add board for n in calledNumbers: - echo &"Calling {n}..." var removeBoards: seq[int] = @[] for bbi, b in boards.mpairs(): for i, e in b.entries: if n == e: b.checked.add i if b.isBoardWinning(): - echo "Board Win" if (boards.len() - removeBoards.len()) < 2: - echo &"Last Board: {board}" var entriesSum = 0 for i, v in b.entries: if not (i in b.checked): entriesSum += v.parseInt() return entriesSum * n.parseInt() else: removeBoards.add(bbi) - echo &"Removing {removeBoards.len()} board(s) of {boards.len()}..." - for i in removeBoards: - boards.delete(i, i) + for i in removeBoards.reversed(): + boards.delete(i..i) return 0 let input = 4.loadInput() -# time("squidBingo part 1"): echo input.squidBingo() -# time("loseSquidBingo part 2"): echo input.loseSquidBingo() +time("squidBingo part 1"): echo input.squidBingo() +time("loseSquidBingo part 2"): echo input.loseSquidBingo() when not defined(release): - static: - let testInput = """7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + let testInput = """7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 22 13 17 11 0 - 8 2 23 4 24 +8 2 23 4 24 21 9 14 16 7 - 6 10 3 18 5 - 1 12 20 15 19 +6 10 3 18 5 +1 12 20 15 19 - 3 15 0 2 22 - 9 18 13 17 5 +3 15 0 2 22 +9 18 13 17 5 19 8 7 25 23 20 11 10 24 4 14 21 16 12 6 @@ -118,8 +113,6 @@ when not defined(release): 10 16 15 9 19 18 8 23 26 20 22 11 13 6 5 - 2 0 12 3 7""".split('\n') - # doAssert testInput.squidBingo() == 4512 - let r = testInput.loseSquidBingo() - echo r - doAssert r == 1924 +2 0 12 3 7""".split('\n') + doAssert testInput.squidBingo() == 4512 + doAssert testInput.loseSquidBingo() == 1924