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;
+	
+}