X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=004%2Flife.awk;fp=004%2Flife.awk;h=0000000000000000000000000000000000000000;hb=8d06c463b83b79e046250fbe60e5429f182e3a7a;hp=73cad1d4b86e40fea907833ed6d248b89c1ee359;hpb=4eb3be32ce405e69f39573b5e38171764cd0d789;p=cellular-automata.git diff --git a/004/life.awk b/004/life.awk deleted file mode 100755 index 73cad1d..0000000 --- a/004/life.awk +++ /dev/null @@ -1,128 +0,0 @@ -#! /usr/bin/awk -f - - -function CHAR_BORDER() {return "-"} -function CHAR_ALIVE() {return "o"} -function CHAR_DEAD() {return " "} - - -function get_random_state() { - return int(2 * rand()) -} - - -function get_init_board(n) { - board = ""; - - for (i=1; i <= n; i++) { - board = sprintf("%s%d", board, get_random_state()) - }; - - return board -} - - -function get_char_of_state(state) { - if (state == 1) { - return CHAR_ALIVE() - } else if (state == 0) { - return CHAR_DEAD() - } -} - - -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", get_char_of_state(substr(board, i, 1)); - - if (i % x == 0) { - printf "\n" - } - }; - - do_print_border(x) -} - - -function get_new_state(state, live_neighbors) { - if (state == 1 && live_neighbors < 2) { - return 0 - } else if (state == 1 && live_neighbors < 4) { - return 1 - } else if (state == 1 && live_neighbors > 3) { - return 0 - } else if (state == 0 && live_neighbors == 3) { - return 1 - } else { - return state - } -} - - -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 = ""; - - for (cell_id=1; cell_id <= n; cell_id++) { - cell_state = substr(board, cell_id, 1); - live_neighbors = 0; - - for (direction in offsets) { - 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) - }; - - return new_board -} - - -function life() { - "stty size" | getline stty_size_out; - split(stty_size_out, stty_size); - - x = stty_size[2]; - y = stty_size[1] - 3; # Minus 1 char for each: border, border, cursor - n = x * y; - - board = get_init_board(n); - - while (1) { - do_print_board(x, n, board); - board = get_new_generation(x, n, board) - } -} - - -BEGIN {life()}