Pointing directly at `awk`, rather than via `env`.
[cellular-automata.git] / 004 / life.awk
index 5116adc..73cad1d 100755 (executable)
@@ -1,4 +1,4 @@
-#! /usr/bin/env awk -f
+#! /usr/bin/awk -f
 
 
 function CHAR_BORDER() {return "-"}
@@ -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,24 +69,15 @@ function new_state(state, live_neighbors) {
 }
 
 
-function ensure_negative(n) {
-    if (n < 0) {
-        return n
-    } else {
-        return -n
-    }
-}
-
-
-function new_generation(x, n, board) {
-    offsets["N" ] = ensure_negative(x    );
-    offsets["NE"] = ensure_negative(x - 1);
-    offsets["E" ] =                     1 ;
-    offsets["SE"] =                 x + 1 ;
-    offsets["S" ] =                 x     ;
-    offsets["SW"] =                 x - 1 ;
-    offsets["W" ] =                   - 1 ;
-    offsets["NW"] = ensure_negative(x + 1);
+function get_new_generation(x, n, board) {
+    offsets["N" ] =  - x     ;
+    offsets["NE"] =  -(x - 1);
+    offsets["E" ] =        1 ;
+    offsets["SE"] =    x + 1 ;
+    offsets["S" ] =    x     ;
+    offsets["SW"] =    x - 1 ;
+    offsets["W" ] =      - 1 ;
+    offsets["NW"] =  -(x + 1);
 
     new_board = "";
 
@@ -95,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
@@ -120,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.024409 seconds and 4 git commands to generate.