Published
Edited
Mar 17, 2021
Importers
Insert cell
md`# Cellular automata symmetrical rule space`
Insert cell
function getSymmetryMap(stateCount) {
const symmetryMap = Array.from({ length: stateCount }, () =>
Array.from({ length: stateCount })
);
let a = 0;
for (let i = 0; i < stateCount; i++) {
for (let j = 0; j <= i; j++) {
symmetryMap[i][j] = symmetryMap[j][i] = a++;
}
}
return symmetryMap;
}
Insert cell
function getSymmetricalStateCount(stateCount) {
return 1 + getSymmetryMap(stateCount)[stateCount - 1][stateCount - 1];
}
Insert cell
function getSymmetricalRuleSpaceSizePower(stateCount) {
return stateCount ** 2 * getSymmetricalStateCount(stateCount);
}
Insert cell
function generateRandomSymmetricalTable(stateCount) {
const ruleSpaceSizePower = getSymmetricalRuleSpaceSizePower(stateCount);

function randomState(stateCount) {
return Math.floor(Math.random() * stateCount);
}

return Array.from({ length: ruleSpaceSizePower }, () =>
randomState(stateCount)
);
}
Insert cell
function generateRandomSymmetricalFullTable(stateCount) {
return symmetricalToFullTable(
stateCount,
generateRandomSymmetricalTable(stateCount)
);
}
Insert cell
function symmetricalToFullTable(stateCount, symTable) {
const symmetryMap = getSymmetryMap(stateCount);
const symStateCount = getSymmetricalStateCount(stateCount);

function getCombinedState(n1, c, n2, pc) {
const n = symmetryMap[n1][n2];
let combinedState = 0;
combinedState = combinedState * stateCount + c;
combinedState = combinedState * symStateCount + n;
combinedState = combinedState * stateCount + pc;
return combinedState;
}

return toFullTable(
stateCount,
(_, n1, c, n2, pc) => symTable[getCombinedState(n1, c, n2, pc)]
);
}
Insert cell
Insert cell
function getFullCombinedState(stateCount, n1, c, n2, pc) {
let combinedState = 0;
combinedState = combinedState * stateCount + pc;
combinedState = combinedState * stateCount + n2;
combinedState = combinedState * stateCount + c;
combinedState = combinedState * stateCount + n1;
return combinedState;
}
Insert cell
function toFullTable(stateCount, getValue) {
const table = Array.from({ length: stateCount ** 4 });

for (let n1 = 0; n1 < stateCount; n1++) {
for (let c = 0; c < stateCount; c++) {
for (let n2 = 0; n2 < stateCount; n2++) {
for (let pc = 0; pc < stateCount; pc++) {
table[getFullCombinedState(stateCount, n1, c, n2, pc)] = getValue(
stateCount,
n1,
c,
n2,
pc
);
}
}
}
}

return table;
}
Insert cell
Insert cell
generateRandomSymmetricalFullTable(3)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more