chore: incorporate range over integers syntax
This commit is contained in:
parent
01a14fc5d1
commit
7a1ca2516c
81
gol/arena.go
Normal file
81
gol/arena.go
Normal file
@ -0,0 +1,81 @@
|
||||
package gol
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Arena [][]bool
|
||||
|
||||
func New(ysize, xsize int) Arena {
|
||||
var arena = make([][]bool, ysize)
|
||||
for i := range ysize {
|
||||
arena[i] = make([]bool, xsize)
|
||||
}
|
||||
return arena
|
||||
}
|
||||
|
||||
// bufPool
|
||||
var bufPool = sync.Pool{
|
||||
New: func() any {
|
||||
return new(bytes.Buffer)
|
||||
},
|
||||
}
|
||||
|
||||
var (
|
||||
spriteOn = ([]byte)("\ue0b6\ue0b4")
|
||||
spriteOff = ([]byte)("\u2022\u2022")
|
||||
)
|
||||
|
||||
func (a Arena) PrintMe() {
|
||||
b := bufPool.Get().(*bytes.Buffer)
|
||||
b.Reset()
|
||||
|
||||
for i := range len(a) {
|
||||
for j := range len(a[0]) {
|
||||
if a[i][j] {
|
||||
b.Write(spriteOn)
|
||||
} else {
|
||||
b.Write(spriteOff)
|
||||
}
|
||||
}
|
||||
b.WriteRune('\n')
|
||||
}
|
||||
os.Stdout.Write(b.Bytes())
|
||||
bufPool.Put(b)
|
||||
}
|
||||
|
||||
func (a Arena) NextGen(to Arena) {
|
||||
for y := range len(a) {
|
||||
for x := range len(a[0]) {
|
||||
to[y][x] = a.life(x, y)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a Arena) life(x, y int) bool {
|
||||
neighbours := a.countNeighbours(x, y)
|
||||
iAmAlive := a[y][x]
|
||||
return neighbours == 3 || (iAmAlive && neighbours == 2)
|
||||
}
|
||||
|
||||
func (a Arena) countNeighbours(x, y int) int {
|
||||
ysize := len(a)
|
||||
xsize := len(a[0])
|
||||
|
||||
count := 0
|
||||
for dy := -1; dy <= 1; dy++ {
|
||||
for dx := -1; dx <= 1; dx++ {
|
||||
if dx == 0 && dy == 0 {
|
||||
continue
|
||||
}
|
||||
ny := (y + dy + ysize) % ysize
|
||||
nx := (x + dx + xsize) % xsize
|
||||
if a[ny][nx] {
|
||||
count++
|
||||
}
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
98
gol/types.go
98
gol/types.go
@ -1,98 +0,0 @@
|
||||
package gol
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Arena [][]bool
|
||||
|
||||
func New(ysize, xsize int) Arena {
|
||||
var arena = make([][]bool, ysize)
|
||||
for i := 0; i < ysize; i++ {
|
||||
arena[i] = make([]bool, xsize)
|
||||
}
|
||||
return arena
|
||||
}
|
||||
|
||||
// bufPool
|
||||
var bufPool = sync.Pool{
|
||||
New: func() any {
|
||||
return new(bytes.Buffer)
|
||||
},
|
||||
}
|
||||
|
||||
func (a Arena) PrintMe() {
|
||||
b := bufPool.Get().(*bytes.Buffer)
|
||||
b.Reset()
|
||||
spriteOn := ([]byte)("\ue0b6\ue0b4")
|
||||
spriteOff := ([]byte)("\u2022\u2022")
|
||||
|
||||
for i := 0; i < len(a); i++ {
|
||||
for j := 0; j < len(a[0]); j++ {
|
||||
if a[i][j] {
|
||||
b.Write(spriteOn)
|
||||
} else {
|
||||
b.Write(spriteOff)
|
||||
}
|
||||
}
|
||||
b.WriteRune('\n')
|
||||
}
|
||||
os.Stdout.Write(b.Bytes())
|
||||
bufPool.Put(b)
|
||||
}
|
||||
|
||||
func (a Arena) NextGen(to Arena) {
|
||||
for y := 0; y < len(a); y++ {
|
||||
for x := 0; x < len(a[0]); x++ {
|
||||
to[y][x] = a.Life(x, y)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a Arena) Life(x, y int) bool {
|
||||
count := a.countN(x, y)
|
||||
current := a[y][x]
|
||||
if !current && count == 3 {
|
||||
return true
|
||||
}
|
||||
if current && (count == 2 || count == 3) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type pair struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
func (a Arena) countN(x, y int) int {
|
||||
ysize := len(a)
|
||||
xsize := len(a[0])
|
||||
|
||||
xb := (x - 1 + xsize) % xsize
|
||||
xa := (x + 1 + xsize) % xsize
|
||||
yb := (y - 1 + ysize) % ysize
|
||||
ya := (y + 1 + ysize) % ysize
|
||||
|
||||
neigh := [8]pair{
|
||||
{xb, yb},
|
||||
{x, yb},
|
||||
{xa, yb},
|
||||
{xb, y},
|
||||
{xa, y},
|
||||
{xb, ya},
|
||||
{x, ya},
|
||||
{xa, ya},
|
||||
}
|
||||
|
||||
count := 0
|
||||
for _, p := range neigh {
|
||||
if a[p.y][p.x] {
|
||||
count++
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user