day 11a incomplete
for some reason, the code just doesn't give the right answer
This commit is contained in:
		
							
								
								
									
										3
									
								
								day11/day 11a/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								day11/day 11a/go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
module PWD
 | 
			
		||||
 | 
			
		||||
go 1.17
 | 
			
		||||
							
								
								
									
										132
									
								
								day11/day 11a/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								day11/day 11a/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < 100; i++ {
 | 
			
		||||
		flashers := map[Coordinate]bool{}
 | 
			
		||||
 | 
			
		||||
		for coord := range octopuses {
 | 
			
		||||
			octopuses[coord]++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for {
 | 
			
		||||
			complete := true
 | 
			
		||||
 | 
			
		||||
			for coord, energy := range octopuses {
 | 
			
		||||
				if energy > 9 && !flashers[coord] {
 | 
			
		||||
					flashers[coord] = true
 | 
			
		||||
					answer++
 | 
			
		||||
					for _, neighbor := range coord.Neighbours(width, height, true) {
 | 
			
		||||
						octopuses[neighbor]++
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if complete {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for coord, flashed := range flashers {
 | 
			
		||||
			if flashed {
 | 
			
		||||
				octopuses[coord] = 0
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								day11/day 11a/testInput
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								day11/day 11a/testInput
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
5483143223
 | 
			
		||||
2745854711
 | 
			
		||||
5264556173
 | 
			
		||||
6141336146
 | 
			
		||||
6357385478
 | 
			
		||||
4167524645
 | 
			
		||||
2176841721
 | 
			
		||||
6882881134
 | 
			
		||||
4846848554
 | 
			
		||||
5283751526
 | 
			
		||||
		Reference in New Issue
	
	Block a user