131 lines
2.8 KiB
Go
131 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Square struct {
|
|
x int64
|
|
y int64
|
|
}
|
|
|
|
func main() {
|
|
|
|
fmt.Println("Day 6")
|
|
start := time.Now()
|
|
|
|
dat, err := ioutil.ReadFile("day6.txt")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
lines := bytes.Split(dat, []byte("\n"))
|
|
lights := make(map[Square]bool)
|
|
lights2 := make(map[Square]int64)
|
|
|
|
SwitchTheLights(lights, false, false, 0, 0, 1000, 1000)
|
|
|
|
part1 := 0
|
|
var part2 int64 = 0
|
|
|
|
for _, value := range lines {
|
|
|
|
words := bytes.Split(value, []byte(" "))
|
|
if len(words) == 4 {
|
|
|
|
start := bytes.Split(words[1], []byte(","))
|
|
end := bytes.Split(words[3], []byte(","))
|
|
|
|
startX, _ := strconv.Atoi(string(start[0]))
|
|
startY, _ := strconv.Atoi(string(start[1]))
|
|
endX, _ := strconv.Atoi(string(end[0]))
|
|
endY, _ := strconv.Atoi(string(end[1]))
|
|
|
|
SwitchTheLights(lights, false, true, int64(startX), int64(startY), int64(endX), int64(endY))
|
|
SwitchTheLights2(lights2, false, true, int64(startX), int64(startY), int64(endX), int64(endY))
|
|
|
|
} else {
|
|
|
|
start := bytes.Split(words[2], []byte(","))
|
|
end := bytes.Split(words[4], []byte(","))
|
|
|
|
startX, _ := strconv.Atoi(string(start[0]))
|
|
startY, _ := strconv.Atoi(string(start[1]))
|
|
endX, _ := strconv.Atoi(string(end[0]))
|
|
endY, _ := strconv.Atoi(string(end[1]))
|
|
|
|
SwitchTheLights(lights, compare(words[1], []byte("on")), false, int64(startX), int64(startY), int64(endX), int64(endY))
|
|
SwitchTheLights2(lights2, compare(words[1], []byte("on")), false, int64(startX), int64(startY), int64(endX), int64(endY))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, v := range lights {
|
|
if v {
|
|
part1++
|
|
}
|
|
}
|
|
|
|
for _, v := range lights2 {
|
|
part2 += v
|
|
}
|
|
|
|
elapsed := time.Since(start)
|
|
fmt.Printf("Part 1: %v %v \n", part1, elapsed)
|
|
fmt.Printf("Part 2: %v %v \n", part2, elapsed)
|
|
|
|
}
|
|
|
|
func SwitchTheLights(lights map[Square]bool, state bool, toggle bool, startX int64, startY int64, endX int64, endY int64) {
|
|
|
|
for i := startX; i <= endX; i++ {
|
|
for j := startY; j <= endY; j++ {
|
|
if toggle {
|
|
lights[Square{x: i, y: j}] = !lights[Square{x: i, y: j}]
|
|
} else {
|
|
lights[Square{x: i, y: j}] = state
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func SwitchTheLights2(lights map[Square]int64, state bool, toggle bool, startX int64, startY int64, endX int64, endY int64) {
|
|
|
|
for i := startX; i <= endX; i++ {
|
|
for j := startY; j <= endY; j++ {
|
|
|
|
var brighness int64 = lights[Square{x: i, y: j}]
|
|
if toggle {
|
|
lights[Square{x: i, y: j}] = brighness + 2
|
|
} else {
|
|
|
|
if state {
|
|
lights[Square{x: i, y: j}] = brighness + 1
|
|
} else {
|
|
lights[Square{x: i, y: j}] = brighness - 1
|
|
if lights[Square{x: i, y: j}] < 0 {
|
|
lights[Square{x: i, y: j}] = 0
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func compare(slice1 []byte, slice2 []byte) bool {
|
|
for i := 0; i < len(slice1) && i < len(slice2); i++ {
|
|
if slice1[i] != slice2[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|