diff --git a/11/main.go b/11/main.go new file mode 100644 index 0000000..7ff47de --- /dev/null +++ b/11/main.go @@ -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) +}