day 11
This commit is contained in:
parent
0a19c487cc
commit
349e2a8f19
147
11/main.go
Normal file
147
11/main.go
Normal file
@ -0,0 +1,147 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func mustAtoi(line byte) int {
|
||||
i, _ := strconv.Atoi(string(line))
|
||||
return i
|
||||
}
|
||||
|
||||
func main() {
|
||||
start := time.Now()
|
||||
partOne()
|
||||
duration := time.Since(start)
|
||||
partTwo()
|
||||
duration2 := time.Since(start)
|
||||
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
|
||||
}
|
||||
|
||||
func makeScanner(test bool) *bufio.Scanner {
|
||||
var f *os.File
|
||||
if test {
|
||||
f, _ = os.Open("inputs/testinput")
|
||||
} else {
|
||||
f, _ = os.Open("inputs/input")
|
||||
}
|
||||
reader := bufio.NewReader(f)
|
||||
return bufio.NewScanner(reader)
|
||||
}
|
||||
|
||||
type octopus struct {
|
||||
energy int
|
||||
flashed bool
|
||||
}
|
||||
|
||||
type octopi []octopus // index is col + (row*10)
|
||||
|
||||
func (o *octopi) incrementEnergyLevels() {
|
||||
for i := range *o {
|
||||
(*o)[i].energy++
|
||||
}
|
||||
}
|
||||
|
||||
func (o *octopi) flash() bool {
|
||||
flash := false
|
||||
toIncrement := make([]int, 100)
|
||||
for i := range *o {
|
||||
if (*o)[i].energy > 9 && !(*o)[i].flashed {
|
||||
(*o)[i].flashed = true
|
||||
flash = true
|
||||
if i > 9 {
|
||||
toIncrement[i-10]++ // above
|
||||
}
|
||||
if i < 90 {
|
||||
toIncrement[i+10]++ // below
|
||||
}
|
||||
if i%10 != 9 {
|
||||
toIncrement[i+1]++ // right
|
||||
}
|
||||
if i%10 != 0 {
|
||||
toIncrement[i-1]++ // left
|
||||
}
|
||||
if i%10 != 0 && i > 9 {
|
||||
toIncrement[i-11]++ // above-left
|
||||
}
|
||||
if i%10 != 9 && i > 9 {
|
||||
toIncrement[i-9]++ // above-right
|
||||
}
|
||||
if i%10 != 0 && i < 90 {
|
||||
toIncrement[i+9]++ // below-left
|
||||
}
|
||||
if i%10 != 9 && i < 90 {
|
||||
toIncrement[i+11]++ // below-right
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := range toIncrement {
|
||||
(*o)[i].energy += toIncrement[i]
|
||||
}
|
||||
return flash
|
||||
}
|
||||
|
||||
func (o *octopi) reset() int {
|
||||
count := 0
|
||||
for i := range *o {
|
||||
if (*o)[i].energy > 9 {
|
||||
count++
|
||||
(*o)[i].energy = 0
|
||||
(*o)[i].flashed = false
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func partOne() {
|
||||
scanner := makeScanner(false)
|
||||
|
||||
cave := octopi{}
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
for i := range line {
|
||||
cave = append(cave, octopus{energy: mustAtoi(line[i])})
|
||||
}
|
||||
}
|
||||
total := 0
|
||||
for step := 0; step < 100; step++ {
|
||||
cave.incrementEnergyLevels()
|
||||
for {
|
||||
if !cave.flash() {
|
||||
break
|
||||
}
|
||||
}
|
||||
total += cave.reset()
|
||||
}
|
||||
fmt.Println(total)
|
||||
}
|
||||
|
||||
func partTwo() {
|
||||
scanner := makeScanner(false)
|
||||
|
||||
cave := octopi{}
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
for i := range line {
|
||||
cave = append(cave, octopus{energy: mustAtoi(line[i])})
|
||||
}
|
||||
}
|
||||
step := 0
|
||||
for {
|
||||
step++
|
||||
cave.incrementEnergyLevels()
|
||||
for {
|
||||
if !cave.flash() {
|
||||
break
|
||||
}
|
||||
}
|
||||
if cave.reset() == 100 {
|
||||
break
|
||||
}
|
||||
}
|
||||
fmt.Println(step)
|
||||
}
|
Loading…
Reference in New Issue
Block a user