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)
(unless board.won
(when (stepBoard board numberCalled)
(return (boardScore board numberCalled)))))
null))
(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)