JS1k

#2, Xmas edition



Source for demo by Jeremy Clarke. See also description and commented source.

c.height*=2;g=[];h=[];for(x=-4;x<80;x++)for(y=0,g[x]=[],h[x]=[];y<76;y++)g[x][y]=h[x][y]=1;p=3;onkeydown=function(e){k=e.keyCode;48<k&&k<55?p=k-48:0};c.onmousemove=function(e){g[e.pageX/4|0][e.pageY/4|0]=p};setInterval(function(){for(x=0;x<75;x++){r=Math.random()*75|0;R=r%3-1;j=g[x];J=h[x];X=g[x+1];Z=g[x-1];l=g[x+R];L=g[x-R];q=h[x+R];Q=h[x-R];for(y=0;y<76;y++){t=j[y];d=j[Y=y+1];u=j[z=y-1];s=0;t==5&&R&&u^4?J[z]=5:t==4&&J[y]==1?d^1?l[Y]==1&&l[y]^4?q[Y]=4:L[Y]==1&&L[y]^4?Q[Y]=4:l[y]^1||q[y]^1?s=1:q[y]=4:J[Y]=4:t^3?t^2?0:s=1:d^1&&d^4?l[Y]==1&&l[y]^3?q[Y]=3:L[Y]==1&&L[y]^3?Q[Y]=3:J[y]=l[y+R]^5?t:4:(J[Y]=3,J[y]=d);if(t==6)if(d^3||j[y+2]^3)J[Y]=6;else{if(u&&!r%9)for(i=-4;i<5;i++)h[x+i][z]=g[x+i][z]^1?g[x+i][z]:0;s=1;};if(!t)R?Z[y]==1&&!X[y]&&g[x-2][y]^1?h[x+1][z]=0:X[y]==1&&!Z[y]&&g[x+2][y]^1?h[x-1][z]=0:Z[y]||X[y]?0:h[x][z]=0:0,s=1;s?J[y]=t?t:X[y]^5||u^5?t:5:0;a.fillStyle='#'+['2d3','000','877','eff','24f','f90','860'][t];a.fillRect(x*4,y*4,4,4);}}for(x in g)for(y in g[x])g[x][y]=1;G=g;H=h;g=H;h=G;g[r][0]=3;},75);