AoC2021/src/day11/day11.go

86 lines
1.7 KiB
Go

package main
import (
"AOC2021/src/helper"
"fmt"
"os"
)
type field struct {
energy int
flashed bool
}
func main() {
args := os.Args[1:]
input, err := helper.GetInput(args[0])
if err != nil {
fmt.Println(err)
}
energyMap := [10][10]field{}
for i, line := range input {
for j, r := range line {
energyMap[i][j] = field{int(r - '0'), false}
}
}
flashes := 0
allFlashTogether := false
i := 0
for !allFlashTogether {
stepflashes := step(&energyMap)
flashes += stepflashes
if stepflashes == 100 {
fmt.Printf("First Step, where all octuspuses flash simultaneously: %d \n", i + 1)
allFlashTogether = true
}
if i == 99 {
fmt.Printf("Flashes after 100 Steps: %d \n", flashes)
}
i++
}
}
func step(energyMap *[10][10]field) int{
flashes := 0
for i, _ := range energyMap {
for j, _ := range energyMap[i] {
energyMap[i][j].energy++
}
}
for i, _ := range energyMap {
for j, _ := range energyMap[i] {
if energyMap[i][j].energy > 9 {
flash(energyMap, j, i)
}
}
}
for i, _ := range energyMap {
for j, _ := range energyMap[i] {
if energyMap[i][j].flashed {
energyMap[i][j].energy = 0
flashes++
energyMap[i][j].flashed = false
}
}
}
return flashes
}
func flash(energyMap *[10][10]field, x int, y int) {
if energyMap[y][x].flashed == true {
return
}
energyMap[y][x].flashed = true
directions := [8][2]int{{-1, -1}, {0, -1}, {1, -1}, {+1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}}
for _, direction := range directions {
px := x + direction[0]
py := y + direction[1]
if py < len(energyMap) && py >= 0 && px < len(energyMap[0]) && px >= 0 {
energyMap[py][px].energy++
if energyMap[py][px].energy > 9 {
flash(energyMap, px, py)
}
}
}
}