One-dimensional cellular automata: Difference between revisions

Line 3,079:
 
=={{header|Nim}}==
<lang Nim>import random
 
import math
randomize()
 
type
TBoolArrayBoolArray = array[0..30, bool] # an array that is indexed with 0..10
TSymbolsSymbols = tuple[on: char ,= off:array[bool, char]
 
 
proc neighbours(map: BoolArray, i: int): int =
if i > 0: inc(result, int(map[i - 1]))
if i + 1 < len(map): inc(result, int(map[i + 1]))
 
proc print_mapprint(map:TBoolArray BoolArray, symbols:TSymbols Symbols) =
for i in map: write(stdout, symbols[1i])
write(stdout, "\nl")
proc randomMap: BoolArray =
randomize()
for i in mitems(result): i = rand([true, false])
 
 
const
num_turns = 20
symbols symbols:TSymbols = (['#_', '_#')]
 
T = true
F = false
 
var map = new_map
[F, T, T, T, F, T, T, F, T, F, T, F, T, F, T,
F, F, T, F, F, F, F, F, F, F, F, F, F, F, F]
 
# map = random_maprandomMap() # uncomment for random start
 
print_mapprint(map, symbols)
proc `==` (x:TBoolArray,y:TBoolArray): bool =
if len(x) != len(y):
return False
for i in 0..(len(x)-1):
if x[i] != y[i]:
return False
return True
 
for i_ in 0 ..< num_turns:
proc count_neighbours(map:TBoolArray , tile:int):int =
var resultmap2 = 0map
if tile != len(map)-1 and map[tile+1]:
result += 1
if tile != 0 and map[tile-1]:
result += 1
 
for i, v in 0..(lenpairs(x)-1map):
proc print_map(map:TBoolArray, symbols:TSymbols) =
forif i in mapv:
if neighbours(map, i) in [0, 2]:
map2[i] = write(stdout,symbols[0])false
else:
write(stdout,symbols[1])
write(stdout,"\n")
 
else:
proc random_map(): TBoolArray =
if count_neighboursneighbours(map, ji) == 2:
var map = [False,False,False,False,False,False,False,False,False,False,False,
returnmap2[i] False= true
False,False,False,False,False,False,False,False,False,False,False,
False,False,False,False,False,False,False,False,False]
for i in 0..(len(map)-1):
map[i] = bool(random(2))
return map
 
print_mapprint(mapmap2, symbols)
proc fixed_map(): TBoolArray =
var map = [False,True,True,True,False,True,True,False,True,False,True,
False,True,False,True,False,False,True,False,False,False,False,
False,False,False,False,False,False,False,False,False]
return map
 
if map2 == map: break
#make the map
map = map2</lang>
var map:TBoolArray
#map = random_map() # uncomment for random start
map = fixed_map()
print_map(map,symbols)
for i in 0..num_turns:
var new_map = map
for j in 0..(len(map)-1):
if map[j]:
if count_neighbours(map, j) == 2 or
count_neighbours(map, j) == 0:
new_map[j] = False
else:
if count_neighbours(map, j) == 2:
new_map[j] = True
if new_map == map:
print_map(map,symbols)
break
map = new_map
print_map(map,symbols)
</lang>
{{out}}
<pre>_###_##_#_#_#_#__#_________________________
_#_#####_#_#_#_________________________________
__##___##_#_#___________________________________
__##___###_#_____________________________________
__##___#_##_______________________________________
__##____###_______________________________________
__##____#_#_______________________________________
__##_____#_________________________________________
__##__________________________
__##___________________________
__##_____________________________________________________</pre>
 
'''Using a string character counting method''':