]> gitweb.factorcode.org Git - factor.git/commitdiff
game-of-life: count-neighbors needs circular wraparound logic back.
authorJohn Benediktsson <mrjbq7@gmail.com>
Sat, 10 Mar 2018 00:53:05 +0000 (16:53 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sat, 10 Mar 2018 00:53:05 +0000 (16:53 -0800)
extra/game-of-life/game-of-life.factor

index 90a41bedbfd2e91811c1c2278d4be339e2f5209d..ddff0ae43716ce505c46cb4637ad5b2499336e5e 100644 (file)
@@ -16,23 +16,22 @@ IN: game-of-life
 : grid-dim ( grid -- rows cols )
     [ length ] [ first length ] bi ;
 
+:: wraparound ( x min max -- y )
+    x min < [ max ] [ x max > min x ? ] if ; inline
+
 :: count-neighbors ( grid -- counts )
     grid grid-dim { fixnum fixnum } declare :> ( rows cols )
     rows <iota> [| j |
         cols <iota> [| i |
             { -1 0 1 } [
                 { -1 0 1 } [
-                    [ i fixnum+fast ] [ j fixnum+fast ] bi*
-                    { fixnum fixnum } declare :> ( col row )
-                    {
-                        [ col i = row j = and not ]
-                        [ col 0 >= ] [ col cols < ]
-                        [ row 0 >= ] [ row rows < ]
-                    } 0&& [
-                        col row grid
+                    2dup [ zero? ] both? [ 2drop f ] [
+                        [ i fixnum+fast 0 cols 1 - wraparound ]
+                        [ j fixnum+fast 0 rows 1 - wraparound ] bi*
+                        { fixnum fixnum } declare grid
                         { array } declare nth-unsafe
                         { bit-array } declare nth-unsafe
-                    ] [ f ] if
+                    ] if
                 ] with count
             ] map-sum
         ] map