diff --git a/2021/four.nim b/2021/four.nim index f617b8a..d588d96 100644 --- a/2021/four.nim +++ b/2021/four.nim @@ -1,11 +1,61 @@ -import std/[strutils, sequtils, options, math, parseutils] +import std/[strutils, sequtils, options, math, parseutils, sets] import ./common +type Board = object + entries: seq[string] + checked: seq[int] + +let winningSets = [ + [0, 1, 2, 3, 4], + [5, 6, 7, 8, 9], + [10, 11, 12, 13, 14], + [15, 16, 17, 18, 19], + [20, 21, 22, 23, 24], + [0, 5, 10, 15, 20], + [1, 6, 11, 16, 21], + [2, 7, 12, 17, 22], + [3, 8, 13, 18, 23], + [4, 9, 14, 19, 24] +].mapIt(it.toHashSet()) + +proc isBoardWinning(b: ref Board): bool = + let s = b.checked.toHashSet() + for w in winningSets: + if w < s: + return true + return false + + proc squidBingo(inputLines: seq[string]): int = var input: seq[string] = inputLines - let calledNumbers: seq[string] = input[0].split(',') - input.delete(0..1) + let calledNumbers: seq[string] = input[0].split ',' + input.delete 0..1 + echo calledNumbers + + # construct boards + var boards: seq[Board] + var board: Board = Board(entries: @[], checked: @[]) + for l in input: + echo l + if l.strip() == "": + boards.add board + echo board.entries + 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()) + + for n in calledNumbers: + for b in boards: + for i, e in b.entries: + if n == e: + # TODO: why can't I add here but I can add on 46?! + b.checked.add i + if b.isBoardWinning(): + # TODO: get unchecked entries + # TODO: multiple their sum with last .checked + return 9 + return 0 let input = 4.loadInput() @@ -13,25 +63,23 @@ time("squidBingo part 1"): echo input.squidBingo() 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 - 21 9 14 16 7 - 6 10 3 18 5 - 1 12 20 15 19 +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 - 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 + 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 - 14 21 17 24 4 - 10 16 15 9 19 - 18 8 23 26 20 - 22 11 13 6 5 - 2 0 12 3 7 - """.strip().split('\n') +14 21 17 24 4 +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