How to resolve the algorithm Elementary cellular automaton step by step in the UNIX Shell programming language
How to resolve the algorithm Elementary cellular automaton step by step in the UNIX Shell programming language
Table of Contents
Problem Statement
An elementary cellular automaton is a one-dimensional cellular automaton where there are two possible states (labeled 0 and 1) and the rule to determine the state of a cell in the next generation depends only on the current state of the cell and its two immediate neighbors. Those three values can be encoded with three bits. The rules of evolution are then encoded with eight bits indicating the outcome of each of the eight possibilities 111, 110, 101, 100, 011, 010, 001 and 000 in this order. Thus for instance the rule 13 means that a state is updated to 1 only in the cases 011, 010 and 000, since 13 in binary is 0b00001101.
Create a subroutine, program or function that allows to create and visualize the evolution of any of the 256 possible elementary cellular automaton of arbitrary space length and for any given initial state. You can demonstrate your solution with any automaton of your choice. The space state should wrap: this means that the left-most cell should be considered as the right neighbor of the right-most cell, and reciprocally. This task is basically a generalization of one-dimensional cellular automata.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Elementary cellular automaton step by step in the UNIX Shell programming language
Source code in the unix programming language
function print_cells {
local chars=(. '#') cell
for cell; do
printf '%s' "${chars[$cell]}"
done
printf '\n'
}
function next_gen {
local rule=$1
shift
cells=("$@")
local -i l c r bit
for (( l=$#-1, c=0, r=1; c < $#;
l=(l+1)%$#, c+=1, r=(r+1)%$# )); do
local left=${cells[l]} current=${cells[c]} right=${cells[r]}
(( bit = 1<<(left<<2 | current<<1 | right) ))
printf '%d\n' $(( rule & bit ? 1 : 0 ))
done
}
function automaton {
local size=${1:-32} rule=${2:-90}
local stop=${3:-$(( size/2 ))}
local i gen cells=()
for (( i=0; i
cells+=( $(( i == size/2 )) )
done
for (( gen=0; gen
printf "%${#stop}d: " "$gen"
print_cells "${cells[@]}"
cells=($(next_gen "$rule" "${cells[@]}"))
done
}
automaton "$@"
You may also check:How to resolve the algorithm Van der Corput sequence step by step in the Modula-2 programming language
You may also check:How to resolve the algorithm Gauss-Jordan matrix inversion step by step in the PowerShell programming language
You may also check:How to resolve the algorithm Hello world/Text step by step in the NS-HUBASIC programming language
You may also check:How to resolve the algorithm First-class functions/Use numbers analogously step by step in the Arturo programming language
You may also check:How to resolve the algorithm Set step by step in the FunL programming language