package day18 import ( "tools" ) func getGridFromInput(inp string) tools.GridToggle { grid := tools.NewGridToggle() for i, c := range inp { grid.Set(i, 0, c == '^') } return grid } func calcTraps(grid tools.GridToggle, cols, rows int) tools.GridToggle { for row := 1; row < rows; row++ { for x := 0; x < cols; x++ { grid.Set(x, row, (grid.State(x-1, row-1) && grid.State(x, row-1) && !grid.State(x+1, row-1)) || (!grid.State(x-1, row-1) && grid.State(x, row-1) && grid.State(x+1, row-1)) || (grid.State(x-1, row-1) && !grid.State(x, row-1) && !grid.State(x+1, row-1)) || (!grid.State(x-1, row-1) && !grid.State(x, row-1) && grid.State(x+1, row-1))) } } return grid } func Part1(puzzle tools.AoCPuzzle) interface{} { inp := puzzle.GetInputString() width := len(inp) field := calcTraps(getGridFromInput(inp), width, 40) return (field.MaxX+1)*(field.MaxY+1) - field.GetOnCount() } func Part2(puzzle tools.AoCPuzzle) interface{} { inp := puzzle.GetInputString() width := len(inp) field := calcTraps(getGridFromInput(inp), width, 400000) return (field.MaxX+1)*(field.MaxY+1) - field.GetOnCount() }