aoc2015/day06/day06.go
2020-12-26 10:49:31 +01:00

126 lines
2.4 KiB
Go

package day06
import (
"strconv"
"strings"
"tools"
)
func Part1(puzzle tools.AoCPuzzle) interface{} {
grid := make(map[int]map[int]bool)
for y := 0; y < 1000; y++ {
grid[y] = make(map[int]bool)
for x := 0; x < 1000; x++ {
grid[y][x] = false
}
}
var values []string
var command, start, end string
var aStart, aEnd []string
var startX, startY, endX, endY int
for _, instruction := range puzzle.GetInputArray() {
values = strings.Split(instruction, " ")
if len(values) == 4 {
command = values[0]
start = values[1]
end = values[3]
} else {
command = values[0] + " " + values[1]
start = values[2]
end = values[4]
}
aStart = strings.Split(start, ",")
aEnd = strings.Split(end, ",")
startX, _ = strconv.Atoi(aStart[0])
startY, _ = strconv.Atoi(aStart[1])
endX, _ = strconv.Atoi(aEnd[0])
endY, _ = strconv.Atoi(aEnd[1])
for x := startX; x <= endX; x++ {
for y := startY; y <= endY; y++ {
switch command {
case "toggle":
grid[x][y] = !grid[x][y]
case "turn on":
grid[x][y] = true
case "turn off":
grid[x][y] = false
}
}
}
}
onCount := 0
for y := range grid {
for x := range grid[y] {
if grid[x][y] {
onCount++
}
}
}
return onCount
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
grid := make(map[int]map[int]int)
for y := 0; y < 1000; y++ {
grid[y] = make(map[int]int)
for x := 0; x < 1000; x++ {
grid[y][x] = 0
}
}
var values []string
var command, start, end string
var aStart, aEnd []string
var startX, startY, endX, endY int
for _, instruction := range puzzle.GetInputArray() {
values = strings.Split(instruction, " ")
if len(values) == 4 {
command = values[0]
start = values[1]
end = values[3]
} else {
command = values[0] + " " + values[1]
start = values[2]
end = values[4]
}
aStart = strings.Split(start, ",")
aEnd = strings.Split(end, ",")
startX, _ = strconv.Atoi(aStart[0])
startY, _ = strconv.Atoi(aStart[1])
endX, _ = strconv.Atoi(aEnd[0])
endY, _ = strconv.Atoi(aEnd[1])
for x := startX; x <= endX; x++ {
for y := startY; y <= endY; y++ {
switch command {
case "toggle":
grid[x][y] += 2
case "turn on":
grid[x][y]++
case "turn off":
if grid[x][y] > 0 {
grid[x][y]--
}
}
}
}
}
onCount := 0
for y := range grid {
for x := range grid[y] {
onCount += grid[x][y]
}
}
return onCount
}