Task: One-dimensional cellular automata




Go: package main

import "fmt"

const (
    start    = "_###_##_#_#_#_#__#__"
    offLeft  = '_'
    offRight = '_'
    dead     = '_'
)

func main() {
    fmt.Println(start)
    g := newGenerator(start, offLeft, offRight, dead)
    for i := 0; i < 10; i++ {
        fmt.Println(g())
    }
}

func newGenerator(start string, offLeft, offRight, dead byte) func() string {
    g0 := string(offLeft) + start + string(offRight)
    g1 := []byte(g0)
    last := len(g0) - 1
    return func() string {
        for i := 1; i < last; i++ {
            switch l := g0[i-1]; {
            case l != g0[i+1]:
                g1[i] = g0[i]
            case g0[i] == dead:
                g1[i] = l
            default:
                g1[i] = dead
            }
        }
        g0 = string(g1)
        return g0[1:last]
    }
}






COBOL:  Identification division.                                        
 Program-id. rc-1d-cell.                                         
 
 Data division.                                                  
 Working-storage section.                                        
 

 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 ".".                     
 

 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.              
 

 01 new-state-table.                                            
    05 new-state-cells pic   x   occurs 20 times.              
 

 01 cell-index          pic   99.                               
    88 at-beginning    value  1.                               
    88 is-inside       values 2 thru 19.                       
    88 at-end          value 20.                               
 

 01 neighbor-count-def.                          
   03 neighbor-count      pic   9.
     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.                   
 

 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          
         perform Die-off                             
         perform New-births                          
     end-perform                                     
 
     move new-state-table to state-table.            
 

 Die-off.                                            
     if state-cells(cell-index) =                    
     alive and not is-comfy    
         then move dead to new-state-cells(cell-index)           
     end-if                                                      
     .                                                           
 

 New-births.                                                     
     if state-cells(cell-index) = dead and is-ripe
         then move alive to new-state-cells(cell-index)          
     end-if                                                      
    .                                                           

 Count-neighbors.                                                
     Move 0 to neighbor-count                        
     if at-beginning or at-end then                              
         add 1 to neighbor-count                      
     else                                                        
       if is-inside and state-cells(cell-index - 1) = alive        
       then                                                        
           add 1 to neighbor-count                     
       end-if                                                      
       if is-inside and state-cells(cell-index + 1) = alive        
       then                                                        
           add 1 to neighbor-count                     
       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
      .