mirror of
https://github.com/Noettore/AdventOfCode.git
synced 2025-10-14 19:26:39 +02:00
99 lines
2.0 KiB
Go
99 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
)
|
|
|
|
const gridSize int = 300
|
|
const gridSerial int = 7347
|
|
|
|
func cellPower(x int, y int, serial int) int {
|
|
rackID := x + 1 + 10
|
|
powerLevel := rackID * (y + 1)
|
|
powerLevel += serial
|
|
powerLevel *= rackID
|
|
powerLevel %= int(math.Pow(10, 3))
|
|
powerLevel /= int(math.Pow(10, 2))
|
|
|
|
return powerLevel
|
|
}
|
|
|
|
func maxPowerSquare(powerGrid *[gridSize][gridSize]int, powerGridCheck *[gridSize][gridSize]bool, size int, res chan<- [4]int) {
|
|
maxSum := 0
|
|
maxSumCheck := false
|
|
maxX, maxY := 0, 0
|
|
|
|
for x := 0; x < gridSize-size+1; x++ {
|
|
for y := 0; y < gridSize-size+1; y++ {
|
|
powerSum := 0
|
|
for xi := x; xi < x+size; xi++ {
|
|
for yi := y; yi < y+size; yi++ {
|
|
if !powerGridCheck[xi][yi] {
|
|
powerGrid[xi][yi] = cellPower(xi, yi, gridSerial)
|
|
powerGridCheck[xi][yi] = true
|
|
}
|
|
powerSum += powerGrid[xi][yi]
|
|
}
|
|
}
|
|
if powerSum > maxSum || !maxSumCheck {
|
|
maxSum = powerSum
|
|
maxSumCheck = true
|
|
maxX = x
|
|
maxY = y
|
|
}
|
|
}
|
|
}
|
|
res <- [4]int{size, maxSum, maxX + 1, maxY + 1}
|
|
}
|
|
|
|
func main() {
|
|
|
|
var powerGrid [gridSize][gridSize]int
|
|
var powerGridCheck [gridSize][gridSize]bool
|
|
var res = make(chan [4]int)
|
|
|
|
go func() {
|
|
maxPowerSquare(&powerGrid, &powerGridCheck, 3, res)
|
|
close(res)
|
|
}()
|
|
p1 := <-res
|
|
fmt.Printf("Part One: %v,%v\n", p1[2], p1[3])
|
|
|
|
res = make(chan [4]int)
|
|
for i := 0; i < gridSize; i++ {
|
|
go func(i int) {
|
|
maxPowerSquare(&powerGrid, &powerGridCheck, i, res)
|
|
if i == gridSize-1 {
|
|
close(res)
|
|
}
|
|
}(i)
|
|
}
|
|
|
|
maxSum := 0
|
|
maxSumCheck := false
|
|
maxX, maxY := 0, 0
|
|
maxSize := 0
|
|
|
|
for r := range res {
|
|
fmt.Printf("Size: %v\t Sum: %v\t x: %v\t y: %v\n", r[0], r[1], r[2], r[3])
|
|
if r[1] > maxSum || !maxSumCheck {
|
|
maxSize = r[0]
|
|
maxSum = r[1]
|
|
maxSumCheck = true
|
|
maxX = r[2]
|
|
maxY = r[3]
|
|
}
|
|
}
|
|
fmt.Printf("Part Two: %v,%v,%v\n", maxX, maxY, maxSize)
|
|
|
|
res = make(chan [4]int)
|
|
go func() {
|
|
maxPowerSquare(&powerGrid, &powerGridCheck, 299, res)
|
|
close(res)
|
|
}()
|
|
p1 = <-res
|
|
fmt.Printf("Part Two 299: %v,%v,%v\n", p1[1], p1[2], p1[3])
|
|
|
|
}
|