Non-isotropic Life-like cellular automaton

Non-isotropic Life-like cellular automata, also called anisotropic Life-like cellular automata, are a generalization of both totalistic and non-totalistic (but isotropic) Life-like cellular automata in which any transition function is allowed. Transitions may thus take into account not just the number of live neighbors of a given cell (as in outer-totalistic CAs) and their alignment relative to each other (as in non-totalistic isotropic CAs), but also their absolute alignment on the grid.

For instance, the following two configurations (which would both be considered 2a in Hensel notation) are distinguished in non-isotropic CAs but not in isotropic ones:

Encoding

Range-1 Moore neighbourhood

Main article: Rule integer

Non-isotropic Life-like CAs are typically not given in B/S notation but rather as MAP strings, a notation first introduced by Chris Rowett, the creator of the LifeViewer. MAP strings encode all possible transitions in the range-1 Moore neighbourhood, and every 2-state rule in a range-1 Moore neighbourhood can be represented in this form.

For this purpose, each member of the range-1 Moore neighbourhood of a cell is assigned a number, as follows:

25612864
32168
421

Each possible neighbourhood configuration thus corresponds to a number between 0 and 511, and the transition function can be represented as a 512-bit binary string, where the n-th bit is set to 1 if, in the configuration numbered n, the center cell will be alive in the next generation, and 0 otherwise.

The resulting binary string is then further encoded in base64 for brevity, creating a string of 86 characters.

Other neighbourhoods

  • The range-1 triangular von Neumann neighbourhood has 4 cells (center plus 3 neighbors), which gives 24=16 possible combinations of cells.
  • The range-1 von Neumann neighbourhood has 5 cells (center plus 4 neighbors), which gives 25=32 possible combinations of cells; these encode into 6 base 64 characters.
  • The range-1 hexagonal neighbourhood has 7 cells (center plus 6 neighbors), which gives 27=128 possible combinations of cells; these encode into 22 base64 characters.
  • The range-1 triangular Moore neighbourhood and range-2 von Neumann neighbourhood have 13 cells (center plus 12 neighbors), which gives 213=8192 possible combinations of cells.
  • The range-2 Moore and range-3 von Neumann neighbourhoods have 25 cells (center plus 24 neighbors), which gives 225=33554432 possible combinations of cells.

Both range 1 hexagonal- and range 1 von Neumann-neighbourhood non-isotropic CAs are supported in Golly starting in version 3.0b2.[1]

Extensions

MAP rules can also simulate Generations rules, by adding /(states) to the end of the MAP string.

Software support

MAP rules are natively supported by Golly starting with version 2.9b2, and by LifeViewer starting with build 222.[2]

gollark: Evidently, C needs better extension mechanisms.
gollark: I'm not sure how you could consider that syntax okay.
gollark: This is why ALL are to utilize zig.
gollark: ```c#include <sys/socket.h>#include <sys/types.h> #include <netinet/in.h>#include <stdio.h>#include <string.h>#include <sys/select.h>#include <fcntl.h>int main() { int apion = 0; int metaapion[65536] = {0}; for (int i = 0x0; i <= 0x10000; i++) { int sock = socket(AF_INET, SOCK_STREAM, 0); fcntl(sock, F_SETFL, O_NONBLOCK); if (sock <= -1) { perror("this is not an effective way to handle errors"); } struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(i); int b = bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)); if (b <= -1) { perror("still bad, actually"); } int z = listen(sock, 0xFFF); if (z <= -1) { perror("🐝"); } printf("%d\n", i); metaapion[apion] = sock; apion++; } while (1) { fd_set fds; FD_ZERO(&fds); unsigned short metaaaaapion = 0; while (1) { if (metaapion[metaaaaapion]) { FD_SET(metaapion[metaaaaapion], &fds); metaaaaapion++; } else break; } signed long long int e = select(apion, &fds, &fds, &fds, NULL); if (e < 0) { perror("contingency 44 engaged"); } while (1) { if (metaapion[metaaaaapion]) { if ( FD_ISSET(metaapion[metaaaaapion], &fds) ) { accept(metaapion[metaaaaapion], 0, 0); } metaaaaapion++; } else break; } }}```*Apparently* someone limited file descriptors and this doesn't work.
gollark: Actually, \🐝.

See also

References

  1. Chris Rowett (August 3, 2017). Re: Golly 3.0b2 (discussion thread) at the ConwayLife.com forums
  2. Chris Rowett (March 14, 2017). Re: Pattern viewer for forum threads (discussion thread) at the ConwayLife.com forums
This article is issued from Conwaylife. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.