Exploring cellular automata with conway's game of life as a foundation

////////////////////////////////////////////////////////////////////////////////
// THE SCOTCH-WARE LICENSE (Revision 0):
// <aaronryool/gmail.com> wrote this file. As long as you retain this notice you
// can do whatever you want with this stuff. If we meet some day, and you think
// this stuff is worth it, you can buy me a shot of scotch in return
////////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

typedef enum { false, true } bool;

#define BGBLACK "\033[40m"
#define BGRED "\033[41m"
#define BGWHITE "\033[47m"
#define RESET "\033[0m"
#define CLEAR "\033[2J"
#define HIDE_CURSOR "\e[?25l"
#define SHOW_CURSOR "\e[?25h"

#define SIZE(width * height)
#define CURSOR(x, y) printf("\033[%i;%iH\n", y, x)
#define STATE(x, y, limit_comp) (int)(((x) * width + (y)) limit_comp ? grid[(x) * width + (y)] : false)

void __attribute__((noreturn)) usage(char ** argv) {
  printf("%s <#frames>\n", argv[0]);
  exit(1);
}

void init(int argc, char ** argv, char ** envp) {
  if (argc != 2) usage(argv);
  printf("%s", HIDE_CURSOR);
  signal(SIGINT, exit);
}

void fini() {
  printf("%s", SHOW_CURSOR);
}
__attribute__((section(".init_array"))) typeof (init) * __init = init;
__attribute__((section(".fini_array"))) typeof (fini) * __fini = fini;
int grid_check_neighbors(bool * grid, int width, int height, int x, int y) {
  return STATE(x - 1, y - 1, >= 0) + STATE(x - 1, y, >= 0)
  	+ STATE(x - 1, y + 1, >= 0) + STATE(x, y - 1, >= 0)
  	+ STATE(x, y + 1, < SIZE) + STATE(x + 1, y - 1, < SIZE)
  	+ STATE(x + 1, y, < SIZE) + STATE(x + 1, y + 1, < SIZE);
}
void grid_step(bool * grid, int width, int height) {

unsigned int i, n;
  bool t[SIZE];
  memcpy(t, grid, SIZE * sizeof(bool));
  for (i = 0; i < SIZE; i++) {
    n = grid_check_neighbors(grid, width, height, i / width, i % width);
    if (!grid[i] && n == 3) t[i] = true;
    else if (n < 2 || n > 3) t[i] = false;
  }
  memcpy(grid, t, SIZE * sizeof(bool));
}
int main(int argc, char ** argv, char ** envp) {

  const int width = 25,
    height = 25;
  int i, c;
  unsigned int frames = atoi(argv[1]);
  if (!frames) usage(argv);
  bool grid[] = {
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
    0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  };
  
  printf("%s", CLEAR);
  for (i = 0; i < frames; i++) {
    CURSOR(0, 0);
    for (c = 0; c < SIZE; c++) {
      printf(grid[c] ? " %s" : " %s", grid[c] ? BGRED : c % 2 ? BGBLACK : BGWHITE);
      if ((c + 1) % width == 0) printf("%s\n", RESET);
    }
    grid_step(grid, width, height);
    usleep(1000 * 100);
  }
  return 0;
}

Comments

Popular posts from this blog

What is a canary, how does it work, and what does that mean if I want to write a modern exploit.

Better visualization of data formats using assembly POC's to better implement them in C

Putting Linux on your Android device using debootstrap and chroot