One-dimensional cellular automata: Difference between revisions
Content added Content deleted
Line 672: | Line 672: | ||
<lang cobol tags=cobol> |
<lang cobol tags=cobol> |
||
⚫ | |||
* one-dimensional cellular automata |
|||
Program-id. rc-1d-cell. |
|||
Data division. |
|||
Working-storage section. |
|||
* "Constants." |
|||
01 max-gens pic 999 value 9. |
|||
01 state-width pic 99 value 20. |
|||
01 state-table-init pic x(20) value ".@@@.@@.@.@.@.@..@..". |
|||
01 alive pic x value "@". |
|||
01 dead pic x value ".". |
|||
* The current state. |
|||
01 state-gen pic 999 value 0. |
|||
01 state-row. |
|||
05 state-row-gen pic zz9. |
|||
05 filler pic xx value ": ". |
|||
05 state-table. |
|||
10 state-cells pic x occurs 20 times. |
|||
* The new state. |
|||
01 new-state-table. |
|||
05 new-state-cells pic x occurs 20 times. |
|||
* Pointer into cell table during generational production. |
|||
⚫ | |||
01 cell-index pic 99. |
|||
88 at-beginning value 1. |
|||
88 is-inside values 2 thru 19. |
|||
88 at-end value 20. |
|||
* The cell's neighborhood. |
|||
01 neighbor-count-table. |
|||
03 neighbor-count pic 9 occurs 20 times. |
|||
88 is-comfy value 1. |
|||
88 is-ripe value 2. |
|||
Procedure division. |
|||
Perform Init-state-table. |
|||
Perform max-gens times |
|||
perform Display-row |
|||
perform Next-state |
|||
end-perform. |
|||
Perform Display-row. |
|||
Stop run. |
|||
Display-row. |
|||
Move state-gen to state-row-gen. |
|||
Display state-row. |
|||
* Determine who lives and who dies. |
|||
⚫ | |||
Next-state. |
|||
Add 1 to state-gen. |
|||
Move state-table to new-state-table. |
|||
Perform with test after |
|||
varying cell-index from 1 by 1 |
|||
until at-end |
|||
perform Count-neighbors |
|||
end-perform |
|||
Perform with test after |
|||
varying cell-index from 1 by 1 |
|||
until at-end |
|||
perform Die-off |
|||
end-perform |
|||
Perform with test after |
|||
varying cell-index from 1 by 1 |
|||
until at-end |
|||
perform New-births |
|||
end-perform |
|||
move new-state-table to state-table. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
if state-cells(cell-index) = |
|||
alive and not is-comfy (cell-index) |
|||
then move dead to new-state-cells(cell-index) |
|||
end-if |
|||
. |
|||
* Empty cell with exactly two neighbors are... |
|||
New-births. |
|||
if state-cells(cell-index) = dead and is-ripe (cell-index) |
|||
New-births. |
|||
then move alive to new-state-cells(cell-index) |
|||
end-if |
|||
. |
|||
* How many living neighbors does a cell have? |
|||
Count-neighbors. |
|||
Move 0 to neighbor-count(cell-index) |
|||
if at-beginning or at-end then |
|||
add 1 to neighbor-count(cell-index) |
|||
else |
|||
if is-inside and state-cells(cell-index - 1) = alive |
|||
else |
|||
then |
|||
add 1 to neighbor-count(cell-index) |
|||
end-if |
|||
if is-inside and state-cells(cell-index + 1) = alive |
|||
then |
|||
add 1 to neighbor-count(cell-index) |
|||
end-if |
|||
end-if |
|||
. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
Init-state-table. |
|||
Perform with test after |
|||
varying cell-index from 1 by 1 |
|||
until at-end |
|||
move state-table-init(cell-index:1) |
|||
to state-cells(cell-index) |
|||
end-perform |
|||
. |
|||
⚫ | |||
</lang> |
</lang> |
||