solve AOC day 4 pt 2

This commit is contained in:
2021-12-06 14:49:26 -07:00
parent a898a73f19
commit e9d43df34c
4 changed files with 32 additions and 13 deletions

View File

@@ -4,11 +4,12 @@ import haxe.ds.Option;
typedef Board = {
uncalled:Array<Array<Option<Int>>>,
called:Array<Array<Option<Int>>>
called:Array<Array<Option<Int>>>,
won:Bool
};
typedef GameState = {
numbersToCall:Array<Int>,
boards:Array<Board>,
boardsByNumber:Map<Int,Array<Board>>
boardsByNumber:Map<Int,Array<Board>>,
};

View File

@@ -17,7 +17,9 @@
(day 4
(load "day4.kiss")
(assert (= 4512 (winningScore "src/year2021/inputs/day4-example.txt")))
(assert (= 46920 (winningScore "src/year2021/inputs/day4.txt"))))
(assert (= 46920 (winningScore "src/year2021/inputs/day4.txt")))
(assert (= 1924 (lastWinningScore "src/year2021/inputs/day4-example.txt")))
(assert (= 12635 (lastWinningScore "src/year2021/inputs/day4.txt"))))
(dayTodo 5)
(day 6
(load "day6.kiss")

View File

@@ -8,7 +8,8 @@
(let [numbers (map (apply concat (for line group (filter (line.split " ")))) Std.parseInt)
board (object
uncalled (for line (groups numbers 5) (for number line (Some number)))
called (for y (range 5) (for x (range 5) None)))]
called (for y (range 5) (for x (range 5) None))
won false)]
(doFor number numbers
(unless (boardsByNumber.exists number) (dictSet boardsByNumber number []))
(.push (dictGet boardsByNumber number) board))
@@ -39,14 +40,18 @@
(when won (return true))))
(return false)))
// Return the winning score when a board wins
(function :Null<Int> stepState [:GameState state]
(let [numberCalled (state.numbersToCall.shift)]
// Return the winning score(s) when a board(s) win
(function :Null<Array<Int>> stepState [:GameState state]
// Keep returning the last score if there are no more numbers to call
(let [numberCalled (state.numbersToCall.shift)
winningScores []]
(when (state.boardsByNumber.exists numberCalled)
(doFor board (dictGet state.boardsByNumber numberCalled)
(when (stepBoard board numberCalled)
(return (boardScore board numberCalled)))))
null))
(unless board.won
(when (stepBoard board numberCalled)
(set board.won true)
(winningScores.push (boardScore board numberCalled))))))
winningScores))
(function :Int boardScore [:Board board numberCalled]
(* numberCalled (apply + (for row board.uncalled (apply + (for square row (case square ((Some v) v) (otherwise 0))))))))
@@ -54,6 +59,17 @@
(function winningScore [file]
(let [state (readState file)]
(loop
(whenLet [winningScore (stepState state)]
(return winningScore))))
// Assume that for potential solutions to the AOC problem, only one board wins at a time.
(whenLet [[score] (stepState state)]
(return score))))
(throw ""))
(function lastWinningScore [file]
(let [state (readState file)
&mut finishedBoards 0]
(loop
(whenLet [winningScores (stepState state)]
(+= finishedBoards winningScores.length)
(when (= finishedBoards state.boards.length)
(return (first winningScores))))))
(throw ""))

View File

@@ -24,7 +24,7 @@
(dictSet newMap -1 (dictGet theMap -1))
(doFor age (range 9)
(let [count (dictGet theMap age)]
(case ~age
(case age
// Lanternfish giving birth:
(0
(dictInc newMap 8 count)