Multistate INT Exploration

For discussion of other cellular automata.
Post Reply
Cyclotrons
Posts: 132
Joined: January 26th, 2021, 12:19 am

Multistate INT Exploration

Post by Cyclotrons »

This thread is to facilitate the exploration of the multistate INT rulespace, as it is rather underexplored at the moment in my opinion (certain subsets aside).

To that end, I will provide an explanation of a notation that can describe every rule within the rulespace, as well as provide a python script to be used in Golly to generate rulefiles for a given rulestring.

-----

Multistate INT is a family of non-totalistic cellular automata that obey D8 [sic] symmetry on the range-1 moore neighborhood. Transitions from one state to any other state can be specified.

Overview

The notation used for this rulespace is a series of constraints that a neighborhood configuration must fulfill for a non-default state transition to occur. By default, every cell will transition to state 0.

Transitions

Transitions signify a cell's state will change to upon advancing the universe a generation, given a constraint is met. A transition from state a to state n is notated as aTn, with a and n standing in for numbers. Also note Bn and Sn, which are shorthand for 0Tn and nTn respectively.

Transitions may be included and omitted freely, and in any order. As conflicting transitions are possible, transitions specified earlier in the rulestring will take priority.

Transitions are delimited by a '/' in front of them, except at the beginning of the rulestring, where it must be omitted.

Constraints

Constraints are the conditions under which a transition is allowed. Under a transition, only one full constraint needs to be satisfied for a state change to occur. Constraints work by specifying the a series of configurations that cells of specific states in the neighborhood must adhere to.

In a constraint, configurations are listed one after another, delimited by ';'. Configurations are specified in the format x+y+z:nh, with x, y, and z representing the cell states being considered, n representing the number of those cells in the neighborhood, h representing a specific shape as defined in hensel notation, and ':' acting as a delimiter between states and configuration. n and h can be omitted if you don't want it to be considered in the configuration.

States don't have to be specified explicitly: in a constraint, state 0, then 1, then 2... is assumed in configurations where states aren't explicitly specified. However, once a state is explicitly specified in a configuration, all following configurations must also be explicitly specified.

Constraints are delimited on both sides by '.', but these may be replaced by either '-' or '/'. '/' may only replace the end delimiter.

An example constraint: .;2a;1c;1+2:3i;2+3:3i;1+2+3:5a;3:2a.
  • state 0 cells are unconstrained
  • state 1 cells must occur in the 2a configuration
  • state 2 cells must occur in the 1c configuration
  • state 3 cells must occur in the 2a configuration
  • state 1 and 2 cells must occur in the 3i configuration
  • state 2 and 3 cells must occur in the 3i configuration
  • state 1, 2, and 3 cells must occur in the 5a configuration
This is the only neighborhood that satisfies this constraint:

Code: Select all

1 1 2
0 o 3
0 0 3
You may also 'compress' constraints as such:
.1,2;3,4,5. expands to .1;3.1;4.1;5.2;3.2;4.2;5.

Subconfigurations

After a constraint, but before its delimiter, you may specify additional constrains in a series of parens ('(', ')'), which means that any neighborhood that satifies the main constraint must also have subconfigurations that would satisfy the constraints within each set of parens.

As an example: .(;2a;1c;1+2:3i;2+3:3i;1+2+3:5a;3:2a). (note: an empty constraint means that all neighborhoods satisfy it) represents

Code: Select all

1 1 2
x o 3
x x 3
where x may be any state.

Negation
Under a transition, a '-' may be used to specify that neighborhoods that satisfy the constraints after it will not cause the transition to occur. These takes priority over non-negated constrains.

-----

Here is the script. Put it in the Rules folder so that it can work properly. Unfortunately, the rulefile conversion (specifically converting to a ruletree) is really slow, with noticeable slowdown by 4 states and is basically unusable by 7.

Code: Select all

basers = ''

#1-msint-ruletreegen.py
#If you are going to rename this script, make sure to also change the occurrences of the name later in the script, as those are how it stores the previously input rule.
#This script, based on RuleTreeGen.py, converts valid Multistate INT rulestrings into rulefiles. Unfortunately, the rulefile conversion (specifically converting to a ruletree) is really slow, with noticeable slowdown by 4 states and is basically unusable by 7.

import copy
import golly

int256 = [[0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,1,1,'c'],
    [0,0,0,0,0,0,1,0,1,'e'],
    [0,0,0,0,0,0,1,1,2,'a'],
    [0,0,0,0,0,1,0,0,1,'c'],
    [0,0,0,0,0,1,0,1,2,'c'],
    [0,0,0,0,0,1,1,0,2,'a'],
    [0,0,0,0,0,1,1,1,3,'i'],
    [0,0,0,0,1,0,0,0,1,'e'],
    [0,0,0,0,1,0,0,1,2,'k'],
    [0,0,0,0,1,0,1,0,2,'e'],
    [0,0,0,0,1,0,1,1,3,'j'],
    [0,0,0,0,1,1,0,0,2,'a'],
    [0,0,0,0,1,1,0,1,3,'n'],
    [0,0,0,0,1,1,1,0,3,'a'],
    [0,0,0,0,1,1,1,1,4,'a'],
    [0,0,0,1,0,0,0,0,1,'c'],
    [0,0,0,1,0,0,0,1,2,'n'],
    [0,0,0,1,0,0,1,0,2,'k'],
    [0,0,0,1,0,0,1,1,3,'q'],
    [0,0,0,1,0,1,0,0,2,'c'],
    [0,0,0,1,0,1,0,1,3,'c'],
    [0,0,0,1,0,1,1,0,3,'n'],
    [0,0,0,1,0,1,1,1,4,'n'],
    [0,0,0,1,1,0,0,0,2,'a'],
    [0,0,0,1,1,0,0,1,3,'q'],
    [0,0,0,1,1,0,1,0,3,'j'],
    [0,0,0,1,1,0,1,1,4,'w'],
    [0,0,0,1,1,1,0,0,3,'i'],
    [0,0,0,1,1,1,0,1,4,'n'],
    [0,0,0,1,1,1,1,0,4,'a'],
    [0,0,0,1,1,1,1,1,5,'a'],
    [0,0,1,0,0,0,0,0,1,'e'],
    [0,0,1,0,0,0,0,1,2,'k'],
    [0,0,1,0,0,0,1,0,2,'i'],
    [0,0,1,0,0,0,1,1,3,'r'],
    [0,0,1,0,0,1,0,0,2,'k'],
    [0,0,1,0,0,1,0,1,3,'y'],
    [0,0,1,0,0,1,1,0,3,'r'],
    [0,0,1,0,0,1,1,1,4,'t'],
    [0,0,1,0,1,0,0,0,2,'e'],
    [0,0,1,0,1,0,0,1,3,'k'],
    [0,0,1,0,1,0,1,0,3,'e'],
    [0,0,1,0,1,0,1,1,4,'j'],
    [0,0,1,0,1,1,0,0,3,'j'],
    [0,0,1,0,1,1,0,1,4,'k'],
    [0,0,1,0,1,1,1,0,4,'r'],
    [0,0,1,0,1,1,1,1,5,'n'],
    [0,0,1,1,0,0,0,0,2,'a'],
    [0,0,1,1,0,0,0,1,3,'q'],
    [0,0,1,1,0,0,1,0,3,'r'],
    [0,0,1,1,0,0,1,1,4,'z'],
    [0,0,1,1,0,1,0,0,3,'n'],
    [0,0,1,1,0,1,0,1,4,'y'],
    [0,0,1,1,0,1,1,0,4,'i'],
    [0,0,1,1,0,1,1,1,5,'r'],
    [0,0,1,1,1,0,0,0,3,'a'],
    [0,0,1,1,1,0,0,1,4,'q'],
    [0,0,1,1,1,0,1,0,4,'r'],
    [0,0,1,1,1,0,1,1,5,'q'],
    [0,0,1,1,1,1,0,0,4,'a'],
    [0,0,1,1,1,1,0,1,5,'j'],
    [0,0,1,1,1,1,1,0,5,'i'],
    [0,0,1,1,1,1,1,1,6,'a'],
    [0,1,0,0,0,0,0,0,1,'c'],
    [0,1,0,0,0,0,0,1,2,'c'],
    [0,1,0,0,0,0,1,0,2,'k'],
    [0,1,0,0,0,0,1,1,3,'n'],
    [0,1,0,0,0,1,0,0,2,'n'],
    [0,1,0,0,0,1,0,1,3,'c'],
    [0,1,0,0,0,1,1,0,3,'q'],
    [0,1,0,0,0,1,1,1,4,'n'],
    [0,1,0,0,1,0,0,0,2,'k'],
    [0,1,0,0,1,0,0,1,3,'y'],
    [0,1,0,0,1,0,1,0,3,'k'],
    [0,1,0,0,1,0,1,1,4,'k'],
    [0,1,0,0,1,1,0,0,3,'q'],
    [0,1,0,0,1,1,0,1,4,'y'],
    [0,1,0,0,1,1,1,0,4,'q'],
    [0,1,0,0,1,1,1,1,5,'j'],
    [0,1,0,1,0,0,0,0,2,'c'],
    [0,1,0,1,0,0,0,1,3,'c'],
    [0,1,0,1,0,0,1,0,3,'y'],
    [0,1,0,1,0,0,1,1,4,'y'],
    [0,1,0,1,0,1,0,0,3,'c'],
    [0,1,0,1,0,1,0,1,4,'c'],
    [0,1,0,1,0,1,1,0,4,'y'],
    [0,1,0,1,0,1,1,1,5,'e'],
    [0,1,0,1,1,0,0,0,3,'n'],
    [0,1,0,1,1,0,0,1,4,'y'],
    [0,1,0,1,1,0,1,0,4,'k'],
    [0,1,0,1,1,0,1,1,5,'k'],
    [0,1,0,1,1,1,0,0,4,'n'],
    [0,1,0,1,1,1,0,1,5,'e'],
    [0,1,0,1,1,1,1,0,5,'j'],
    [0,1,0,1,1,1,1,1,6,'e'],
    [0,1,1,0,0,0,0,0,2,'a'],
    [0,1,1,0,0,0,0,1,3,'n'],
    [0,1,1,0,0,0,1,0,3,'r'],
    [0,1,1,0,0,0,1,1,4,'i'],
    [0,1,1,0,0,1,0,0,3,'q'],
    [0,1,1,0,0,1,0,1,4,'y'],
    [0,1,1,0,0,1,1,0,4,'z'],
    [0,1,1,0,0,1,1,1,5,'r'],
    [0,1,1,0,1,0,0,0,3,'j'],
    [0,1,1,0,1,0,0,1,4,'k'],
    [0,1,1,0,1,0,1,0,4,'j'],
    [0,1,1,0,1,0,1,1,5,'y'],
    [0,1,1,0,1,1,0,0,4,'w'],
    [0,1,1,0,1,1,0,1,5,'k'],
    [0,1,1,0,1,1,1,0,5,'q'],
    [0,1,1,0,1,1,1,1,6,'k'],
    [0,1,1,1,0,0,0,0,3,'i'],
    [0,1,1,1,0,0,0,1,4,'n'],
    [0,1,1,1,0,0,1,0,4,'t'],
    [0,1,1,1,0,0,1,1,5,'r'],
    [0,1,1,1,0,1,0,0,4,'n'],
    [0,1,1,1,0,1,0,1,5,'e'],
    [0,1,1,1,0,1,1,0,5,'r'],
    [0,1,1,1,0,1,1,1,6,'i'],
    [0,1,1,1,1,0,0,0,4,'a'],
    [0,1,1,1,1,0,0,1,5,'j'],
    [0,1,1,1,1,0,1,0,5,'n'],
    [0,1,1,1,1,0,1,1,6,'k'],
    [0,1,1,1,1,1,0,0,5,'a'],
    [0,1,1,1,1,1,0,1,6,'e'],
    [0,1,1,1,1,1,1,0,6,'a'],
    [0,1,1,1,1,1,1,1,7,'e'],
    [1,0,0,0,0,0,0,0,1,'e'],
    [1,0,0,0,0,0,0,1,2,'a'],
    [1,0,0,0,0,0,1,0,2,'e'],
    [1,0,0,0,0,0,1,1,3,'a'],
    [1,0,0,0,0,1,0,0,2,'k'],
    [1,0,0,0,0,1,0,1,3,'n'],
    [1,0,0,0,0,1,1,0,3,'j'],
    [1,0,0,0,0,1,1,1,4,'a'],
    [1,0,0,0,1,0,0,0,2,'i'],
    [1,0,0,0,1,0,0,1,3,'r'],
    [1,0,0,0,1,0,1,0,3,'e'],
    [1,0,0,0,1,0,1,1,4,'r'],
    [1,0,0,0,1,1,0,0,3,'r'],
    [1,0,0,0,1,1,0,1,4,'i'],
    [1,0,0,0,1,1,1,0,4,'r'],
    [1,0,0,0,1,1,1,1,5,'i'],
    [1,0,0,1,0,0,0,0,2,'k'],
    [1,0,0,1,0,0,0,1,3,'q'],
    [1,0,0,1,0,0,1,0,3,'k'],
    [1,0,0,1,0,0,1,1,4,'q'],
    [1,0,0,1,0,1,0,0,3,'y'],
    [1,0,0,1,0,1,0,1,4,'y'],
    [1,0,0,1,0,1,1,0,4,'k'],
    [1,0,0,1,0,1,1,1,5,'j'],
    [1,0,0,1,1,0,0,0,3,'r'],
    [1,0,0,1,1,0,0,1,4,'z'],
    [1,0,0,1,1,0,1,0,4,'j'],
    [1,0,0,1,1,0,1,1,5,'q'],
    [1,0,0,1,1,1,0,0,4,'t'],
    [1,0,0,1,1,1,0,1,5,'r'],
    [1,0,0,1,1,1,1,0,5,'n'],
    [1,0,0,1,1,1,1,1,6,'a'],
    [1,0,1,0,0,0,0,0,2,'e'],
    [1,0,1,0,0,0,0,1,3,'j'],
    [1,0,1,0,0,0,1,0,3,'e'],
    [1,0,1,0,0,0,1,1,4,'r'],
    [1,0,1,0,0,1,0,0,3,'k'],
    [1,0,1,0,0,1,0,1,4,'k'],
    [1,0,1,0,0,1,1,0,4,'j'],
    [1,0,1,0,0,1,1,1,5,'n'],
    [1,0,1,0,1,0,0,0,3,'e'],
    [1,0,1,0,1,0,0,1,4,'j'],
    [1,0,1,0,1,0,1,0,4,'e'],
    [1,0,1,0,1,0,1,1,5,'c'],
    [1,0,1,0,1,1,0,0,4,'j'],
    [1,0,1,0,1,1,0,1,5,'y'],
    [1,0,1,0,1,1,1,0,5,'c'],
    [1,0,1,0,1,1,1,1,6,'c'],
    [1,0,1,1,0,0,0,0,3,'j'],
    [1,0,1,1,0,0,0,1,4,'w'],
    [1,0,1,1,0,0,1,0,4,'j'],
    [1,0,1,1,0,0,1,1,5,'q'],
    [1,0,1,1,0,1,0,0,4,'k'],
    [1,0,1,1,0,1,0,1,5,'k'],
    [1,0,1,1,0,1,1,0,5,'y'],
    [1,0,1,1,0,1,1,1,6,'k'],
    [1,0,1,1,1,0,0,0,4,'r'],
    [1,0,1,1,1,0,0,1,5,'q'],
    [1,0,1,1,1,0,1,0,5,'c'],
    [1,0,1,1,1,0,1,1,6,'n'],
    [1,0,1,1,1,1,0,0,5,'n'],
    [1,0,1,1,1,1,0,1,6,'k'],
    [1,0,1,1,1,1,1,0,6,'c'],
    [1,0,1,1,1,1,1,1,7,'c'],
    [1,1,0,0,0,0,0,0,2,'a'],
    [1,1,0,0,0,0,0,1,3,'i'],
    [1,1,0,0,0,0,1,0,3,'j'],
    [1,1,0,0,0,0,1,1,4,'a'],
    [1,1,0,0,0,1,0,0,3,'q'],
    [1,1,0,0,0,1,0,1,4,'n'],
    [1,1,0,0,0,1,1,0,4,'w'],
    [1,1,0,0,0,1,1,1,5,'a'],
    [1,1,0,0,1,0,0,0,3,'r'],
    [1,1,0,0,1,0,0,1,4,'t'],
    [1,1,0,0,1,0,1,0,4,'j'],
    [1,1,0,0,1,0,1,1,5,'n'],
    [1,1,0,0,1,1,0,0,4,'z'],
    [1,1,0,0,1,1,0,1,5,'r'],
    [1,1,0,0,1,1,1,0,5,'q'],
    [1,1,0,0,1,1,1,1,6,'a'],
    [1,1,0,1,0,0,0,0,3,'n'],
    [1,1,0,1,0,0,0,1,4,'n'],
    [1,1,0,1,0,0,1,0,4,'k'],
    [1,1,0,1,0,0,1,1,5,'j'],
    [1,1,0,1,0,1,0,0,4,'y'],
    [1,1,0,1,0,1,0,1,5,'e'],
    [1,1,0,1,0,1,1,0,5,'k'],
    [1,1,0,1,0,1,1,1,6,'e'],
    [1,1,0,1,1,0,0,0,4,'i'],
    [1,1,0,1,1,0,0,1,5,'r'],
    [1,1,0,1,1,0,1,0,5,'y'],
    [1,1,0,1,1,0,1,1,6,'k'],
    [1,1,0,1,1,1,0,0,5,'r'],
    [1,1,0,1,1,1,0,1,6,'i'],
    [1,1,0,1,1,1,1,0,6,'k'],
    [1,1,0,1,1,1,1,1,7,'e'],
    [1,1,1,0,0,0,0,0,3,'a'],
    [1,1,1,0,0,0,0,1,4,'a'],
    [1,1,1,0,0,0,1,0,4,'r'],
    [1,1,1,0,0,0,1,1,5,'i'],
    [1,1,1,0,0,1,0,0,4,'q'],
    [1,1,1,0,0,1,0,1,5,'j'],
    [1,1,1,0,0,1,1,0,5,'q'],
    [1,1,1,0,0,1,1,1,6,'a'],
    [1,1,1,0,1,0,0,0,4,'r'],
    [1,1,1,0,1,0,0,1,5,'n'],
    [1,1,1,0,1,0,1,0,5,'c'],
    [1,1,1,0,1,0,1,1,6,'c'],
    [1,1,1,0,1,1,0,0,5,'q'],
    [1,1,1,0,1,1,0,1,6,'k'],
    [1,1,1,0,1,1,1,0,6,'n'],
    [1,1,1,0,1,1,1,1,7,'c'],
    [1,1,1,1,0,0,0,0,4,'a'],
    [1,1,1,1,0,0,0,1,5,'a'],
    [1,1,1,1,0,0,1,0,5,'n'],
    [1,1,1,1,0,0,1,1,6,'a'],
    [1,1,1,1,0,1,0,0,5,'j'],
    [1,1,1,1,0,1,0,1,6,'e'],
    [1,1,1,1,0,1,1,0,6,'k'],
    [1,1,1,1,0,1,1,1,7,'e'],
    [1,1,1,1,1,0,0,0,5,'i'],
    [1,1,1,1,1,0,0,1,6,'a'],
    [1,1,1,1,1,0,1,0,6,'c'],
    [1,1,1,1,1,0,1,1,7,'c'],
    [1,1,1,1,1,1,0,0,6,'a'],
    [1,1,1,1,1,1,0,1,7,'e'],
    [1,1,1,1,1,1,1,0,7,'c'],
    [1,1,1,1,1,1,1,1,8,0]]
henselmap = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 8, 2, 0, 0, 5, 0, 0, 7, 9, 0, 10, 0, 0, 11, 0, 6, 12, 0, 0, 0, 0]
def charmap(c):
    if c == 'c':
        return 99
    if c == 'e':
        return 101
    if c == 'k':
        return 107
    if c == 'a':
        return 97
    if c == 'i':
        return 105
    if c == 'n':
        return 110
    if c == 'y':
        return 121
    if c == 'q':
        return 113
    if c == 'j':
        return 106
    if c == 'r':
        return 114
    if c == 't':
        return 116
    if c == 'w':
        return 119
    if c == 'z':
        return 122
    if c == 0:
        return 0
    if c == 127:
        return 127
def find_first_of(targetstr,charset,index=0):
    i = index
    while i < len(targetstr):
        for c in charset:
            if targetstr[i] == c:
                return i
        i = i + 1
    return -1
def find(lis,val):
    for i in range(len(lis)):
        if lis[i] == val:
            return i
    return -1


class TrLeaf:
    def __init__(self):
        self.num = 0
        self.hensel = ''
        self.subTrs = [[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[],[],[],[],[]]]

class TrNode:
    def __init__(self):
        self.nextnode = [0,0]
        self.leaf = TrLeaf()

tree = TrNode()
def set_up_tree():
    config = [0,0,0,0,0,0,0,0]
    for i in range(256):
        currNode = tree
        
        for j in range(8):
            if currNode.nextnode[int256[i][j]] == 0:
                currNode.nextnode[int256[i][j]] = TrNode()
            currNode = currNode.nextnode[int256[i][j]]
        
        lif = TrLeaf()
        lif.num = int256[i][8]
        lif.hensel = charmap(int256[i][9])

        for j in range(256):
            hasST = True
            for k in range(8):
                if int256[j][k] == 0:
                    continue
                if int256[j][k] != int256[i][k]:
                    hasST = False
                    break
            if hasST:
                for k in range(8):
                    config[k] = int256[j][k]
                if (lif.num == 0 and int256[j][8] == 0) or (lif.num != 0 and int256[j][8] != 0):
                    lif.subTrs[int256[j][8]][henselmap[charmap(int256[j][9])]].append(config[:])
        
        currNode.leaf = lif

class ConstraintSection:
    def __init__(self):
        self.states = []
        self.num = 127
        self.hensel = 127
class SubcfgConstraintSect:
    def __init__(self,con):
        self.states = con.states
        self.num = con.num
        self.hensel = con.hensel
        self.childcons = []
class Constraint:
    def __init__(self):
        self.endstate = 0
        self.sections = []
        self.subconfigs = []
        self.subcfgs = []
class StateChanges:
    def __init__(self):
        self.beginState = 0
        self.constraints = []
        self.negconstraints = []

rule = []
newrule = []

tempnumstates = 0
numStates = 0

def decomp_rule(rs):
    rulestring = rs + '/'
    newrs = ""
    inConstraint = False
    currcons = []
    currconsspec = []
    constraintstr = ""
    css = []
    conspecstr = ""

    issub = False
    hassub = False
    for c in rulestring:
        if inConstraint:
            if c == ':':
                conspecstr = constraintstr
                constraintstr = ""
            elif c == ',':
                css.append(constraintstr)
                constraintstr = ""
            elif c in ";().-/":
                if c == ')':
                    continue
                css.append(constraintstr)
                currcons.append(css)
                currconsspec.append(conspecstr)
                constraintstr = ""
                css = []
                conspecstr = ""
                if c in "(.-/":
                    if c == '(' and not issub:
                        hassub = True
                    pms = [0]*len(currcons)
                    tracker = 0
                    while tracker < len(pms):
                        for i in range(len(currcons)):
                            if currconsspec[i] != "":
                                newrs += currconsspec[i] + ":"
                            newrs += currcons[i][pms[i]]
                            if i != len(currcons) - 1:
                                newrs += ";"
                        if hassub:
                            newrs = newrs + "|"
                        while True:
                            pms[tracker] += 1
                            if pms[tracker] == len(currcons[tracker]):
                                pms[tracker] = 0
                                tracker += 1
                                if tracker == len(pms):
                                    break
                            else:
                                tracker = 0
                                break
                        if issub:
                            newrs += ")"
                        if tracker < len(pms):
                            if issub:
                                newrs += "("
                            else:
                                newrs += "."
                    newrs += c
                    if c == '(':
                        issub = True
                        hassub = False
                    else:
                        issub = False
                    if c == '/':
                        inConstraint = False
                    currcons = []
                    currconsspec = []
            else:
                constraintstr += c
        else:
            newrs = newrs + c
            if c in ".-":
                inConstraint = True
                continue
    
    newnewrs = ""
    inConstraint = False
    inscfsect = False
    scfsectstr = ""
    for c in newrs:
        if inConstraint:
            if not inscfsect:
                if c == '(':
                    inscfsect = True
                else:
                    newnewrs += c
            if inscfsect:
                if c in ".-/":
                    inscfsect = False
                    newnewrs = newnewrs.replace('|',scfsectstr)
                    scfsectstr = ""
                    newnewrs += c
                else:
                    scfsectstr += c
            if c == '/':
                inConstraint = False
        else:
            newnewrs = newnewrs + c
            if c in ".-":
                inConstraint = True
    return newnewrs[:-1]
def valid_rulestring(rs):
    rulestring = rs + "/"
    
    numstates = 0
    numStr = ""
    stateChangeSpec = True
    stateConSpec = False
    numConStates = 0
    preCol = False

    numnums = 0
    numhensels = 0
    numnegs = 0
    numBSTs = 0
    hasBST = False
    statesInCon = [[]]

    for i in range(len(rulestring)):
        if stateChangeSpec:
            if rulestring[i] in "0123456789":
                numStr = numStr + rulestring[i]
            elif rulestring[i] in "BST.-/":
                if rulestring[i] in "BS":
                    numBSTs = numBSTs + 1
                    hasBST = True
                    continue
                if rulestring[i] == "T" and numStr == "":
                    return False
                if int(numStr) > numstates:
                    numstates = int(numStr)
                if rulestring[i] == "T":
                    numBSTs = numBSTs + 1
                    hasBST = True
                    numStr = ""
                if rulestring[i] in ".-":
                    stateChangeSpec = False
                    if find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i) and rulestring.find(':',i) != -1:
                        stateConSpec = True
                        preCol = True
                    numStr = ""
                    numnegs = 0
                    if rulestring[i] == "-":
                        numnegs = numnegs + 1
                    if numBSTs > 1:
                        return False
            else:
                return False
        else:
            if not (rulestring[i] in ";()./-:+0123456789cekainyqjrtwz"):
                return False
            if rulestring[i] in ";()./-":
                if numnums > 1 or numhensels > 1:
                    return False
                numnums = 0
                numhensels = 0
                if rulestring[i] == "-":
                    numnegs = numnegs + 1
                if numnegs > 1:
                    return False
                if not stateConSpec:
                    if numConStates > numstates:
                        numstates = numConStates
                    if rulestring[i] == ';':
                        numConStates = numConStates + 1
                    else:
                        numConStates = 0
                if find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i) and rulestring.find(':',i) != -1:
                    stateConSpec = True
                if stateConSpec:
                    if preCol:
                        return False
                    preCol = True
            if (rulestring[i] in "()./-") and not (find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i) and rulestring.find(':',i) != -1):
                stateConSpec = False
                preCol = False
                numConStates = 0
            if preCol and rulestring[i] not in ";()./-":
                if rulestring[i] == ':':
                    if find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i+1) and rulestring.find(':',i+1) != -1:
                        return False
                    preCol = False
                    if numStr == "":
                        return False
                    numConStates = int(numStr)
                    if numConStates > numstates:
                        numstates = numConStates
                    numStr = ""
                elif rulestring[i] == '+':
                    if numStr == "":
                        return False
                    numConStates = int(numStr)
                    if numConStates > numstates:
                        numstates = numConStates
                    numStr = ""
                elif rulestring[i] in "0123456789":
                    numStr = numStr + rulestring[i]
                else:
                    return False
            elif rulestring[i] not in ";()./-":
                if rulestring[i] in "012345678":
                    numnums = numnums + 1
                elif rulestring[i] in "cekainyqjrtwz":
                    numhensels = numhensels + 1
                else:
                    return False
        if rulestring[i] == '/':
            if not hasBST:
                return False
            stateChangeSpec = True
            numStr = ""
            numBSTs = 0
            hasBST = False

    inSubcon = False
    for i in range(len(rulestring)):
        if rulestring[i] == '(':
            if inSubcon:
                return False
            inSubcon = True
        elif rulestring[i] == ')':
            if not inSubcon:
                return False
            inSubcon = False
        elif inSubcon:
            if rulestring[i] in "./-":
                return False
    
    global newrule
    newrule = []
    for i in range(numstates + 1):
        newrule.append(StateChanges())
        newrule[i].beginState = i
    global tempnumstates
    tempnumstates = numstates

    return True
def parse_rulestring(rs):
    rulestring = rs + "/"
    global newrule

    beginStateStr = ""
    sameEnd = False
    endStateStr = ""
    inStateChange = True
    doEndState = False

    inConstraint = False
    constraint = Constraint()
    cs = ConstraintSection()
    subconfig = []
    sectionState = 0
    sectionStateStr = ""
    explicitStates = False
    inSpecifyingStates = False
    inSubconfig = False

    negConstraint = False
    constrained = False

    for i in range(len(rulestring)):
        if inStateChange:
            if rulestring[i] in ".-":
                if beginStateStr != "":
                    beginState = int(beginStateStr)
                endState = int(endStateStr)
                if sameEnd:
                    beginState = endState
                beginStateStr = ""
                endStateStr = ""
                doEndState = False
                sameEnd = False
                inStateChange = False
                inConstraint = True
                if rulestring[i] == '-':
                    negConstraint = True
                if find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i+1) and rulestring.find(':',i+1) != -1:
                    explicitStates = True
                    inSpecifyingStates = True
                continue
            if rulestring[i] == 'T':
                doEndState = True
                continue
            if not doEndState:
                if rulestring[i] == 'B':
                    beginState = 0
                    doEndState = True
                elif rulestring[i] == 'S':
                    sameEnd = True
                    doEndState = True
                else:
                    beginStateStr = beginStateStr + rulestring[i]
            else:
                endStateStr = endStateStr + rulestring[i]
        if inConstraint:
            constraint.endState = endState
            if rulestring[i] in ";()./-":
                if not explicitStates:
                    cs.states.append(sectionState)
                    sectionState = sectionState + 1
                if find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i+1) and rulestring.find(':',i+1) != -1:
                    explicitStates = True
                if explicitStates:
                    inSpecifyingStates = True
                if constrained:
                    if not inSubconfig:
                        constraint.sections.append(copy.deepcopy(cs))
                    else:
                        subconfig.append(copy.deepcopy(cs))
                constrained = False
                cs = ConstraintSection()
            if rulestring[i] == '(':
                inSubconfig = True
                if not (find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i+1) and rulestring.find(':',i+1) != -1):
                    explicitStates = False
                    inSpecifyingStates = False
                sectionState = 0
            elif rulestring[i] == ')':
                constraint.subconfigs.append(copy.deepcopy(subconfig))
                subconfig = []
            elif rulestring[i] in "./-":
                if not negConstraint:
                    newrule[beginState].constraints.append(copy.deepcopy(constraint))
                else:
                    newrule[beginState].negconstraints.append(copy.deepcopy(constraint))
                constraint = Constraint()
                if not (find_first_of(rulestring,";()./-",i+1) > rulestring.find(':',i+1) and rulestring.find(':',i+1) != -1):
                    explicitStates = False
                    inSpecifyingStates = False
                sectionState = 0
                inSubconfig = False
            if rulestring[i] == "-":
                negConstraint = True
            if inSpecifyingStates and not rulestring[i] in ";()./-":
                if rulestring[i] == ':':
                    inSpecifyingStates = False
                    cs.states.append(int(sectionStateStr))
                    sectionStateStr = ""
                elif rulestring[i] == '+':
                    cs.states.append(int(sectionStateStr))
                    sectionStateStr = ""
                else:
                    sectionStateStr = sectionStateStr + rulestring[i]
            else:
                if rulestring[i] in "012345678":
                    cs.num = int(rulestring[i])
                    constrained = True
                elif rulestring[i] in "cekainyqjrtwz":
                    cs.hensel = charmap(rulestring[i])
                    constrained = True
        if rulestring[i] == '/':
            inConstraint = False
            inStateChange = True
            negConstraint = False
            beginStateStr = ""
            endStateStr = ""
            doEndState = False
            sameEnd = False
def unique_states():
    global newrule
    for i in range(len(newrule)):
        for j in range(len(newrule[i].constraints)):
            for k in range(len(newrule[i].constraints[j].sections)):
                for l in range(len(newrule[i].constraints[j].sections[k].states)):
                    for m in range(l+1,len(newrule[i].constraints[j].sections[k].states)):
                        if newrule[i].constraints[j].sections[k].states[l] == newrule[i].constraints[j].sections[k].states[m]:
                            return False
            for k in range(len(newrule[i].constraints[j].subconfigs)):
                for l in range(len(newrule[i].constraints[j].subconfigs[k])):
                    for m in range(len(newrule[i].constraints[j].subconfigs[k][l].states)):
                        for n in range(m+1,len(newrule[i].constraints[j].subconfigs[k][l].states)):
                            if newrule[i].constraints[j].subconfigs[k][l].states[m] == newrule[i].constraints[j].subconfigs[k][l].states[n]:
                                return False
        for j in range(len(newrule[i].negconstraints)):
            for k in range(len(newrule[i].negconstraints[j].sections)):
                for l in range(len(newrule[i].negconstraints[j].sections[k].states)):
                    for m in range(l+1,len(newrule[i].negconstraints[j].sections[k].states)):
                        if newrule[i].negconstraints[j].sections[k].states[l] == newrule[i].negconstraints[j].sections[k].states[m]:
                            return False
            for k in range(len(newrule[i].negconstraints[j].subconfigs)):
                for l in range(len(newrule[i].negconstraints[j].subconfigs[k])):
                    for m in range(len(newrule[i].negconstraints[j].subconfigs[k][l].states)):
                        for n in range(m+1,len(newrule[i].negconstraints[j].subconfigs[k][l].states)):
                            if newrule[i].negconstraints[j].subconfigs[k][l].states[m] == newrule[i].negconstraints[j].subconfigs[k][l].states[n]:
                                return False
    for i in range(len(newrule)):
        for j in range(len(newrule[i].constraints)):
            for k in range(len(newrule[i].constraints[j].sections)):
                for l in range(k+1,len(newrule[i].constraints[j].sections)):
                    if len(newrule[i].constraints[j].sections[k].states) == len(newrule[i].constraints[j].sections[l].states):
                        allIn = True
                        for m in range(len(newrule[i].constraints[j].sections[l].states)):
                            if find(newrule[i].constraints[j].sections[k].states,newrule[i].constraints[j].sections[l].states[m]) == -1:
                                allIn = False
                        if allIn:
                            return False
            for k in range(len(newrule[i].constraints[j].subconfigs)):
                for l in range(len(newrule[i].constraints[j].subconfigs[k])):
                    for m in range(l+1,len(newrule[i].constraints[j].subconfigs[k])):
                        if len(newrule[i].constraints[j].subconfigs[k][l].states) == len(newrule[i].constraints[j].subconfigs[k][m].states):
                            allIn = True
                            for n in range(len(newrule[i].constraints[j].subconfigs[k][m].states)):
                                if find(newrule[i].constraints[j].subconfigs[k][l].states,newrule[i].constraints[j].subconfigs[k][m].states[n]) == -1:
                                    allIn = False
                            if allIn:
                                return False
        for j in range(len(newrule[i].negconstraints)):
            for k in range(len(newrule[i].negconstraints[j].sections)):
                for l in range(k+1,len(newrule[i].negconstraints[j].sections)):
                    if len(newrule[i].negconstraints[j].sections[k].states) == len(newrule[i].negconstraints[j].sections[l].states):
                        allIn = True
                        for m in range(len(newrule[i].negconstraints[j].sections[l].states)):
                            if find(newrule[i].negconstraints[j].sections[k].states,newrule[i].negconstraints[j].sections[l].states[m]) == -1:
                                allIn = False
                        if allIn:
                            return False
            for k in range(len(newrule[i].negconstraints[j].subconfigs)):
                for l in range(len(newrule[i].negconstraints[j].subconfigs[k])):
                    for m in range(l+1,len(newrule[i].negconstraints[j].subconfigs[k])):
                        if len(newrule[i].negconstraints[j].subconfigs[k][l].states) == len(newrule[i].negconstraints[j].subconfigs[k][m].states):
                            allIn = True
                            for n in range(len(newrule[i].negconstraints[j].subconfigs[k][m].states)):
                                if find(newrule[i].negconstraints[j].subconfigs[k][l].states,newrule[i].negconstraints[j].subconfigs[k][m].states[n]) == -1:
                                    allIn = False
                            if allIn:
                                return False
    return True
def process_rule():
    global rule
    largest = 0
    temp = []
    for i in range(len(rule)):
        for j in range(len(rule[i].constraints)):
            for k in range(len(rule[i].constraints[j].subconfigs)):
                for l in range(len(rule[i].constraints[j].subconfigs[k])):
                    if len(rule[i].constraints[j].subconfigs[k][l].states) > largest:
                        largest = len(rule[i].constraints[j].subconfigs[k][l].states)
                while largest > 0:
                    for l in range(len(rule[i].constraints[j].subconfigs[k])):
                        if len(rule[i].constraints[j].subconfigs[k][l].states) == largest:
                            temp.append(copy.deepcopy(rule[i].constraints[j].subconfigs[k][l]))
                    largest = largest - 1
                rule[i].constraints[j].subconfigs[k] = copy.deepcopy(temp)
                temp = []
        for j in range(len(rule[i].negconstraints)):
            for k in range(len(rule[i].negconstraints[j].subconfigs)):
                for l in range(len(rule[i].negconstraints[j].subconfigs[k])):
                    if len(rule[i].negconstraints[j].subconfigs[k][l].states) > largest:
                        largest = len(rule[i].negconstraints[j].subconfigs[k][l].states)
                while largest > 0:
                    for l in range(len(rule[i].negconstraints[j].subconfigs[k])):
                        if len(rule[i].negconstraints[j].subconfigs[k][l].states) == largest:
                            temp.append(copy.deepcopy(rule[i].negconstraints[j].subconfigs[k][l]))
                    largest = largest - 1
                rule[i].negconstraints[j].subconfigs[k] = copy.deepcopy(temp)
                temp = []
def p2_helper(curr,cs):
    bottom = True
    inthere = True
    for i in range(len(curr.childcons)):
        inthere = True
        for j in range(len(cs.states)):
            if find(curr.childcons[i].states,cs.states[j]) == -1:
                inthere = False
                break
        if inthere:
            bottom = False
            p2_helper(curr.childcons[i],cs)
    if bottom:
        curr.childcons.append(SubcfgConstraintSect(cs))
def process_rule_p2():
    temp = ConstraintSection()
    temp.states.append(-1)
    for i in range(len(rule)):
        for j in range(len(rule[i].constraints)):
            for k in range(len(rule[i].constraints[j].subconfigs)):
                rule[i].constraints[j].subcfgs.append(SubcfgConstraintSect(temp))
                for l in range(len(rule[i].constraints[j].subconfigs[k])):
                    p2_helper(rule[i].constraints[j].subcfgs[k],rule[i].constraints[j].subconfigs[k][l])
        for j in range(len(rule[i].negconstraints)):
            for k in range(len(rule[i].negconstraints[j].subconfigs)):
                rule[i].negconstraints[j].subcfgs.append(SubcfgConstraintSect(temp))
                for l in range(len(rule[i].negconstraints[j].subconfigs[k])):
                    p2_helper(rule[i].negconstraints[j].subcfgs[k],rule[i].negconstraints[j].subconfigs[k][l])

def mask_neighborhood(nh,target,unmaskedStates):
    for i in range(8):
        isUnmasked = False
        for j in unmaskedStates:
            if nh[i] == j:
                isUnmasked = True
                break
        target[i] = isUnmasked
def has_subconstraint(nh,cs):
    global tree
    
    maskednh = [0,0,0,0,0,0,0,0]
    mask_neighborhood(nh,maskednh,cs.states)
    currNode = tree
    for i in range(8):
        currNode = currNode.nextnode[maskednh[i]]
    if cs.num != 127 and cs.num != currNode.leaf.num:
        return False
    if cs.hensel != 127 and cs.hensel != currNode.leaf.hensel:
        return False
    return True
def semi_mask(nh,target,mask):
    for i in range(8):
        if mask[i]:
            target[i] = nh[i]
        else:
            target[i] = -1
def in_subconfig(nh,subconfig,mask=[True,True,True,True,True,True,True,True]):
    global tree
    currTree = tree

    maskedNH = [0,0,0,0,0,0,0,0]
    doubleMasked = [True,True,True,True,True,True,True,True]
    semi_mask(nh,maskedNH,mask)
    mask_neighborhood(maskedNH,doubleMasked,subconfig.states)
    for i in range(8):
        currTree = currTree.nextnode[doubleMasked[i]]
    
    if subconfig.states[0] == -1:
        inNH = True
        for i in subconfig.childcons:
            if not in_subconfig(nh,i):
                inNH = False
                break
        if inNH:
            return True
    elif subconfig.num == 127:
        if len(subconfig.childcons) != 0:
            for i in range(9):
                for j in currTree.leaf.subTrs[i][henselmap[subconfig.hensel]]:
                    inNH = True
                    for k in subconfig.childcons:
                        if not in_subconfig(nh,k,j):
                            inNH = False
                            break
                    if inNH:
                        return True
        else:
            for i in range(9):
                if len(currTree.leaf.subTrs[i][henselmap[subconfig.hensel]]) != 0:
                    return True
    elif subconfig.hensel == 127:
        if len(subconfig.childcons) != 0:
            for i in range(13):
                for j in currTree.leaf.subTrs[subconfig.num][i]:
                    inNH = True
                    for k in subconfig.childcons:
                        if not in_subconfig(nh,k,j):
                            inNH = False
                            break
                    if inNH:
                        return True
        else:
            for i in range(13):
                if len(currTree.leaf.subTrs[subconfig.num][i]) != 0:
                    return True
    else:
        if len(subconfig.childcons) != 0:
            for i in currTree.leaf.subTrs[subconfig.num][henselmap[subconfig.hensel]]:
                inNH = True
                for k in subconfig.childcons:
                    if not in_subconfig(nh,k,i):
                        inNH = False
                        break
                if inNH:
                    return True
        else:
            if len(currTree.leaf.subTrs[subconfig.num][henselmap[subconfig.hensel]]) != 0:
                return True
    return False


def load_rule(rs):
    global rule
    global newrule
    global numStates
    global tempnumstates
    set_up_tree()
    r = decomp_rule(rs)
    if not valid_rulestring(r):
        return False
    parse_rulestring(r)
    if not unique_states():
        return False
    rule = newrule
    numStates = tempnumstates
    process_rule()
    process_rule_p2()
    return True
def transition(n,ne,e,se,s,sw,w,nw,center):
    global numStates
    global rule
    
    nh = [n,ne,e,se,s,sw,w,nw]

    negged = [False]*(numStates+1)
    for i in rule[center].negconstraints:
        if not negged[i.endState]:
            hasConstraint = True
            for j in i.sections:
                hasConstraint = has_subconstraint(nh,j)
                if not hasConstraint:
                    break
            if hasConstraint:
                for j in i.subcfgs:
                    hasConstraint = in_subconfig(nh,j)
                    if not hasConstraint:
                        break
            negged[i.endState] = hasConstraint
    end = 0
    for i in rule[center].constraints:
        if not negged[i.endState]:
            hasConstraint = True
            for j in i.sections:
                hasConstraint = has_subconstraint(nh,j)
                if not hasConstraint:
                    break
            if hasConstraint:
                for j in i.subcfgs:
                    hasConstraint = in_subconfig(nh,j)
                    if not hasConstraint:
                        break
            if hasConstraint:
                end = i.endState
                break
    return end


class GenerateRuleTree:

    def __init__(self,numStates,numNeighbors,f):
    
        self.numParams = numNeighbors + 1 ;
        self.world = {}
        self.r = []
        self.params = [0]*self.numParams
        self.nodeSeq = 0
        self.numStates = numStates
        self.numNeighbors = numNeighbors
        self.f = f
        
        self.recur(self.numParams)
        #self.writeRuleTree()

    def getNode(self,n):
        if n in self.world:
            return self.world[n]
        else:
            new_node = self.nodeSeq
            self.nodeSeq += 1
            self.r.append(n)
            self.world[n] = new_node
            return new_node

    def recur(self,at):
        if at == 0:
            return self.f(self.params)
        n = str(at)
        for i in range(self.numStates):
            self.params[self.numParams-at] = i
            n += " " + str(self.recur(at-1))
        return self.getNode(n)
      
    def writeRuleTree(self):
        t = ""
        t = t + "num_states=" + str(self.numStates) + "\n"
        t = t + "num_neighbors=" + str(self.numNeighbors) + "\n"
        t = t + "num_nodes=" + str(len(self.r)) + "\n"
        for rule in self.r:
            t = t + str(rule) + "\n"
        return t

# define your own transition function here:
def my_transition_function(a):
    #n,ne,e,se,s,sw,w,nw,c
    #nw,ne,sw,se,n,w,e,s,c
    #4,1,6,3,7,2,5,0,8
    #se,sw,ne,nw,s,e,w,n,c
    #7,2,5,0,4,1,6,3,8
    
   return transition(a[4],a[1],a[6],a[3],a[7],a[2],a[5],a[0],a[8])

# call the rule tree generator with your chosen parameters
rulestring = golly.getstring("Input Multistate INT rulestring:",basers)
#rulestring = "B1.;3/S1.;2.;3"
if not load_rule(rulestring):
    golly.warn("Invalid rulestring!")
else:
    s = GenerateRuleTree(numStates+1,8,my_transition_function)
    rtr = s.writeRuleTree()

    prunedrs = rulestring.replace('/','_').replace(':','_')[:100]

    rftext = "@RULE " + prunedrs + "\n\nFull Rulestring:\n" + rulestring + "\n\n@TREE\n" + rtr
    f = open(prunedrs + ".rule","w")
    f.write(rftext)
    f.close()
    
    f = open("1-msint-ruletreegen.py","r")
    n = 0
    st = ""
    for x in f:
        if n == 0:
            n = 1
            continue
        st = st + x
    f.close()
    f = open("1-msint-ruletreegen.py","w")
    f.write("basers = '" + rulestring + "'\n" + st)
    f.close()
    golly.setrule(prunedrs)
edit: fixed a bug where the rule would generate with 1 more state than it should have. inconsequential outside of making soup generation a bit irritating when the bug did actually occur

-----

Here are some preexisting rules in this notation:

Code: Select all

B1.;3/S1.;2.;3 - Life
B1.;2/1T2. - Brian's Brain
B1.;3;0/B2.;0;3/S1.;;1,2,3,4,5,6,7,8.;2,3/S2.;1,2,3,4,5,6,7,8.;;2,3 - Symbiosis
1T2./2T3./3T1.;1.;2/S3. - Wireworld
B1.;2k,2a;;0,2,3.;1;;2,3/S1.;3a,3j,3k,3r;;0/1T2./S3. - Fireworld
Last edited by Cyclotrons on September 16th, 2023, 7:00 pm, edited 1 time in total.
I wrote a stdin script that generates random soups of a provided number of a given spaceship. It works for all (non-B0) spaceships in the INT rulespace!
A Multistate INT notation + script.
Cyclotrons
Posts: 132
Joined: January 26th, 2021, 12:19 am

Re: Multistate INT Exploration

Post by Cyclotrons »

Some more rulestrings for extant rules:

Code: Select all

B1.;3/B2.;;3/B3.3:3/2T1.;3/3T1.;3/3T2.;;3/S1.;2,3/S2.;;2,3/S3.3:2,3/1T3.3:3-;;3/1T2./2T3. - Brew
B1.;1,2;0;1.;0;0;3.;6;0;0/B2.;1;1,2;0.;3;0;0.;0;6;0/B3.;0;1;1,2.;0;3;0.;0;0;6/S1.;2,3;0;0.;0;2,3;0.;0;0;2,3.;3;1;0/S2.;2,3;0;0.;0;2,3;0.;0;0;2,3.;0;3;1/S3.;2,3;0;0.;0;2,3;0.;0;0;2,3.;1;0;3 - GliderWorld
B1.;1,4;0;1.;0;0;3.;0;1;2.;2;2;0/B2.;1;1,4;0.;3;0;0.;2;0;1.;0;2;2/B3.;0;1;1,4.;0;3;0.;1;2;0.;2;0;2/S1.;2,3;0;0.;0;2,3;0.;0;0;2,3.;3;1;0/S2.;2,3;0;0.;0;2,3;0.;0;0;2,3.;0;3;1/S3.;2,3;0;0.;0;2,3;0.;0;0;2,3.;1;0;3 - Firework
I did some rulegolfing of the stable diagonal photon rule from earlier (B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c/1T2.;0;2e/S1.;4i;0) and found some interesting stuff.

A variant with a p90, some very compute-y looking dynamics.

Code: Select all

#B1.;1;0.;8.;3;3.;2;4/B2.;2a;0.5e;1e;2i.6a;1.6i;1c/1T2.;0;2e/S1.;4i;0/S2.;0;2,3
x = 48, y = 64, rule = B1.;1;0.;8.;3;3.;2;4_B2.;2a;0.5e;1e;2i.6a;1.6i;1c_1T2.;0;2e_S1.;4i;0_S2.;0;2,3
46.2B$47.B6$45.2B$46.B2$36.2BA$38.B$38.B4$5.2B14.2B7.2BA$5.B11.2BA2.B
9.B$7.2B10.B12.B$8.B13.2B$18.B.B2.2B$10.2B8.2B$11.B9.B$31.BA$29.B2.B$
5.2B25.B$6.B5.B2.2A8.B$11.B.B10.2B$6.B5.2B.A.B$6.2B9.2B10.B$3.B11.B
12.2B$3.2B.2B.2B6.A$6.B2.B5.2B$18.2B$17.2B4.A2BA$14.B5.2B$7.2B4.2B5.B
.B.B2.B$2B6.B3.B8.2B3.2B$B4.2B3.2B14.B$6.2B.2B$3.2B20.2A$4.2B13.B3.B
4.B$19.2A.2B3.2B$27.B2.B$21.2B.2A3.2B$15.2B4.B$15.A2B3$33.2B$34.B2$
10.B21.BA$10.2B9$40.2B$40.2B!
@RULE B1.;1;0.;8.;3;3.;2;4_B2.;2a;0.5e;1e;2i.6a;1.6i;1c_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8.;3;3.;2;4/B2.;2a;0.5e;1e;2i.6a;1.6i;1c/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=129
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
2 9 10 9
3 5 7 11
4 6 8 12
3 7 7 7
2 10 0 0
3 7 7 15
4 8 14 16
2 0 0 9
2 0 0 10
2 4 0 9
3 18 19 20
3 19 7 7
2 9 0 0
3 20 7 23
4 21 22 24
5 13 17 25
2 1 10 10
3 27 15 15
4 28 14 14
4 14 14 14
5 29 30 30
2 0 10 9
2 9 0 9
3 32 15 33
3 33 7 23
4 34 14 35
3 23 7 7
4 35 14 37
5 36 30 38
6 26 31 39
3 27 7 7
3 15 7 7
4 41 42 42
5 43 30 30
1 0 1 0
2 45 0 0
3 7 46 7
4 14 47 14
2 0 0 1
3 7 7 49
4 14 14 50
2 0 1 1
3 7 49 52
4 14 50 53
5 48 51 54
3 7 52 2
4 14 53 56
5 30 54 57
6 44 55 58
3 32 7 33
4 60 42 35
5 61 30 38
3 7 2 7
4 37 56 63
5 38 57 64
6 62 58 65
7 40 59 66
3 3 15 15
4 68 14 14
4 42 14 14
5 69 70 70
2 0 45 0
3 72 7 7
4 73 14 50
5 30 74 54
6 71 75 58
5 30 51 54
3 49 7 3
4 50 14 78
5 51 30 79
3 52 3 3
4 53 78 81
5 54 79 82
6 77 80 83
3 2 3 7
4 56 81 85
5 57 82 86
6 58 83 87
7 76 84 88
3 18 15 33
4 90 14 35
5 91 70 38
6 92 58 65
4 63 85 14
5 64 86 94
6 65 87 95
7 93 88 96
8 67 89 97
4 8 42 42
5 99 70 70
6 100 77 58
6 75 80 83
7 101 102 88
6 55 80 83
4 14 63 14
5 30 105 30
4 78 14 8
5 79 30 107
6 80 106 108
4 81 8 8
5 82 107 110
6 83 108 111
7 104 109 112
4 85 8 14
5 86 110 114
6 87 111 115
7 88 112 116
8 103 113 117
3 18 7 33
4 119 42 35
5 120 70 38
6 121 58 65
7 122 88 96
5 94 114 30
6 95 115 124
7 96 116 125
8 123 117 126
9 98 118 127
Another variant merged with Life. Lots of puffers, but surprisingly still nonexplosive.

Code: Select all

#B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3
x = 89, y = 23, rule = B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3
4.2B$4.2B3$2B$2B5$88.A6$12.2B$12.2B3$20.A2B$20.B$20.B!

@RULE B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=101
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
1 2 0 2
2 9 10 11
3 5 7 12
4 6 8 13
3 7 7 7
2 10 0 0
3 7 7 16
4 8 15 17
2 0 0 9
2 0 0 10
2 4 0 11
3 19 20 21
3 20 7 7
2 11 0 0
3 21 7 24
4 22 23 25
5 14 18 26
2 1 10 10
3 28 16 16
4 29 15 15
4 15 15 15
5 30 31 31
2 0 10 9
2 9 0 11
3 33 16 34
3 34 7 24
4 35 15 36
3 24 7 7
4 36 15 38
5 37 31 39
6 27 32 40
3 28 7 7
3 16 7 7
4 42 43 43
5 44 31 31
1 0 1 0
2 46 0 0
3 7 47 7
4 15 48 15
5 49 31 31
5 31 31 31
6 45 50 51
3 33 7 34
4 53 43 36
5 54 31 39
4 38 15 15
5 39 31 56
6 55 51 57
7 41 52 58
3 3 16 16
4 60 15 15
4 43 15 15
5 61 62 62
2 0 46 0
3 64 7 7
4 65 15 15
5 31 66 31
6 63 67 51
6 51 51 51
7 68 69 69
3 19 16 34
4 71 15 36
5 72 62 39
6 73 51 57
5 56 31 31
6 57 51 75
7 74 69 76
8 59 70 77
4 8 43 43
5 79 62 62
6 80 51 51
6 67 51 51
7 81 82 69
6 50 51 51
3 7 2 7
4 15 85 15
5 31 86 31
6 51 87 51
7 84 88 69
7 69 69 69
8 83 89 90
3 19 7 34
4 92 43 36
5 93 62 39
6 94 51 57
7 95 69 76
6 75 51 51
7 76 69 97
8 96 90 98
9 78 91 99
More rulegolfing of the base rule is encouraged.
I wrote a stdin script that generates random soups of a provided number of a given spaceship. It works for all (non-B0) spaceships in the INT rulespace!
A Multistate INT notation + script.
Cyclotrons
Posts: 132
Joined: January 26th, 2021, 12:19 am

Re: Multistate INT Exploration

Post by Cyclotrons »

Some more stuff for the life-like rule:

gun:

Code: Select all

x = 48, y = 41, rule = B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3
2B$2B2$5.A2B$5.B$5.B2$9.A2B$9.B$9.B6$17.A2B$17.B$17.B2$21.A2B$21.B$
21.B6$29.A2B$29.B$29.B2$33.A2B2.B$33.B3.B.B.2B3.B$33.B4.2B.2B2.B.B$
46.B$41.A$46.B$34.B2.2B2.2B2.B.B$32.3B2.2B2.2B3.B$31.B$31.2B!

@RULE B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=101
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
1 2 0 2
2 9 10 11
3 5 7 12
4 6 8 13
3 7 7 7
2 10 0 0
3 7 7 16
4 8 15 17
2 0 0 9
2 0 0 10
2 4 0 11
3 19 20 21
3 20 7 7
2 11 0 0
3 21 7 24
4 22 23 25
5 14 18 26
2 1 10 10
3 28 16 16
4 29 15 15
4 15 15 15
5 30 31 31
2 0 10 9
2 9 0 11
3 33 16 34
3 34 7 24
4 35 15 36
3 24 7 7
4 36 15 38
5 37 31 39
6 27 32 40
3 28 7 7
3 16 7 7
4 42 43 43
5 44 31 31
1 0 1 0
2 46 0 0
3 7 47 7
4 15 48 15
5 49 31 31
5 31 31 31
6 45 50 51
3 33 7 34
4 53 43 36
5 54 31 39
4 38 15 15
5 39 31 56
6 55 51 57
7 41 52 58
3 3 16 16
4 60 15 15
4 43 15 15
5 61 62 62
2 0 46 0
3 64 7 7
4 65 15 15
5 31 66 31
6 63 67 51
6 51 51 51
7 68 69 69
3 19 16 34
4 71 15 36
5 72 62 39
6 73 51 57
5 56 31 31
6 57 51 75
7 74 69 76
8 59 70 77
4 8 43 43
5 79 62 62
6 80 51 51
6 67 51 51
7 81 82 69
6 50 51 51
3 7 2 7
4 15 85 15
5 31 86 31
6 51 87 51
7 84 88 69
7 69 69 69
8 83 89 90
3 19 7 34
4 92 43 36
5 93 62 39
6 94 51 57
7 95 69 76
6 75 51 51
7 76 69 97
8 96 90 98
9 78 91 99

Code: Select all

x = 48, y = 43, rule = B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3
2B$2B32$38.B$37.B.B.2B3.B$38.2B.2B2.B.B$46.B$41.A$46.B$34.B2.2B2.2B2.
B.B$32.3B2.2B2.2B3.B$31.B$31.2B!

@RULE B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=101
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
1 2 0 2
2 9 10 11
3 5 7 12
4 6 8 13
3 7 7 7
2 10 0 0
3 7 7 16
4 8 15 17
2 0 0 9
2 0 0 10
2 4 0 11
3 19 20 21
3 20 7 7
2 11 0 0
3 21 7 24
4 22 23 25
5 14 18 26
2 1 10 10
3 28 16 16
4 29 15 15
4 15 15 15
5 30 31 31
2 0 10 9
2 9 0 11
3 33 16 34
3 34 7 24
4 35 15 36
3 24 7 7
4 36 15 38
5 37 31 39
6 27 32 40
3 28 7 7
3 16 7 7
4 42 43 43
5 44 31 31
1 0 1 0
2 46 0 0
3 7 47 7
4 15 48 15
5 49 31 31
5 31 31 31
6 45 50 51
3 33 7 34
4 53 43 36
5 54 31 39
4 38 15 15
5 39 31 56
6 55 51 57
7 41 52 58
3 3 16 16
4 60 15 15
4 43 15 15
5 61 62 62
2 0 46 0
3 64 7 7
4 65 15 15
5 31 66 31
6 63 67 51
6 51 51 51
7 68 69 69
3 19 16 34
4 71 15 36
5 72 62 39
6 73 51 57
5 56 31 31
6 57 51 75
7 74 69 76
8 59 70 77
4 8 43 43
5 79 62 62
6 80 51 51
6 67 51 51
7 81 82 69
6 50 51 51
3 7 2 7
4 15 85 15
5 31 86 31
6 51 87 51
7 84 88 69
7 69 69 69
8 83 89 90
3 19 7 34
4 92 43 36
5 93 62 39
6 94 51 57
7 95 69 76
6 75 51 51
7 76 69 97
8 96 90 98
9 78 91 99
B1.5i;2a;1c.5i;3i;0/B2.6a;1c;1e - Minrule for an arbitrarily long photon frontend.
I golfed it to this: B1.;2;1.;3/B2.;1;1
which I then golfed to
B1.;2;1.;3/B2.;1;1/S2.;1e and B1.;2;1.;3/B2.;1;1/2T1.;1e
to get rid of the replicator.

I then golfed the former up to B1.;2;1.;3.;0;4,5,6.;1;3a,3i/B2.;1;1.;1;0.;4i;0.;;3i,4a,5i/2T1.;;3i/S1.;3;0/S2.;1e.;0;2,3,5i.;;2i

Code: Select all

#B1.;2;1.;3.;0;4,5,6.;1;3a,3i/B2.;1;1.;1;0.;4i;0.;;3i,4a,5i/2T1.;;3i/S1.;3;0/S2.;1e.;0;2,3,5i.;;2i
x = 100, y = 100, rule = B1.;2;1.;3.;0;4,5,6.;1;3a,3i_B2.;1;1.;1;0.;4i;0.;;3i,4a,5i_2T1.;;3i_S1.;3;0_S2.;1e.;0;2,3,5i.;;2i
2ABABA2.A4.A3.A.A3B2A2.ABAB4A2.A4B.A.B2.2B2.B.B4.A2.A3.2AB.2A4.B10.B
2.3A.A2B2.A$2.3B4.3A2.BA5.AB3.B.B.2A.B.A.A2.2A.A2B.AB2.A3.B2.BABA4B2.
3A3B2A.B2.B2.3A4.B2.BA.B2.B$B.2B2ABA4.B.2B.BA2B.A.2AB.B2.B3.A2.A3.2B
3.A.2AB.A2.B3A.2A2B2.A4.AB.2B.BA2BAB3.2B.B.A.BAB2.A$2.ABA2.2A2.3A.B2.
BA2.3A2.A.A2.2A5.B.B2.2B2.A4B4.BA.A2BA2.BAB.2A.B.2A.AB2.AB.B.A.B3A.3B
$.A2B3.AB.A8.AB3.B2.B.2B.BA2.B.B.2A3B.B.BA2.A4.B2.2B.B5.AB.2B.A7.A2.B
2A.AB.B4.A$2BA4.ABA.A.3A.B3.A7.2AB2.3A3BA2.AB2.2B.B.B2.A.ABAB.A3.A.3A
B4.A2B2A7.2A.AB.BA.B2A$B.B2.A2.AB.B.B.2A5.A5.B.2A2.B4.BA.B.2B2.A5.B.A
.2BA.2B.B2A2B.A3.B8.A2BA2.BA.3AB.A$B3.AB.A4.AB2.2B5.B.2B3.AB2.B2.A.B.
A3B5.B3.2BA3.BA2.A.2B2.A2.2A2B2.B4.A2B3.B3.2A2.A$2.2A2.2A.B2.B2.2A.B
2.2B2.A2.B2.A2B.A2.BA.B.2A2.3B5.BA2.A3.BA.3AB2.2B4.BA.AB2.B.A.A.2B.B.
A2B$BA.AB2.AB2A2.2B2AB.B.2A2B.A.AB.3B3.3B3.A2B3.B2A2B2.A.B2A2.A2.A3.
2B.B.2B2A3.B.B2.2B.B.A.B2A.2B$.B2A2.B.AB3.2BABA2BA2BA2.A2.A.B3AB.A.2B
.A.3A2.B.B4.AB3.A3.B2.BA3.ABA2B2AB.B.A.5A4.3AB$2B.B2.5B2.2BA2.2AB7.A.
B.B3A.A3BA.B.A.B5.B4.AB4.B2.B3.B.BA3BA2BAB2A.A.A.A3.4BA$B3A.2B2.A2.A.
A2.BA3.A.B.2AB4.A2B.B.3A2.A2.A.2B3.A5.B.B2.B2.AB7.BAB.A.A.ABA.3B$BAB
3.2A.A2B.A2B2A2B2.BA2.2B.B2A3.B2.B.2AB2A3.2ABA3.B.AB.B.A.B.A2.B2.B.2B
.7BA2.B2.A7.BA$2.2AB5.A2B2.B2.A.A4.AB.2AB.2AB.A4B.B.3A.B2.A.BA2B3A3B.
A2.2B5.B.B3.2A4.3B.B.A.A.2A$4B.A4.3A.B3A.ABA2B.B2.BAB2ABA3.2B.A2BA.2B
A.B2.A2.A3.A3.BA3.A.B5.A2B4.4A2B2A2.BA.B.A$.2AB3.AB7.2A2.B3A.A3.B.2BA
4.A.B.B.AB.2B.B4.4A2.2B.2B2.BAB2.BABA2.2B3.B.A.2A3.AB$A.B3.B.3A3.B2.
2A2B.B2.3B.2A2.B.A.ABAB2A2.BA.A.3A2.B.A2.B.3AB.BA2.AB.A.BA.A.B.BA2.2B
.A5.AB2A$BA.AB2.B.BA2B4.A.ABA.BAB.A3.B2.B.A.B3A2B2.B2.B9.B2.B.2A3B.2B
3A3.B2.B2.B2.2AB.A2.BA2.A$.B.A.BA.4A.B5.BA4.B2A.A3.B2.2BAB2A4.A11.B.B
A.A2B3.2BA.2BA.A4.2B2.2BA2BAB2AB2.A$.AB.A2.3AB7.B2.2A4.BABA.B.A.2B5.A
B.B2.B.2B2.A.2A2.A.B.2B4.A4.2A.A.A3.BA2BA.AB.2B.B.A$A.B.ABA.B4.B2.B2A
.B.B4.2AB.A2.B.2A4.A2.3BA2B2.BAB2.A3.B5.B3.AB4.B.B2.B2AB.A3.AB5.B$BAB
.B3.B4.2A.A.2AB.AB3A2.BA.2B2.2A2.B.B2.2A.ABA.B.B2.BA.A3.A.B2.2A2.AB5.
3A.A.B.2BA.B2A3B.A$.B2.A3.A.B3.A2.A3B5.B2A2.A2.B2A4.B2A.3B.A2.B2AB2.A
2.A2B2.B.BA.AB.AB3.A.2ABA.BA.B5.A.A$A2.AB3.3A2.A.A.A.A.A4.A.A.B2.AB3.
B.B2.A2.A.A.B.AB.3A.AB2.A2BA.A2.A.3A.A.2B2A3BA3.A.B.B.2B.A$.B3.A.B.A
3.BA.2B.A.A4.2A.ABAB.AB2.B3.2BA2.B.A2.AB2.2A4.2B.BA.A.B2A.A2.2B3.A2.A
2.B2.B2.B.BABA$B2.A4.A4.B5.BA2.A.B.A3.3AB2A2B2A.A2.BA2.B2.B.2A.BA.3AB
3.B2.2B5.BAB2.A.A.A.3A2.BAB3.A$A.A.B2.AB2.A.B3.B.B2.A10.B3.A.BA3B3.A
2B7.2A.A2.BA4.ABAB2.B6.A3.3AB2.A.A.B2.B$.B.BA.B2.A5.B.A2.B2.B3.3B5.BA
B.BA.BA.A.B2.ABA.BA2.2B3.B.AB3A3.B2A4.A.A.2B5.A.A2.B$.B2.3B.A4.2AB2.
2AB.2A2.3A5.A2.A.A3BA.3AB8.AB.A2B9.A.BABA.B.B2A2.A4.2A.B.B.B$2BA2.AB
2.2A4.BAB.B.A3.3B.2B.B3.A2.B3.A.BA2.A2.2A2.A2.3B2.A.A2B.4BA.2B.2B6.4A
BABA2.2B$.A.A2.A.2A2B4.3A2B.A4B6.A2.B.ABA6.A3.B2.BA2.A.B2A.3A2BA3.A5.
2B.AB2.B4.A.B.A.B.A$.A4.2ABA.A3.B.B2.B2.AB.B.AB2.A3.2B.ABAB2.2B4.B3.
2A.B2.B.2B.4B2A4.A7.A.A.BA5.2BA.A$B2.B3.B.B3.A3.A.AB3A4.B2.2B2.B.2B.B
A2.2B4.BA2.B4.2BA2.B.A3B2.B.2B.B2A.2BAB6.A3.BA$A.A2.2BA5.2B2.AB.BA.AB
.B.A.2A.3B.ABA2BA4BA.2A.A.2A3.B.A4.A.3A.B.2BABAB3ABAB.2BAB3.B2.3A$2.A
.B6.2B4.B2A2.A2.A.B.2ABA.3B3.A3.A.3A2B2AB2.2A.AB.B2.A3B4.B2.A.A.A.B7.
A.4B$3BAB.BA3.AB.B.2B2A2.BA.B2.A.3A3.BABA7.A2.A2.A.B4.2B2A.B.A3.B.2AB
AB2.A.2ABA6.BA3.B.A$B.A.AB.3A.2B5.B2.3BA2.2A2.AB2.ABA2B.A.A.BA5.A7.B
2.A2.BA2.2B3.A2BAB.B.A3.3ABA2.A2.B$3B.B.AB2.BA2.A3.B.A.2B2.AB.B2.A.BA
2.4B3.AB4.B.A.A5.A3.2B2.2B5.B3.2A2B.2A.A2.2A2.A$2.AB.B3.B.2B2A2.A5.B
2.B2.A.B3.3A7.B.B2.BA3.B.B2.AB3AB2.2A.BA2.BA.A2B4.2A4.AB2A3.2B$.B.A.B
.B3.A.B5.2A2B.AB2.AB5AB.B5.2B.A.A2.B3.A.2A7.BA.BA.A.B.2A.2BA4.B.BABA
2.BAB.BA$B2.2AB3.A.B2.2AB.B2.B.BA3B3.B2.A.2A.A2.2A.BA2.2A3.BA.A2.A7.B
.B2A.B2A2.B2A.B2A8.2B2.2A$2BAB.A3B.B3.B.A2B2.A.B5.2A3.4B2.A.2B.3A3B2.
B2.A2.B2ABAB.B.BA2.2B.2B4.2B.5A.B.A2.AB.BA$2.B3.A3.2A.BAB.B.BA3.2ABA
4.2A.A9.BAB2.AB.B.B.B2A2.B3.A.2ABABA2.A2.B2.B2ABA.B2.B.BA.A$B2.AB3.2A
.B2.B3.BA.B2.2BA.A.3B.BAB.AB2.B5.A2B.2A.3A.BA3.ABA.A2.B2.3B.A.A3.2A.A
2BA.A.A.B.B$2.A4.B6.2B2.BA3.B2.B2.A.A.BA4B.BA.B2.B.ABA2.2BA2.A.B.A.B
2.2B3.B2.2B.A.A.AB5.3BA.BA.B.B$.2AB2.AB2ABA3.BA3.A3.B4.BA4.A.BA.2A4.B
A.BA.2A.A2.B.B2.2A.B.B.2A3.A.B2.B3.2B.BA.A3.2A.A.A$A3.2B3.A2B3A.BA10.
B.B2.3B2.2ABA4.AB.2BA.B2A.A2BA5.B2.B5.B.AB2.2AB2.A2.B.2BA.2A.BA$B.AB.
2B.2B2A.2A.A5.B.2A2.B.2AB.B.A.2ABA2B.2B3.A3.AB.A2B2A3.A2.2A2BAB.B3.4B
A4.A2.B.A.BA2.A$2B.A4.A2.A2BABA.B.A2.2B.2A2.2A.A3.AB.BA2.AB2.2AB.AB2.
2A.2A2B.A2B.A4.B.2B2.B2A.A3.B4.A6.B$BA.A4.3A.4B3.AB.A2.B2.AB.A3.A.A.
2A.AB4.2A.A2.BA3.B.BA.2A2B.B2A3.A2.A.4AB3.B.B.2A.B.2A$.2A.B2A2.ABA.2B
A2B.B.2B.B.B5.AB6.A5.AB.AB3.3A.A.B.A3.B2A2.BA.2B.A3.2A.AB.A3.BA$.A.BA
.B3.4A.A2.BA.BA.2B2A.B.B.A.B.2A.A2.B2.B3.BA.2A8.2B3.A.2A.B2.B.AB2.A5.
AB2A.B.2A.2B$3AB.3A.B.ABAB2.B7.B.7B.A.BA7.A2.B.A3.4B4.A3.A4.B2.A2B.B
2.A3.B3.BAB3.2BA$3A.BA.A3.A.BAB4.A2.2A.A5.AB4.A2.2A.A2BA4.3BAB7.2A.BA
.A8.B.B2.BA2B2.2AB3.2A.B$A.B.B3A.AB2.A.2A2.BA.A.2A.2BA2.B3.2B3.2B.B2.
BABA2B.2ABA3.AB.BA2.B2A3.2A2B6.4A.ABA2.3A2.A$2BA.A.A3.B2.B.AB.2B4.2A.
A.B3.AB.2A.2A2.A3.2B3A.AB3.BA5.2B.2BAB.AB2.BA.AB.B.B.AB.A4.A3.B$.2B.B
.2A.B2.B3.A.2AB.BA.B3.B.BA8.BAB2.2B.2A2.B.A2.B.B.B.A3.2A2.2B.AB3.BAB
2.A3.B2.ABA.3A$2.B2.B.2A2BA.B2.B.B.2B.B.B2A2.A2.B3AB2.B.2A.A.B.BA2.A
3.B.B4.3AB.A.A2.B2.B.BA2.B.2B5.2A5.A$A.2A.A.B3.B.A2.BA4B.A.ABABA6.3A
8.A.B.AB.B5.2B2A.B2.BA.A.AB2.2B2.B2.B2.2A.2A.A2.B.B$3.2B2A3B.B2.B.A.A
BA.2A.ABA6.2A.B.BAB4.A.A.B2.A3.B.B.BA.A.AB2.A2.AB.3A3.3B.A.2A.A4.B2.B
$2B.AB2A.A.A2BABAB2.B3.2B4.B.AB.B.ABA.B.2AB4.2B.A.2A5.2B5.B2.A2B2.A2.
AB2.2A3.B.B3.B4.A$A.A.2B3A2B.B.A2.B5.B.A2B3ABA3.B.A2.AB2AB3.3A2.2A3.A
.4B.A4BA.B.B3.AB2A.2BA.B.B.2A.2B2.A$.B.B.A.A3.2B3.B.3A.A.B2A.A.BA.2A.
2A6.A2.A2.2BA2.B6.A.A.B.B.2B.BA.AB3.A.2A2.2A3.BA$.A.A.BA2.2B.BAB.B.2A
2.B.B.BA.2B2.A.A.B.2A3.A.5BA.2A.BA2.A.ABA.B4.A.AB.4A2.A.2AB.A2.2A6.A$
.B.2A.B5.B.6A2.AB.B.BA.BA.B.A.BABAB2.A3.BAB2.AB5.2AB.ABAB.2ABA.2B2.BA
B6.2A6.2B2A$A2B6.B2.A.A2.A.AB.BA4B2A.A2.2AB2.B.2A4.A3.BAB2.B.2AB.2A2.
A2.2B6.A2.AB2.A.2B2A2.A.A4.B$2B3.B6.BA2B2.B4.B.2B.BAB2A.BAB2.2A.B.A2B
.BA5.A.BA.B.B.B.A4.B2A.A.3A2.A2.AB.2A.A.B.4BA$B.BA.2A.2A.A2.2B2.B6.2B
2.A3.B.2ABA.3B2.3B2.B2.A2B9.AB.A3.B.A.B.A.B.2BA.B2AB.B.B2.BA$4A.B2AB.
A2.A3.BAB2AB3.BAB.AB4.A5.A2.2B.B.B.B2.B2.2A6.A.B4A2BA2.A2.2B.BABA.A.B
.B.2A.BA$B3A5.B2.4A.AB4.BA4.B.A.AB.B2A3.AB.BA8.B.AB8.B2.B.A.2B.AB.B2A
.AB.B2.4B2.AB$A.AB2.B2.B2.2BA2.BA2.A2.BA3.A6.A3.AB2.BA2B2A.AB2.2A.BAB
2ABA4.2A2.B2.B2.3B.B.B3.3A3.B.B$2B2.3BA3.2B.2A2.2A4.A.A.3BA3B.B.B.ABA
.A2.A2.2A2.2BAB.A7.A.A2B5.A4.2A.4A.B.B.A2.2BA$B.B2.A.BA2.A3.2B.BA.B.
2A.2B3.3A.AB.2ABA3.B7.B2A3.AB9.2A4.A2.A2.B.2B.ABA2.BA.B.A.B$.BA2BA3.B
.BAB2.2A.BA.B.B2.2B2.B.B5.BA.A3.A.2A2B5.AB2.A2.A4.B.A2.B3.A2.B3.BAB.A
5.A2.AB$A3.2A.B3A2.B3A3.B.B.2BA.BAB2.A2BAB4.AB2.A2.A.AB2.2A3.2A3.A.BA
3BA4.2B.A.B3.BA2.B.B.B.B$A.B.B2.A.BAB2.A.BA.B2.B.A5.2BA3B2.BA5.2A.A3.
BA3.BA3B.2B.2AB4.B.A.A2.3B2.2A2B.A3.2AB.B$2.A.AB.B2A3B.B.B.A.A.3A3.B
2A.B.BA2.2B2.A3.A2.A.A.AB2.B.AB3.BA2B2.B2AB6.A.B2.2A.BA4.2A$2.ABA5.A
2.B.B.B.B3.A.B.A2.A.B2AB2.A3.3B.B.B.A.B2.AB.B2.B.A2BA.B.B4.AB.A.A.3A.
2A.2B.2BA3.B$ABAB.B.B4.B2.A2.3AB8.A.A.2B3A.B2.B.B4.2AB.B2.BA2B2.3BAB.
B3A2.AB.2ABA2BA2.3A.B4.B.A$.A4.BA.2B4.A2.B.B.BAB2A.2A2.A6.B.BA.2B2.AB
.B.B.4A.BA2.2A2B2ABA.2A.A.B2.B.B2A.B.A2.B6.B$2.A2.A.BA2BABA.B.BA2.B.A
B3.3AB.B.3B.A7.AB2AB5.3A3.A2BA2.B.B.B3.BAB.3A2.A.AB.A2B2.A$2.3AB2AB.B
.3A.A3B.2A3BA2.B.2A3.B3.AB3.3A.BA.AB.2BA2.B2.B4.BA.3BA2.2B2AB3.2A2.A
4.B2.A2B$B3.2AB3.AB.B.2B2ABA.A.2A.B2A.A2B.2B3.B.BAB2.A4.AB2.AB5.B3.BA
.BA4B.B3.B2.A.B4.2BA4.BA$.2B.A2.AB2.A2.BA.A2.2ABAB.2A2.BAB.B.B2.2BA2.
2B2.2BA.B.B4.2A.B.BAB3.A2.AB.B.AB2.A.A.B2A2.BABA2.3B$4A3.BAB2A.A4.A2B
2A2B.B4.2BAB6.A.A.AB5.BA2.ABA.A2B2.2A.2A.B.BA2.A.A2.B2AB2.A.A.BAB2.AB
$5B.A3.A.2A2.A.B2A2B2.B.2B.B.A5.B2A3.B.B.A.B.B3.AB2.A.BA2B2.B2.A.B8.B
.4AB.A2.AB.A.B$A.A.A.B5.A2.A.A2.B.2B2A.A.A.AB2A3BA.B5.AB4A2.A.AB.AB2A
.4B3.B.2B.2AB.2B.B.6A6.BA$B2.BA2.B3.B.3B8.2A3B2.B2.B.B.ABA3.A.2AB.B2.
BA.BABA2.B.B4.B.2B.B3ABA.BA.B.2B.2BA2.B2.B2A$4.B.A2BA2.B.BA.B.B2.A.2A
3.B.3A.2A.B.2B.2A2.A3.2A.2A.BABA4.2B4.B.A2.2AB2.A5.B.B.A4.BAB$6.2B2A.
AB2.A.5A.B7.B.2B2.B2AB.2A.B2.A.BA.B.2A3.ABAB2A.B.B2.A.A.B.A4.A4.A3.A.
B.A.BA$B.A2.B.A5B.BAB2A2.2BA4.B.B2.3AB.B3.BA.AB2.2A2.B.B.B.AB.BA.2B2.
B.2B.BA2.2BA3.B3A3B5.2BAB$2A3.BABA.B.B2.2B2.B.B.2AB.A2.A2B2A2.A4.BA2.
BAB.B2AB.ABA5.2A.3BA.A7.B.BAB3.BA.BA2.4B$4A.B2.2B.2A2.AB.A.A2.2A2.B3.
BABA3.BA4.2AB2.AB.2B2.A.A3.2B2.2A.2A3.B4.4A5B2A4BA4.B$.BA.B.A.B.2A.A
6.AB2.B.2B.A4.BA.A.2A2.AB6.B2A3BA.A.AB2.AB.B.ABA3B2.B3.ABAB.A2B.2AB3.
2BA$2.B.2AB5.AB.2A6.BA.AB.BA2.B.2A2.B2.B.B.3BA.A6.A2BAB2.B.2A.AB4.A.
2B2.B.BA.BAB.3A.3B$6.A.A5.3BA.B4.B4.A.A2.A.3AB2A3.A.B.B.A.AB2AB.A3.B
3AB2.A2.AB2.A.3A.B5.AB2A.B.B.A$.B7.B.A.2A3.A.BABAB.A.A2.B2A2.BAB3A.2A
B.A2BAB2A2.2A.B.B5.A2.3B4.AB4.BA2.A.2ABA.BAB$.B.B3.B.B.B.2ABA2B.B2.B
2.B3.B3.2A2.B2.B.AB3.B.AB.A2.BAB2.AB2.A4.A.BABA2.B.AB.2BA.B3ABA.AB2.B
$A5.3B3.B3.AB2.AB.B3.B3.A.BA3B.2A5.A3.A2BAB2.A.BA.AB.A4.B.B.B3.A3.A.A
.B4.B3.AB.2B!

@RULE B1.;2;1.;3.;0;4,5,6.;1;3a,3i_B2.;1;1.;1;0.;4i;0.;;3i,4a,5i_2T1.;;3i_S1.;3;0_S2.;1e.;0;2,3,5i.;;2i

Full Rulestring:
B1.;2;1.;3.;0;4,5,6.;1;3a,3i/B2.;1;1.;1;0.;4i;0.;;3i,4a,5i/2T1.;;3i/S1.;3;0/S2.;1e.;0;2,3,5i.;;2i

@TREE
num_states=3
num_neighbors=8
num_nodes=280
1 0 0 0
1 2 0 2
2 0 1 0
2 1 0 1
1 0 0 2
2 0 1 4
3 2 3 5
1 1 1 0
1 1 0 0
2 0 7 8
2 1 8 4
3 3 9 10
2 4 4 4
3 5 10 12
4 6 11 13
2 7 0 8
2 8 8 0
3 9 15 16
3 10 16 12
4 11 17 18
2 8 8 4
2 4 0 4
3 10 20 21
2 4 4 8
3 12 21 23
4 13 22 24
5 14 19 25
1 2 0 0
2 27 0 27
2 27 8 0
3 28 9 29
2 4 4 0
3 29 16 31
4 30 17 32
2 0 0 0
2 8 0 8
3 15 34 35
1 1 0 2
2 4 37 0
3 16 35 38
4 17 36 39
2 27 8 4
3 41 20 34
2 8 0 37
2 0 8 0
3 20 43 44
3 34 44 34
4 42 45 46
5 33 40 47
2 4 0 37
3 10 16 49
4 13 50 24
3 16 35 44
3 21 44 21
4 50 52 53
2 8 4 8
3 23 21 55
4 24 53 56
5 51 54 57
6 26 48 58
2 27 0 0
3 15 60 35
4 17 61 39
3 34 34 34
2 37 4 8
3 35 34 64
4 36 63 65
2 0 0 4
3 43 67 35
3 44 35 44
4 45 68 69
5 62 66 70
2 0 0 8
3 29 16 72
4 73 52 46
3 35 34 35
4 52 75 69
4 46 69 46
5 74 76 77
6 48 71 78
3 10 16 21
3 12 49 23
4 13 80 81
3 49 44 21
4 80 52 83
5 82 84 57
3 29 16 34
3 72 44 34
4 86 52 87
5 88 76 77
1 2 0 1
2 4 4 90
1 1 0 1
2 4 0 92
3 91 93 23
2 0 8 90
2 4 0 1
3 93 95 96
2 8 4 37
3 23 96 98
4 94 97 99
2 8 0 92
2 0 8 27
3 95 101 102
3 96 102 96
4 97 103 104
3 55 21 55
4 56 53 106
5 100 105 107
6 85 89 108
7 59 79 109
2 7 27 8
3 111 34 35
4 112 63 65
5 40 113 70
6 48 114 78
5 40 66 70
3 34 34 31
4 63 63 117
3 67 67 34
4 68 119 75
5 66 118 120
4 75 63 75
4 69 75 69
5 76 122 123
6 116 121 124
2 0 0 92
2 0 0 27
3 126 95 127
3 127 102 127
4 128 103 129
2 0 0 90
3 101 131 35
3 102 35 102
4 103 132 133
5 130 134 77
6 89 124 135
7 115 125 136
4 13 80 24
4 80 52 53
2 4 37 8
3 12 21 140
2 37 0 4
3 21 44 142
4 141 143 56
5 138 139 144
4 86 52 46
2 8 0 0
3 34 44 147
4 148 69 46
5 146 76 149
2 90 92 8
3 12 21 151
2 92 90 1
3 21 44 153
4 152 154 56
2 90 92 27
3 44 35 156
4 154 157 53
2 8 1 37
3 23 21 159
2 1 27 1
3 21 44 161
4 160 162 106
5 155 158 163
6 145 150 164
2 92 90 27
3 34 44 166
4 167 157 46
2 92 90 8
3 35 34 169
4 157 170 69
2 27 27 27
3 34 44 172
2 27 8 27
3 44 35 174
4 173 175 46
5 168 171 176
6 150 124 177
4 53 69 53
5 57 179 107
5 77 123 77
2 8 4 0
3 55 21 182
4 106 53 183
5 107 179 184
6 180 181 185
7 165 178 186
8 110 137 187
6 48 116 78
6 114 121 124
7 189 190 136
6 71 121 124
4 119 119 63
5 118 118 193
4 63 63 63
5 122 195 122
6 121 194 196
3 131 131 127
3 35 127 35
4 132 198 199
5 134 200 123
6 124 196 201
7 192 197 202
2 90 90 27
3 34 34 204
4 170 205 75
2 8 27 8
3 35 34 207
4 175 208 69
5 171 206 209
6 124 196 210
5 123 122 123
6 181 212 181
7 178 211 213
8 191 203 214
3 140 142 55
4 24 53 216
5 138 139 217
3 147 44 34
4 46 69 219
5 146 76 220
6 218 221 180
6 221 124 181
3 151 153 55
4 24 53 224
3 153 156 21
4 53 69 226
3 159 161 55
4 56 53 228
5 225 227 229
3 166 156 34
4 46 69 231
3 156 169 44
4 69 75 233
3 172 174 34
4 46 69 235
5 232 234 236
6 230 237 185
7 222 223 238
6 124 196 212
3 169 204 35
4 75 63 241
3 174 207 44
4 69 75 243
5 234 242 244
6 237 245 181
7 223 240 246
2 92 90 4
2 8 1 8
3 151 248 249
2 90 92 0
2 1 27 4
3 248 251 252
2 37 1 8
3 249 252 254
4 250 253 255
5 57 179 256
2 92 90 0
2 27 27 0
3 258 251 259
3 251 169 29
3 259 29 259
4 260 261 262
5 77 123 263
6 257 264 185
2 90 90 0
3 169 266 207
3 29 207 29
4 261 267 268
5 123 122 269
6 264 270 181
2 0 4 0
3 182 21 272
4 183 53 273
5 184 179 274
6 185 181 275
7 265 271 276
8 239 247 277
9 188 215 278
-----

Apparently I have to include the rulefiles separately from the patterns as well if I want them to upload correctly :roll:

Code: Select all

@RULE B1.;1;0.;8.;3;3.;2;4_B2.;2a;0.5e;1e;2i.6a;1.6i;1c_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8.;3;3.;2;4/B2.;2a;0.5e;1e;2i.6a;1.6i;1c/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=129
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
2 9 10 9
3 5 7 11
4 6 8 12
3 7 7 7
2 10 0 0
3 7 7 15
4 8 14 16
2 0 0 9
2 0 0 10
2 4 0 9
3 18 19 20
3 19 7 7
2 9 0 0
3 20 7 23
4 21 22 24
5 13 17 25
2 1 10 10
3 27 15 15
4 28 14 14
4 14 14 14
5 29 30 30
2 0 10 9
2 9 0 9
3 32 15 33
3 33 7 23
4 34 14 35
3 23 7 7
4 35 14 37
5 36 30 38
6 26 31 39
3 27 7 7
3 15 7 7
4 41 42 42
5 43 30 30
1 0 1 0
2 45 0 0
3 7 46 7
4 14 47 14
2 0 0 1
3 7 7 49
4 14 14 50
2 0 1 1
3 7 49 52
4 14 50 53
5 48 51 54
3 7 52 2
4 14 53 56
5 30 54 57
6 44 55 58
3 32 7 33
4 60 42 35
5 61 30 38
3 7 2 7
4 37 56 63
5 38 57 64
6 62 58 65
7 40 59 66
3 3 15 15
4 68 14 14
4 42 14 14
5 69 70 70
2 0 45 0
3 72 7 7
4 73 14 50
5 30 74 54
6 71 75 58
5 30 51 54
3 49 7 3
4 50 14 78
5 51 30 79
3 52 3 3
4 53 78 81
5 54 79 82
6 77 80 83
3 2 3 7
4 56 81 85
5 57 82 86
6 58 83 87
7 76 84 88
3 18 15 33
4 90 14 35
5 91 70 38
6 92 58 65
4 63 85 14
5 64 86 94
6 65 87 95
7 93 88 96
8 67 89 97
4 8 42 42
5 99 70 70
6 100 77 58
6 75 80 83
7 101 102 88
6 55 80 83
4 14 63 14
5 30 105 30
4 78 14 8
5 79 30 107
6 80 106 108
4 81 8 8
5 82 107 110
6 83 108 111
7 104 109 112
4 85 8 14
5 86 110 114
6 87 111 115
7 88 112 116
8 103 113 117
3 18 7 33
4 119 42 35
5 120 70 38
6 121 58 65
7 122 88 96
5 94 114 30
6 95 115 124
7 96 116 125
8 123 117 126
9 98 118 127

Code: Select all

@RULE B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=101
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
1 2 0 2
2 9 10 11
3 5 7 12
4 6 8 13
3 7 7 7
2 10 0 0
3 7 7 16
4 8 15 17
2 0 0 9
2 0 0 10
2 4 0 11
3 19 20 21
3 20 7 7
2 11 0 0
3 21 7 24
4 22 23 25
5 14 18 26
2 1 10 10
3 28 16 16
4 29 15 15
4 15 15 15
5 30 31 31
2 0 10 9
2 9 0 11
3 33 16 34
3 34 7 24
4 35 15 36
3 24 7 7
4 36 15 38
5 37 31 39
6 27 32 40
3 28 7 7
3 16 7 7
4 42 43 43
5 44 31 31
1 0 1 0
2 46 0 0
3 7 47 7
4 15 48 15
5 49 31 31
5 31 31 31
6 45 50 51
3 33 7 34
4 53 43 36
5 54 31 39
4 38 15 15
5 39 31 56
6 55 51 57
7 41 52 58
3 3 16 16
4 60 15 15
4 43 15 15
5 61 62 62
2 0 46 0
3 64 7 7
4 65 15 15
5 31 66 31
6 63 67 51
6 51 51 51
7 68 69 69
3 19 16 34
4 71 15 36
5 72 62 39
6 73 51 57
5 56 31 31
6 57 51 75
7 74 69 76
8 59 70 77
4 8 43 43
5 79 62 62
6 80 51 51
6 67 51 51
7 81 82 69
6 50 51 51
3 7 2 7
4 15 85 15
5 31 86 31
6 51 87 51
7 84 88 69
7 69 69 69
8 83 89 90
3 19 7 34
4 92 43 36
5 93 62 39
6 94 51 57
7 95 69 76
6 75 51 51
7 76 69 97
8 96 90 98
9 78 91 99

Code: Select all

@RULE B1.;2;1.;3.;0;4,5,6.;1;3a,3i_B2.;1;1.;1;0.;4i;0.;;3i,4a,5i_2T1.;;3i_S1.;3;0_S2.;1e.;0;2,3,5i.;;2i

Full Rulestring:
B1.;2;1.;3.;0;4,5,6.;1;3a,3i/B2.;1;1.;1;0.;4i;0.;;3i,4a,5i/2T1.;;3i/S1.;3;0/S2.;1e.;0;2,3,5i.;;2i

@TREE
num_states=3
num_neighbors=8
num_nodes=280
1 0 0 0
1 2 0 2
2 0 1 0
2 1 0 1
1 0 0 2
2 0 1 4
3 2 3 5
1 1 1 0
1 1 0 0
2 0 7 8
2 1 8 4
3 3 9 10
2 4 4 4
3 5 10 12
4 6 11 13
2 7 0 8
2 8 8 0
3 9 15 16
3 10 16 12
4 11 17 18
2 8 8 4
2 4 0 4
3 10 20 21
2 4 4 8
3 12 21 23
4 13 22 24
5 14 19 25
1 2 0 0
2 27 0 27
2 27 8 0
3 28 9 29
2 4 4 0
3 29 16 31
4 30 17 32
2 0 0 0
2 8 0 8
3 15 34 35
1 1 0 2
2 4 37 0
3 16 35 38
4 17 36 39
2 27 8 4
3 41 20 34
2 8 0 37
2 0 8 0
3 20 43 44
3 34 44 34
4 42 45 46
5 33 40 47
2 4 0 37
3 10 16 49
4 13 50 24
3 16 35 44
3 21 44 21
4 50 52 53
2 8 4 8
3 23 21 55
4 24 53 56
5 51 54 57
6 26 48 58
2 27 0 0
3 15 60 35
4 17 61 39
3 34 34 34
2 37 4 8
3 35 34 64
4 36 63 65
2 0 0 4
3 43 67 35
3 44 35 44
4 45 68 69
5 62 66 70
2 0 0 8
3 29 16 72
4 73 52 46
3 35 34 35
4 52 75 69
4 46 69 46
5 74 76 77
6 48 71 78
3 10 16 21
3 12 49 23
4 13 80 81
3 49 44 21
4 80 52 83
5 82 84 57
3 29 16 34
3 72 44 34
4 86 52 87
5 88 76 77
1 2 0 1
2 4 4 90
1 1 0 1
2 4 0 92
3 91 93 23
2 0 8 90
2 4 0 1
3 93 95 96
2 8 4 37
3 23 96 98
4 94 97 99
2 8 0 92
2 0 8 27
3 95 101 102
3 96 102 96
4 97 103 104
3 55 21 55
4 56 53 106
5 100 105 107
6 85 89 108
7 59 79 109
2 7 27 8
3 111 34 35
4 112 63 65
5 40 113 70
6 48 114 78
5 40 66 70
3 34 34 31
4 63 63 117
3 67 67 34
4 68 119 75
5 66 118 120
4 75 63 75
4 69 75 69
5 76 122 123
6 116 121 124
2 0 0 92
2 0 0 27
3 126 95 127
3 127 102 127
4 128 103 129
2 0 0 90
3 101 131 35
3 102 35 102
4 103 132 133
5 130 134 77
6 89 124 135
7 115 125 136
4 13 80 24
4 80 52 53
2 4 37 8
3 12 21 140
2 37 0 4
3 21 44 142
4 141 143 56
5 138 139 144
4 86 52 46
2 8 0 0
3 34 44 147
4 148 69 46
5 146 76 149
2 90 92 8
3 12 21 151
2 92 90 1
3 21 44 153
4 152 154 56
2 90 92 27
3 44 35 156
4 154 157 53
2 8 1 37
3 23 21 159
2 1 27 1
3 21 44 161
4 160 162 106
5 155 158 163
6 145 150 164
2 92 90 27
3 34 44 166
4 167 157 46
2 92 90 8
3 35 34 169
4 157 170 69
2 27 27 27
3 34 44 172
2 27 8 27
3 44 35 174
4 173 175 46
5 168 171 176
6 150 124 177
4 53 69 53
5 57 179 107
5 77 123 77
2 8 4 0
3 55 21 182
4 106 53 183
5 107 179 184
6 180 181 185
7 165 178 186
8 110 137 187
6 48 116 78
6 114 121 124
7 189 190 136
6 71 121 124
4 119 119 63
5 118 118 193
4 63 63 63
5 122 195 122
6 121 194 196
3 131 131 127
3 35 127 35
4 132 198 199
5 134 200 123
6 124 196 201
7 192 197 202
2 90 90 27
3 34 34 204
4 170 205 75
2 8 27 8
3 35 34 207
4 175 208 69
5 171 206 209
6 124 196 210
5 123 122 123
6 181 212 181
7 178 211 213
8 191 203 214
3 140 142 55
4 24 53 216
5 138 139 217
3 147 44 34
4 46 69 219
5 146 76 220
6 218 221 180
6 221 124 181
3 151 153 55
4 24 53 224
3 153 156 21
4 53 69 226
3 159 161 55
4 56 53 228
5 225 227 229
3 166 156 34
4 46 69 231
3 156 169 44
4 69 75 233
3 172 174 34
4 46 69 235
5 232 234 236
6 230 237 185
7 222 223 238
6 124 196 212
3 169 204 35
4 75 63 241
3 174 207 44
4 69 75 243
5 234 242 244
6 237 245 181
7 223 240 246
2 92 90 4
2 8 1 8
3 151 248 249
2 90 92 0
2 1 27 4
3 248 251 252
2 37 1 8
3 249 252 254
4 250 253 255
5 57 179 256
2 92 90 0
2 27 27 0
3 258 251 259
3 251 169 29
3 259 29 259
4 260 261 262
5 77 123 263
6 257 264 185
2 90 90 0
3 169 266 207
3 29 207 29
4 261 267 268
5 123 122 269
6 264 270 181
2 0 4 0
3 182 21 272
4 183 53 273
5 184 179 274
6 185 181 275
7 265 271 276
8 239 247 277
9 188 215 278
I wrote a stdin script that generates random soups of a provided number of a given spaceship. It works for all (non-B0) spaceships in the INT rulespace!
A Multistate INT notation + script.
User avatar
wirehead
Posts: 304
Joined: June 18th, 2022, 2:37 pm
Location: /dev/full
Contact:

Re: Multistate INT Exploration

Post by wirehead »

Cyclotrons wrote: September 10th, 2023, 4:05 pm

Code: Select all

x = 48, y = 43, rule = B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3
2B$2B32$38.B$37.B.B.2B3.B$38.2B.2B2.B.B$46.B$41.A$46.B$34.B2.2B2.2B2.
B.B$32.3B2.2B2.2B3.B$31.B$31.2B!

@RULE B1.;1;0.;8_B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3_1T2.;0;2e_S1.;4i;0_S2.;0;2,3

Full Rulestring:
B1.;1;0.;8/B2.;2a;0.5e;1e;2i.6a;1.6i;1c.;0;3/1T2.;0;2e/S1.;4i;0/S2.;0;2,3

@TREE
num_states=3
num_neighbors=8
num_nodes=101
1 0 0 0
1 1 0 0
2 0 1 0
2 1 0 0
1 0 2 2
2 0 0 4
3 2 3 5
2 0 0 0
3 3 7 7
1 0 0 2
1 2 0 0
1 2 0 2
2 9 10 11
3 5 7 12
4 6 8 13
3 7 7 7
2 10 0 0
3 7 7 16
4 8 15 17
2 0 0 9
2 0 0 10
2 4 0 11
3 19 20 21
3 20 7 7
2 11 0 0
3 21 7 24
4 22 23 25
5 14 18 26
2 1 10 10
3 28 16 16
4 29 15 15
4 15 15 15
5 30 31 31
2 0 10 9
2 9 0 11
3 33 16 34
3 34 7 24
4 35 15 36
3 24 7 7
4 36 15 38
5 37 31 39
6 27 32 40
3 28 7 7
3 16 7 7
4 42 43 43
5 44 31 31
1 0 1 0
2 46 0 0
3 7 47 7
4 15 48 15
5 49 31 31
5 31 31 31
6 45 50 51
3 33 7 34
4 53 43 36
5 54 31 39
4 38 15 15
5 39 31 56
6 55 51 57
7 41 52 58
3 3 16 16
4 60 15 15
4 43 15 15
5 61 62 62
2 0 46 0
3 64 7 7
4 65 15 15
5 31 66 31
6 63 67 51
6 51 51 51
7 68 69 69
3 19 16 34
4 71 15 36
5 72 62 39
6 73 51 57
5 56 31 31
6 57 51 75
7 74 69 76
8 59 70 77
4 8 43 43
5 79 62 62
6 80 51 51
6 67 51 51
7 81 82 69
6 50 51 51
3 7 2 7
4 15 85 15
5 31 86 31
6 51 87 51
7 84 88 69
7 69 69 69
8 83 89 90
3 19 7 34
4 92 43 36
5 93 62 39
6 94 51 57
7 95 69 76
6 75 51 51
7 76 69 97
8 96 90 98
9 78 91 99
this looks like the start of a sqrtgun, if only there was a way to create 2 blocks...
Langton's ant: Can't play the drums, can be taught.
Cyclotrons
Posts: 132
Joined: January 26th, 2021, 12:19 am

Re: Multistate INT Exploration

Post by Cyclotrons »

Some more rules. Proof that you can rulegolf with this notation (though the knowledge and technique to do so efficiently isn't quite there yet). Here are some tips:
  • Transitions with a blend of multiple cell states tend to have less impact on a rule's dynamics. Use these when fine-tuning.
  • For larger impact, use transitions with fewer non-zero cells and with less of a mix of states.
  • Also use the more expressive elements of this notation for a similar effect.
Also, fixed a bug in the script where a sepchar would be ignored if it occurred after a subconfig.
I wrote a stdin script that generates random soups of a provided number of a given spaceship. It works for all (non-B0) spaceships in the INT rulespace!
A Multistate INT notation + script.
Post Reply