Ghost neighbors beyond boundaries!
[cellular-automata.git] / 004 / life.awk
index 714f209..469229a 100755 (executable)
@@ -6,31 +6,23 @@ function CHAR_ALIVE()  {return "o"}
 function CHAR_DEAD()   {return " "}
 
 
-function init_cell() {
+function get_random_state() {
     return int(2 * rand())
 }
 
 
-function init_board(n) {
+function get_init_board(n) {
     board = "";
 
     for (i=1; i <= n; i++) {
-        board = sprintf("%s%d", board, init_cell())
+        board = sprintf("%s%d", board, get_random_state())
     };
 
     return board
 }
 
 
-function print_border(x) {
-    for (i=1; i <= x; i++) {
-        printf CHAR_BORDER()
-    };
-    print;
-}
-
-
-function char_of_state(state) {
+function get_char_of_state(state) {
     if (state == 1) {
         return CHAR_ALIVE()
     } else if (state == 0) {
@@ -39,22 +31,30 @@ function char_of_state(state) {
 }
 
 
-function print_board(x, n, board) {
-    print_border(x);
+function do_print_border(x) {
+    for (i=1; i <= x; i++) {
+        printf CHAR_BORDER()
+    };
+    print
+}
+
+
+function do_print_board(x, n, board) {
+    do_print_border(x);
 
     for (i=1; i <= n; i++) {
-        printf "%s", char_of_state(substr(board, i, 1));
+        printf "%s", get_char_of_state(substr(board, i, 1));
 
         if (i % x == 0) {
             printf "\n"
         }
     };
 
-    print_border(x);
+    do_print_border(x)
 }
 
 
-function new_state(state, live_neighbors) {
+function get_new_state(state, live_neighbors) {
     if (state == 1 && live_neighbors < 2) {
         return 0
     } else if (state == 1 && live_neighbors < 4) {
@@ -69,7 +69,7 @@ function new_state(state, live_neighbors) {
 }
 
 
-function new_generation(x, n, board) {
+function get_new_generation(x, n, board) {
     offsets["N" ] =  - x     ;
     offsets["NE"] =  -(x - 1);
     offsets["E" ] =        1 ;
@@ -86,17 +86,22 @@ function new_generation(x, n, board) {
         live_neighbors = 0;
 
         for (direction in offsets) {
-            neighbor = offsets[direction] + cell_id;
-
-            # Make sure we're within limmits of the board
-            if ( !(neighbor < 1) && !(neighbor > n)) {
-                neighbor_state = substr(board, neighbor, 1);
-                live_neighbors += neighbor_state;
-            }
+            neighbor_id = offsets[direction] + cell_id;
+
+            # -----------------------------------------------------------------
+            # Real neighbors within boundaries, ghosts beyond that!
+            # -----------------------------------------------------------------
+            if ((neighbor_id >= 1) && (neighbor_id <= n)) {
+                neighbor_state = substr(board, neighbor_id, 1)
+            } else {
+                neighbor_state = get_random_state()
+            };
+
+            live_neighbors += neighbor_state
         }
 
-        new_cell_state = new_state(cell_state, live_neighbors);
-        new_board = sprintf("%s%d", new_board, new_cell_state);
+        new_cell_state = get_new_state(cell_state, live_neighbors);
+        new_board = sprintf("%s%d", new_board, new_cell_state)
     };
 
     return new_board
@@ -111,11 +116,11 @@ function life() {
     y = stty_size[1] - 3;  # Minus 1 char for each: border, border, cursor
     n = x * y;
 
-    board = init_board(n);
+    board = get_init_board(n);
 
     while (1) {
-        print_board(x, n, board);
-        board = new_generation(x, n, board);
+        do_print_board(x, n, board);
+        board = get_new_generation(x, n, board)
     }
 }
 
This page took 0.027719 seconds and 4 git commands to generate.