Files
AdventOfCode/2018/day_11/prova.go
2020-12-25 23:50:29 +01:00

78 lines
1.5 KiB
Go

package main
import (
"fmt"
"strconv"
)
func calculate(i int, j int, memo *[][]int, ps *[][]int, input int) int {
t := 0
for x := i; x < i+3; x++ {
for y := j; y < j+3; y++ {
if (*memo)[y][x] != 0 {
t += (*memo)[y][x]
} else {
id := x + 10
serial := (id*y + input)
hundreds := strconv.Itoa(serial * id)
var result int
if len(hundreds) >= 3 {
result, _ = strconv.Atoi(string(hundreds[len(hundreds)-3]))
}
result -= 5
t += result
(*memo)[y][x] = result
(*ps)[y][x] = result + (*ps)[y-1][x] + (*ps)[y][x-1] - (*ps)[y-1][x-1]
}
}
}
return t
}
func main() {
input := 7347
var res, X, Y int
// technically memo isn't needed anymore but I added partial sums after
// part 2 and didn't wanna clean up my code after for part 1
memo := make([][]int, 301)
partialSums := make([][]int, 301)
for i := range memo {
memo[i] = make([]int, 301)
partialSums[i] = make([]int, 301)
}
for i := 1; i <= 298; i++ {
for j := 1; j <= 298; j++ {
if c := calculate(i, j, &memo, &partialSums, input); c > res {
res = c
X = i
Y = j
}
}
}
fmt.Printf("Part 1: %v, %v, %v\n", res, X, Y)
res = 0
var sz int
for size := 1; size < 300; size++ {
for i := size; i <= 300; i++ {
for j := size; j <= 300; j++ {
if c := partialSums[i][j] - partialSums[i-size][j] -
partialSums[i][j-size] + partialSums[i-size][j-size]; c > res {
res = c
Y = i - size + 1
X = j - size + 1
sz = size
}
}
}
}
fmt.Printf("Part 2: %v, %v, %v, %v\n", res, X, Y, sz)
}