Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/Life.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/Life.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,134 @@ +package fun; + +import java.util.LinkedList; +import java.util.Random; + +public class Life { + + public static void main(String[] args){ + Life life=new Life(args); + life.simulate(); + } + public Life(String[] args){ + xdim=Integer.parseInt(args[0]); + ydim=Integer.parseInt(args[1]); + rounds=Integer.parseInt(args[2]); + prob=Float.parseFloat(args[3]); + } + + void simulate(){ + grid=new int[xdim][ydim]; + int[][] nextGrid=new int[xdim][ydim]; + initialize(); + + LinkedList<int[][]> queue=new LinkedList<int[][]>(); + + for(int i=0; i<rounds; i++){ + + print(i); + int count=fill(nextGrid); + int[][] temp=grid; + grid=nextGrid; + nextGrid=temp; +// if(count<1){break;} +// if(equals(grid, nextGrid)){break;} + + for(int[][] x : queue){ + if(equals(grid, x)){return;} + } + queue.add(copy(grid)); + if(queue.size()>10){queue.poll();} + +// long time=System.nanoTime(); +// long next=time+50000000; +// while(System.nanoTime()<next); + } + } + + int[][] copy(int[][] a){ + int[][] b=new int[xdim][ydim]; + for(int x=0; x<xdim; x++){ + for(int y=0; y<ydim; y++){ + b[x][y]=a[x][y]; + } + } + return b; + } + + boolean equals(int[][] a, int[][] b){ + for(int x=0; x<xdim; x++){ + for(int y=0; y<ydim; y++){ + if(a[x][y]!=b[x][y]){return false;} + } + } + return true; + } + + void initialize(){ + Random randy=new Random(); + for(int x=0; x<xdim; x++){ + for(int y=0; y<ydim; y++){ + grid[x][y]=(randy.nextFloat()<prob ? 1 : 0); + } + } + } + + int fill(int[][] nextGrid){ + int count=0; + for(int x=0; x<xdim; x++){ + for(int y=0; y<ydim; y++){ + int z=next(x, y); + nextGrid[x][y]=z; + count+=z; + } + } + return count; + } + + int next(int x, int y){ + int sum=neighbors(x, y); + return (sum==3 || (sum==2 && grid[x][y]==1)) ? 1 : 0; + } + + int neighbors(int x, int y){ +// int minX=Tools.max(x-1, 0); +// int minY=Tools.max(y-1, 0); +// int maxX=Tools.min(x+1, xdim-1); +// int maxY=Tools.min(y+1, ydim-1); + + int sum=-grid[x][y]; +// for(int i=minX; i<=maxX; i++){ +// for(int j=minY; j<=maxY; j++){ +// sum+=grid[i][j]; +// } +// } + for(int i=-1; i<=1; i++){ + for(int j=-1; j<=1; j++){ + sum+=grid[(i+x+xdim)%xdim][(j+y+ydim)%ydim]; + } + } + return sum; + } + + void print(int round){ + + StringBuilder sb=new StringBuilder(); + System.out.print("\033[H\033[2J"); + sb.append("\nRound "+round+"\n"); + for(int x=0; x<xdim; x++){ + for(int y=0; y<ydim; y++){ + sb.append(grid[x][y]==0 ? ' ' : '@'); + } + sb.append('\n'); + } +// System.out.print("\033[H\033[2J"); +// System.out.flush(); + System.out.println(sb); + System.out.flush(); + } + + int[][] grid; + int xdim, ydim, rounds; + float prob; + +}