mirror of
https://codeberg.org/scip/golsky.git
synced 2025-12-17 04:30:57 +01:00
reorganized source, added test cases for tuning
This commit is contained in:
52
src/rule.go
Normal file
52
src/rule.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// a GOL rule
|
||||
type Rule struct {
|
||||
Definition string
|
||||
Birth []int64
|
||||
Death []int64
|
||||
}
|
||||
|
||||
// parse one part of a GOL rule into rule slice
|
||||
func NumbersToList(numbers string) []int64 {
|
||||
list := []int64{}
|
||||
|
||||
items := strings.Split(numbers, "")
|
||||
for _, item := range items {
|
||||
num, err := strconv.ParseInt(item, 10, 64)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to parse game rule part <%s>: %s", numbers, err)
|
||||
}
|
||||
|
||||
list = append(list, num)
|
||||
}
|
||||
|
||||
return list
|
||||
}
|
||||
|
||||
// parse GOL rule, used in CheckRule()
|
||||
func ParseGameRule(rule string) *Rule {
|
||||
parts := strings.Split(rule, "/")
|
||||
|
||||
if len(parts) < 2 {
|
||||
log.Fatalf("Invalid game rule <%s>", rule)
|
||||
}
|
||||
|
||||
golrule := &Rule{Definition: rule}
|
||||
|
||||
for _, part := range parts {
|
||||
if part[0] == 'B' {
|
||||
golrule.Birth = NumbersToList(part[1:])
|
||||
} else {
|
||||
golrule.Death = NumbersToList(part[1:])
|
||||
}
|
||||
}
|
||||
|
||||
return golrule
|
||||
}
|
||||
Reference in New Issue
Block a user