mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-05-18 19:13:27 +02:00
119 lines
2.1 KiB
Go
119 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/alexchao26/advent-of-code-go/cast"
|
|
"github.com/alexchao26/advent-of-code-go/util"
|
|
)
|
|
|
|
func main() {
|
|
var part int
|
|
flag.IntVar(&part, "part", 1, "part 1 or 2")
|
|
flag.Parse()
|
|
fmt.Println("Running part", part)
|
|
|
|
if part == 1 {
|
|
ans := part1(util.ReadFile("./input.txt"))
|
|
fmt.Println("Output:", ans)
|
|
} else {
|
|
ans := part2(util.ReadFile("./input.txt"))
|
|
fmt.Println("Output:", ans)
|
|
}
|
|
}
|
|
|
|
// 300x300 grid
|
|
func part1(input string) string {
|
|
gridSN := parseInputs(input)
|
|
|
|
grid := generateGrid(gridSN)
|
|
|
|
// find best 3x3 grid
|
|
deltas := [][2]int{
|
|
{-1, -1},
|
|
{-1, 0},
|
|
{-1, 1},
|
|
{0, -1},
|
|
{0, 0},
|
|
{0, 1},
|
|
{1, -1},
|
|
{1, 0},
|
|
{1, 1},
|
|
}
|
|
var best int
|
|
var topLeftCorner [2]int
|
|
for x := 2; x < 300; x++ {
|
|
for y := 2; y < 300; y++ {
|
|
sum := 0
|
|
for _, d := range deltas {
|
|
sum += grid[x+d[0]][y+d[1]]
|
|
}
|
|
if sum > best {
|
|
best = sum
|
|
topLeftCorner = [2]int{x - 1, y - 1}
|
|
}
|
|
}
|
|
}
|
|
|
|
return fmt.Sprintf("%d,%d", topLeftCorner[0], topLeftCorner[1])
|
|
}
|
|
|
|
func part2(input string) string {
|
|
gridSN := parseInputs(input)
|
|
|
|
grid := generateGrid(gridSN)
|
|
|
|
var bestPower int
|
|
var xYSize [3]int
|
|
|
|
for x := 1; x <= 300; x++ {
|
|
for y := 1; y <= 300; y++ {
|
|
var sum int
|
|
for edge := 0; edge+x <= 300 && edge+y <= 300; edge++ {
|
|
sum += grid[x+edge][y+edge]
|
|
for add := 0; add < edge; add++ {
|
|
sum += grid[x+add][y+edge]
|
|
sum += grid[x+edge][y+add]
|
|
}
|
|
if sum > bestPower {
|
|
bestPower = sum
|
|
xYSize = [3]int{x, y, edge + 1}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return fmt.Sprintf("%d,%d,%d", xYSize[0], xYSize[1], xYSize[2])
|
|
}
|
|
|
|
func parseInputs(input string) int {
|
|
return cast.ToInt(strings.TrimSpace(input))
|
|
}
|
|
|
|
func generateGrid(gridSN int) [][]int {
|
|
oneIndexedGrid := make([][]int, 301) // X, Y
|
|
|
|
for i := 1; i <= 300; i++ {
|
|
oneIndexedGrid[i] = make([]int, 301)
|
|
}
|
|
|
|
for x := 1; x <= 300; x++ {
|
|
for y := 1; y <= 300; y++ {
|
|
rackID := x + 10
|
|
power := rackID * y
|
|
power += gridSN
|
|
power *= rackID
|
|
// keep hundreds
|
|
power /= 100
|
|
power %= 10
|
|
|
|
power -= 5
|
|
oneIndexedGrid[x][y] = power
|
|
}
|
|
}
|
|
|
|
return oneIndexedGrid
|
|
}
|