From 616713e8ae8a83e114fba6d52af8a5770e2ca3a8 Mon Sep 17 00:00:00 2001 From: Luke Else Date: Sun, 12 Dec 2021 00:23:08 +0000 Subject: [PATCH] day 11b complete fairly simple after finally figuring out where I went wrong in part A. Note - Struct included in solution inspired by online solution --- day11/day 11b/go.mod | 3 + day11/day 11b/main.go | 149 ++++++++++++++++++++++++++++++++++++++++ day11/day 11b/testInput | 10 +++ 3 files changed, 162 insertions(+) create mode 100644 day11/day 11b/go.mod create mode 100644 day11/day 11b/main.go create mode 100644 day11/day 11b/testInput diff --git a/day11/day 11b/go.mod b/day11/day 11b/go.mod new file mode 100644 index 0000000..e938e2e --- /dev/null +++ b/day11/day 11b/go.mod @@ -0,0 +1,3 @@ +module PWD + +go 1.17 diff --git a/day11/day 11b/main.go b/day11/day 11b/main.go new file mode 100644 index 0000000..8abd24d --- /dev/null +++ b/day11/day 11b/main.go @@ -0,0 +1,149 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" +) + +func main() { + content := returnContent("../input") + //content := returnContent("testInput") + + octopuses := map[Coordinate]int{} + + answer := 0 + + width := 0 + height := len(*content) + + //Insert octopuses into a map + for y, row := range *content { + width = len(row) + for x, val := range row { + octopuses[Coordinate{X: x, Y: y}] = val + } + } + + i := 0 + for { + i++ + flashers := map[Coordinate]bool{} + for coords, energy := range octopuses { + octopuses[coords] = energy + 1 + } + + for { + doneFlashing := true + + for coords, energy := range octopuses { + if energy > 9 && !flashers[coords] { + doneFlashing = false + flashers[coords] = true + for _, neighbour := range coords.Neighbours(width, height, true) { + octopuses[neighbour]++ + } + } + } + + if doneFlashing { + break + } + } + + for coords, flashed := range flashers { + if flashed { + octopuses[coords] = 0 + } + } + + allFlashed := true + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + if !flashers[Coordinate{ + X: x, + Y: y, + }] { + allFlashed = false + } + } + } + if allFlashed { + answer = i + break + } + } + + //fmt.Println(*content) + fmt.Println(answer) +} + +//Coordinate Class +type Coordinate struct { + X int + Y int +} + +func (c *Coordinate) Neighbours(gridWidth int, gridHeight int, diagonal bool) (out []Coordinate) { + spaceLeft := c.X > 0 + spaceRight := c.X < gridWidth-1 + spaceUp := c.Y > 0 + spaceDown := c.Y < gridHeight-1 + + if spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y}) + } + if spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y}) + } + if spaceUp { + out = append(out, Coordinate{c.X, c.Y - 1}) + } + if spaceDown { + out = append(out, Coordinate{c.X, c.Y + 1}) + } + + if diagonal { + if spaceUp && spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y - 1}) + } + if spaceUp && spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y - 1}) + } + if spaceDown && spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y + 1}) + } + if spaceDown && spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y + 1}) + } + } + + return +} + +func returnContent(path string) *[][]int { + //read file and return it as an array of integers + + file, err := os.Open(path) + var content [][]int + + if err != nil { + fmt.Println("Unlucky, the file didn't open") + return &content + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + nums := []int{} + for _, char := range scanner.Text() { + num, _ := strconv.Atoi(string(char)) + nums = append(nums, num) + } + content = append(content, nums) + } + + return &content +} diff --git a/day11/day 11b/testInput b/day11/day 11b/testInput new file mode 100644 index 0000000..a3819c9 --- /dev/null +++ b/day11/day 11b/testInput @@ -0,0 +1,10 @@ +5483143223 +2745854711 +5264556173 +6141336146 +6357385478 +4167524645 +2176841721 +6882881134 +4846848554 +5283751526 \ No newline at end of file