Files

103 lines
1.6 KiB
Go

package main
import (
"fmt"
"log"
"math/rand"
"os"
"runtime/pprof"
"unsafe"
)
const (
max int = 1500
loops int = 5000
density int = 8
debug bool = false
)
// https://dev.to/chigbeef_77/bool-int-but-stupid-in-go-3jb3
func bool2int(b bool) int {
return int(*(*byte)(unsafe.Pointer(&b)))
}
func Count(grid [][]bool, x, y int) int {
var sum int
for nbgX := -1; nbgX < 2; nbgX++ {
for nbgY := -1; nbgY < 2; nbgY++ {
var col, row int
if x+nbgX < 0 || x+nbgX >= max || y+nbgY < 0 || y+nbgY >= max {
continue
}
col = x + nbgX
row = y + nbgY
state := grid[row][col]
intstate := bool2int(state)
sum += intstate
}
}
sum -= bool2int(grid[y][x])
return sum
}
func Init() [][]bool {
grid := make([][]bool, max)
for y := 0; y < max; y++ {
grid[y] = make([]bool, max)
for x := 0; x < max; x++ {
if rand.Intn(density) == 1 {
grid[y][x] = true
}
}
}
return grid
}
func Loop(grid [][]bool) {
c := 0
for i := 0; i < loops; i++ {
for y := 0; y < max; y++ {
for x := 0; x < max; x++ {
state := grid[y][x]
neighbors := Count(grid, x, y)
if state && neighbors > 1 {
if debug {
fmt.Printf("Loop %d - cell at %d,%d is %t and has %d living neighbors\n", i, x, y, state, neighbors)
}
c = 1
}
}
}
}
if c > 1 {
c = 0
}
}
func main() {
// enable cpu profiling. Do NOT use q to stop the game but
// close the window to get a profile
fd, err := os.Create("cpu.profile")
if err != nil {
log.Fatal(err)
}
defer fd.Close()
pprof.StartCPUProfile(fd)
defer pprof.StopCPUProfile()
// init
grid := Init()
// main loop
Loop(grid)
}