ハチロク世代のskypeチャットでライフゲームの実装が話題に

どう書く?.orgで出題されていたライフゲームの実装のがハチロク世代skypeチャットで話題にあがったので何も考えず勢いで書いてみた。風呂で。
微妙にお題に沿わないので、投稿せずにここに書いておく。

/*
  life.c
  compile: $ gcc -o life life.c
  usage: $ ./life < data
           <ctrl>-c to exit
  data format:
    example)
6 8
00100001
10010110
01101000
10100101
00010101
01011010
[EOF]
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int row, column;
    int i, j;
    int c;
    int arround;
    int up, right, down, left;
    int population=0, generation=0;
    int **cell, **new_cell, **temp;
    
    scanf("%d %d ", &row, &column);
    
    cell = (int**)malloc(sizeof(int*)*row);
    new_cell = (int**)malloc(sizeof(int*)*row);
    
    for(i=0;i<row;i++)
    {
        cell[i] = (int*)malloc(sizeof(int)*column);
        new_cell[i] = (int*)malloc(sizeof(int)*column);
        
        for(j=0;j<column;j++)
        {
            c = getchar()-'0';
            if(c)
            {
                cell[i][j] = 1;
                population++;
            }
            else
            {
                cell[i][j] = 0;
            }
        }
        
        getchar();
    }
    
    for(i=0;i<=row;i++)
    {
        printf("\n");
    }
    
    while(1)
    {
        printf("\033[%dA", row+1);
    
        for(i=0;i<row;i++)
        {
            for(j=0;j<column;j++)
            {
                if(cell[i][j])
                {
                    printf("■ ");
                }
                else
                {
                    printf("  ");
                }
            
            }
            printf("\n");
        }
        
        printf("\033[0mlife game generation: %d population: %d\r\n", generation, population);
        
        sleep(1);
        
        population = 0;
        
        for(i=0;i<row;i++)
        {
            up = (i+row-1) % row;
            down = (i+row+1) % row;
                
            for(j=0;j<column;j++)
            {
                left = (j+column-1) % column;
                right = (j+column+1) % column;
                
                arround = 0;
                arround += cell[up][j];
                arround += cell[up][right];
                arround += cell[i][right];
                arround += cell[down][right];
                arround += cell[down][j];
                arround += cell[down][left];
                arround += cell[i][left];
                arround += cell[up][left];
                
                if(cell[i][j])
                {
                    if(arround==3 || arround==2)
                    {
                        new_cell[i][j] = 1;
                        population++;
                    }
                    else
                    {
                        new_cell[i][j] = 0;
                    }
                }
                else
                {
                    if(arround==3)
                    {
                        new_cell[i][j] = 1;
                        population++;
                    }
                    else
                    {
                        new_cell[i][j] = 0;
                    }
                }
            }
        }
        
        temp = cell;
        cell = new_cell;
        new_cell = temp;
        
        generation++;
    }
    
    for(i=0;i<row;i++)
    {
        free(cell[i]);
        free(new_cell[i]);
    }
    
    free(cell);
    free(new_cell);

    return 0;
}