X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=004%2Flife.awk;h=469229ad70d00b68759b6395f8722d90cb0eec07;hb=3a20c476f299ddbe993ac28b5dec75a407edf338;hp=ff80828d8b63ee4f10fbbb8707725aa62f0c243c;hpb=b161e882115ea83abb3146beb14e15e97ca9a023;p=cellular-automata.git diff --git a/004/life.awk b/004/life.awk index ff80828..469229a 100755 --- a/004/life.awk +++ b/004/life.awk @@ -6,7 +6,7 @@ function CHAR_ALIVE() {return "o"} function CHAR_DEAD() {return " "} -function get_init_cell() { +function get_random_state() { return int(2 * rand()) } @@ -15,21 +15,13 @@ function get_init_board(n) { board = ""; for (i=1; i <= n; i++) { - board = sprintf("%s%d", board, get_init_cell()) + board = sprintf("%s%d", board, get_random_state()) }; return board } -function do_print_border(x) { - for (i=1; i <= x; i++) { - printf CHAR_BORDER() - }; - print; -} - - function get_char_of_state(state) { if (state == 1) { return CHAR_ALIVE() @@ -39,6 +31,14 @@ function get_char_of_state(state) { } +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); @@ -50,7 +50,7 @@ function do_print_board(x, n, board) { } }; - do_print_border(x); + do_print_border(x) } @@ -86,17 +86,22 @@ function get_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 = get_new_state(cell_state, live_neighbors); - new_board = sprintf("%s%d", new_board, new_cell_state); + new_board = sprintf("%s%d", new_board, new_cell_state) }; return new_board @@ -115,7 +120,7 @@ function life() { while (1) { do_print_board(x, n, board); - board = get_new_generation(x, n, board); + board = get_new_generation(x, n, board) } }