mirror of
https://github.com/Noettore/AdventOfCode.git
synced 2025-10-15 03:36:39 +02:00
Previous years crap.
Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
98
2018/day_11/main.go
Normal file
98
2018/day_11/main.go
Normal file
@@ -0,0 +1,98 @@
|
||||
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])
|
||||
|
||||
}
|
77
2018/day_11/prova.go
Normal file
77
2018/day_11/prova.go
Normal file
@@ -0,0 +1,77 @@
|
||||
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)
|
||||
}
|
Reference in New Issue
Block a user