8 releases
0.3.5 | Mar 18, 2023 |
---|---|
0.3.4 | Jan 1, 2023 |
0.3.3 | Jul 3, 2021 |
0.3.2 | May 19, 2020 |
0.1.0 | Aug 6, 2019 |
#1568 in Parser implementations
30 downloads per month
Used in 2 crates
(via rlifesrc-lib)
67KB
1.5K
SLoC
CA rules parsers
Parsing rule strings of life-like and other cellular automata.
Currently the following rules are supported:
- Totalistic Life-like,
e.g.,
B3/S23
. - Isotropic non-totalistic Life-like,
e.g.,
B2ci3ai4c8/S02ae3eijkq4iz5ar6i7e
. - Non-isotropic Life-like,
e.g.,
MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
. - Totalistic Hexagonal,
e.g.,
B2/S34H
. - Isotropic non-totalistic Hexagonal,
e.g.,
B2o3-o4m/S12m3o4m5H
. - Non-isotropic Hexagonal,
e.g.,
MAPFgFoF2gXgH5oF4B+gH4A6AH
. - von Neumann neighborhood,
e.g.,
B2/S013V
. - Non-isotropic von Neumann,
e.g.,
MAPHmlphg
. - The corresponding Generations rules
of the above rules, e.g.,
3457/357/5
.
For non-Generations rules, four different notations are supported:
- B/S notation (
B3/S23
) - S/B notation (
23/3
) - MAP strings
for non-isotropic rules
(
MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
)
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.
Usage
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],
}
)
For details, please refer to the doc.
Dependencies
~0.5–1MB
~21K SLoC