-#! /usr/bin/env awk -f
+#! /usr/bin/awk -f
function CHAR_BORDER() {return "-"}
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) {
}
-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) {
}
-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 = "";
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
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)
}
}