rule110
This commit is contained in:
40
tests/rule110.expected
Normal file
40
tests/rule110.expected
Normal file
@@ -0,0 +1,40 @@
|
||||
#
|
||||
##
|
||||
###
|
||||
## #
|
||||
#####
|
||||
## #
|
||||
### ##
|
||||
## # ###
|
||||
####### #
|
||||
## ###
|
||||
### ## #
|
||||
## # #####
|
||||
##### ## #
|
||||
## # ### ##
|
||||
### #### # ###
|
||||
## # ## ##### #
|
||||
######## ## ###
|
||||
## #### ## #
|
||||
### ## # #####
|
||||
## # ### #### #
|
||||
##### ## ### # ##
|
||||
## # ##### # ## ###
|
||||
### ## ## ######## #
|
||||
## # ###### ## ###
|
||||
####### # ### ## #
|
||||
## # #### # #####
|
||||
### ## ## ### ## #
|
||||
## # ### ### ## # ### ##
|
||||
##### ## ### ###### ## # ###
|
||||
## # ##### ### ######## #
|
||||
### #### ### # ## ###
|
||||
## # ## # ## ### ### ## #
|
||||
######## ## ##### # ## # #####
|
||||
## ###### ######## ## #
|
||||
### ## # ## # ### ##
|
||||
## # ### ## ### ## ## # ###
|
||||
##### ## # ##### # ########## #
|
||||
## # ##### ## ### ## ###
|
||||
### ## ## #### ## # ### ## #
|
||||
## # ###### ## # ##### ## # #####
|
||||
138
tests/rule110.sl
Normal file
138
tests/rule110.sl
Normal file
@@ -0,0 +1,138 @@
|
||||
# Rule 110 Cellular Automaton
|
||||
# Rule 110 is a Turing-complete cellular automaton
|
||||
|
||||
import stdlib/stdlib.sl
|
||||
import stdlib/io.sl
|
||||
import stdlib/mem.sl
|
||||
|
||||
# Configuration
|
||||
macro WIDTH 0 80 ;
|
||||
macro GENERATIONS 0 40 ;
|
||||
|
||||
# Apply Rule 110 to three cells (left center right -- new_state)
|
||||
word rule110
|
||||
swap 2 * # center*2
|
||||
rot 4 * # left*4
|
||||
+ + # pattern = left*4 + center*2 + right
|
||||
|
||||
dup 0 == if drop 0 else
|
||||
dup 1 == if drop 1 else
|
||||
dup 2 == if drop 1 else
|
||||
dup 3 == if drop 1 else
|
||||
dup 4 == if drop 0 else
|
||||
dup 5 == if drop 1 else
|
||||
dup 6 == if drop 1 else
|
||||
dup 7 == if drop 0 else
|
||||
drop 0
|
||||
end end end end end end end end
|
||||
end
|
||||
|
||||
# Print a single cell (state -- )
|
||||
word print_cell
|
||||
if 35 putc else 32 putc end
|
||||
end
|
||||
|
||||
# Print the current generation (addr -- )
|
||||
word print_gen
|
||||
WIDTH
|
||||
while dup 0 > do
|
||||
over @ print_cell
|
||||
swap 8 + swap
|
||||
1 -
|
||||
end
|
||||
drop drop
|
||||
10 putc
|
||||
end
|
||||
|
||||
# Get cell with wraparound (ptr idx -- value)
|
||||
word get_cell
|
||||
dup 0 < if WIDTH + end
|
||||
dup WIDTH >= if WIDTH - end
|
||||
8 * + @
|
||||
end
|
||||
|
||||
# Compute next generation (current next --)
|
||||
word next_gen
|
||||
over over # current next current next
|
||||
0 # current next current next i
|
||||
while dup WIDTH < do
|
||||
# Stack (bottom->top): current next current next i
|
||||
# Indices (0=top): i=0, next=1, current=2, next=3, current=4
|
||||
|
||||
# Get left neighbor: current[i-1]
|
||||
2 pick # current
|
||||
over # i
|
||||
1 - get_cell
|
||||
# Stack: current next current next i left
|
||||
# Indices: left=0, i=1, next=2, current=3
|
||||
|
||||
# Get center: current[i]
|
||||
3 pick # current
|
||||
2 pick # i
|
||||
get_cell
|
||||
# Stack: current next current next i left center
|
||||
|
||||
# Get right: current[i+1]
|
||||
4 pick # current
|
||||
3 pick # i
|
||||
1 + get_cell
|
||||
# Stack: current next current next i left center right
|
||||
|
||||
rule110
|
||||
# Stack: current next current next i result
|
||||
|
||||
# Store in next[i]
|
||||
2 pick # next
|
||||
2 pick # i
|
||||
8 * + # addr
|
||||
swap !
|
||||
# Stack: current next current next i
|
||||
|
||||
1 +
|
||||
end
|
||||
drop
|
||||
2drop
|
||||
2drop
|
||||
end
|
||||
|
||||
# Copy qword array (dest src count --)
|
||||
word copy_arr
|
||||
while dup 0 > do
|
||||
over @ # get src value
|
||||
3 pick swap ! # store at dest
|
||||
swap 8 + swap # src += 8
|
||||
rot 8 + -rot # dest += 8
|
||||
1 -
|
||||
end
|
||||
drop 2drop
|
||||
end
|
||||
|
||||
# Main entry point
|
||||
word main
|
||||
WIDTH 8 * alloc # current
|
||||
WIDTH 8 * alloc # next
|
||||
|
||||
# Initialize current to zeros
|
||||
over WIDTH for
|
||||
dup 0 !
|
||||
8 +
|
||||
end
|
||||
drop
|
||||
|
||||
# Set rightmost cell to 1
|
||||
over WIDTH 1 - 8 * + 1 !
|
||||
|
||||
# Run simulation
|
||||
GENERATIONS for
|
||||
over print_gen
|
||||
2dup next_gen
|
||||
over over WIDTH copy_arr
|
||||
end
|
||||
|
||||
# Free memory
|
||||
swap WIDTH 8 * free
|
||||
WIDTH 8 * free
|
||||
|
||||
0
|
||||
end
|
||||
|
||||
1
tests/rule110.test
Normal file
1
tests/rule110.test
Normal file
@@ -0,0 +1 @@
|
||||
python main.py tests/rule110.sl -o ./build/rule110 > /dev/null && ./build/rule110
|
||||
Reference in New Issue
Block a user