kurz/tests/conway.qbl

355 lines
3.8 KiB
Plaintext

//valid,.#......
//..#.....
//###.....
//........
//........
//........
//........
//........
//--------
//........
//#.#.....
//.##.....
//.#......
//........
//........
//........
//........
//--------
//........
//..#.....
//#.#.....
//.##.....
//........
//........
//........
//........
//--------
//........
//.#......
//..##....
//.##.....
//........
//........
//........
//........
//--------
//........
//..#.....
//...#....
//.###....
//........
//........
//........
//........
//--------
//:END:
arr field { int 64 }
arr field2 { int 64 }
1 0 coordToIndex 1 field.write
2 1 coordToIndex 1 field.write
0 2 coordToIndex 1 field.write
1 2 coordToIndex 1 field.write
2 2 coordToIndex 1 field.write
printArray
true 3
while
{
// i
iteration
0 dup 1 > -
}
deq
function => iteration
{
true 0
while
{
// y
true 0 req
// true x y
while
{
// x y
dup swp req
// y x x
dup swp
// x y x y
neighbourhood
// x y c
dup swp req
// x y x c
req dup swp req
// x y x y c
coordToIndex req req req
// i x y c
dup field.read
// x y c i v
req req req swp
// x y c v i
req req
// c v i x y
update
// x y
check
req
// lt x+1 y
}
// x y
deq check
// lt y+1
}
deq
copyArrays
printArray
}
function => copyArrays
{
true 0
while
{
// 0
dup field2.read
dup field.write
checkArr
}
deq
}
function => printArray
{
true 0
while
{
// y
true 0 req
// true x y
while
{
// x y
dup req dup swp
// x y x y
coordToIndex
// x y i
req req field.read
// x y v
req req printSym
// x y
check req
// lt x+1 y
}
// x y
"" deq req println check
// lt y+1
}
deq
"--------" println
}
function int => printSym
{
// x
1 ==
// eq
if
{
"#"
}
else
{
"."
}
print
}
function int => bool int checkArr
{
// i
1 + field.length dup
// i+1 l i+1
< req
// lt i+1
}
function int => bool int check
{
//???
// i
1 + 8 dup < req
//???
// i+1 8 i+1
}
function int int int => update
{
// count value index
3 dup req req req
// 3 c c v i
== req req req
// eq c v i
if
{
1 deq deq field2.write
}
else
{
// c v i
2 req req req
// 2 c v i
== 1 req req req
// 1 v i eq
== req && req
// teq i
if
{
1
}
else
{
0
}
field2.write
}
}
function int int => int neighbourhood
{
// x y
dup 1 req req -
// x y x-1
0 req req dup >=
// x y x-1 ge
req req req
// ge x y x-1
if
{
req dup swp
// x y x-1 y
req req
// x-1 y x y
row
// x y abc
}
else
{
// x y x-1
req req
// x-1 x y
deq 0
// x y 0
}
dup swp req req
// y x abc x
dup swp req row
// x y abc def
req req +
// x y abcdef
dup swp req req
// y x abcdef x
dup swp req
// x y x y abcdef
coordToIndex
// x y abcdef i
req req req
// i x y abcdef
field.read
// x y abcdef v
req req -
// x y abcdef-v
1 req req req
// 1 x y abcdef
+ req req
// x+1 y abcdef
dup 8 req req req
// x+1 l x+1 y abcdef
< req req req
// lt x+1 y abcdef
if
{
row
// abcdef ghi
}
else
{
deq deq 0
// abcdef 0
}
+
// abcdefghi
}
function int int => int row
{
// x y
1 req dup -
// x y y-1
dup req req
// y-1 x x y
0 dup swp req req
// 0 y-1 x y-1 x y
> req req req req
// gt x y-1 x y
if
{
deq deq 0
// x y 0
}
else
{
// x y-1 x y
coordToIndex req req
// i x y
field.read
// x y a
}
// x y a
dup swp req req
// y x a x
dup swp req
// x y x y a
coordToIndex
// x y a i
req req req field.read
// x y a b
req req +
// x y a+b
req 1 req
// a+b x 1 y
req req + req
// x y+1 a+b
req req 8
// a+b x y+1 l
req req dup
// y+1 l a+b x y+1
< req req req
// lt a+b x y+1
if
{
// a+b x y+1
req coordToIndex
// a+b i
req field.read
// a+b c
}
else
{
req deq deq 0
// a+b 0
}
+
// a+b+c
}
function int int => int coordToIndex
{
req 8 req * +
}