Crate ca_rules

source ·
Expand description

Parsing rule strings of life-like and other cellular automata.

Currently the following rules are supported:

For non-Generations rules, four different notations are supported:

For Generations rules, four different notations are supported:

  • B/S notation (B357/S3457/C5)
  • The notation used by Golly (3457/357/5)
  • The notation used by Catagolue (g5b357s3457)
  • MAP strings for non-isotropic rules (MAPARYBFxZpF38WaRd/aZZ//hZpF39pln/+aZZ//pZp/ukWaRd/aZZ//mmWf/6Waf7paZZ//pZp/umWaf7paZbplg/5)

Please refer to Life Wiki for detailed definitions and notations of these rule strings.

Example:

use ca_rules::ParseLife;

// Define a struct for your rule:
#[derive(Debug, Eq, PartialEq)]
struct Rule {
    b: Vec<u8>,
    s: Vec<u8>,
}

// Implement a parser trait for your rule:
// The choice of the trait depends on the type of rules you want to parse.
impl ParseLife for Rule {
    // Implement a function to construct the rule from b and s data:
    fn from_bs(b: Vec<u8>, s: Vec<u8>) -> Self {
        Rule { b, s }
    }
}

// Then you can parse a rule string:
let life = Rule::parse_rule("B3/S23").unwrap();
assert_eq!(
    life,
    Rule {
        b: vec![3],
        s: vec![2, 3],
    }
)

Enums

Traits