annotate 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
rev   line source
jpayne@68 1 package fun;
jpayne@68 2
jpayne@68 3 import java.util.LinkedList;
jpayne@68 4 import java.util.Random;
jpayne@68 5
jpayne@68 6 public class Life {
jpayne@68 7
jpayne@68 8 public static void main(String[] args){
jpayne@68 9 Life life=new Life(args);
jpayne@68 10 life.simulate();
jpayne@68 11 }
jpayne@68 12 public Life(String[] args){
jpayne@68 13 xdim=Integer.parseInt(args[0]);
jpayne@68 14 ydim=Integer.parseInt(args[1]);
jpayne@68 15 rounds=Integer.parseInt(args[2]);
jpayne@68 16 prob=Float.parseFloat(args[3]);
jpayne@68 17 }
jpayne@68 18
jpayne@68 19 void simulate(){
jpayne@68 20 grid=new int[xdim][ydim];
jpayne@68 21 int[][] nextGrid=new int[xdim][ydim];
jpayne@68 22 initialize();
jpayne@68 23
jpayne@68 24 LinkedList<int[][]> queue=new LinkedList<int[][]>();
jpayne@68 25
jpayne@68 26 for(int i=0; i<rounds; i++){
jpayne@68 27
jpayne@68 28 print(i);
jpayne@68 29 int count=fill(nextGrid);
jpayne@68 30 int[][] temp=grid;
jpayne@68 31 grid=nextGrid;
jpayne@68 32 nextGrid=temp;
jpayne@68 33 // if(count<1){break;}
jpayne@68 34 // if(equals(grid, nextGrid)){break;}
jpayne@68 35
jpayne@68 36 for(int[][] x : queue){
jpayne@68 37 if(equals(grid, x)){return;}
jpayne@68 38 }
jpayne@68 39 queue.add(copy(grid));
jpayne@68 40 if(queue.size()>10){queue.poll();}
jpayne@68 41
jpayne@68 42 // long time=System.nanoTime();
jpayne@68 43 // long next=time+50000000;
jpayne@68 44 // while(System.nanoTime()<next);
jpayne@68 45 }
jpayne@68 46 }
jpayne@68 47
jpayne@68 48 int[][] copy(int[][] a){
jpayne@68 49 int[][] b=new int[xdim][ydim];
jpayne@68 50 for(int x=0; x<xdim; x++){
jpayne@68 51 for(int y=0; y<ydim; y++){
jpayne@68 52 b[x][y]=a[x][y];
jpayne@68 53 }
jpayne@68 54 }
jpayne@68 55 return b;
jpayne@68 56 }
jpayne@68 57
jpayne@68 58 boolean equals(int[][] a, int[][] b){
jpayne@68 59 for(int x=0; x<xdim; x++){
jpayne@68 60 for(int y=0; y<ydim; y++){
jpayne@68 61 if(a[x][y]!=b[x][y]){return false;}
jpayne@68 62 }
jpayne@68 63 }
jpayne@68 64 return true;
jpayne@68 65 }
jpayne@68 66
jpayne@68 67 void initialize(){
jpayne@68 68 Random randy=new Random();
jpayne@68 69 for(int x=0; x<xdim; x++){
jpayne@68 70 for(int y=0; y<ydim; y++){
jpayne@68 71 grid[x][y]=(randy.nextFloat()<prob ? 1 : 0);
jpayne@68 72 }
jpayne@68 73 }
jpayne@68 74 }
jpayne@68 75
jpayne@68 76 int fill(int[][] nextGrid){
jpayne@68 77 int count=0;
jpayne@68 78 for(int x=0; x<xdim; x++){
jpayne@68 79 for(int y=0; y<ydim; y++){
jpayne@68 80 int z=next(x, y);
jpayne@68 81 nextGrid[x][y]=z;
jpayne@68 82 count+=z;
jpayne@68 83 }
jpayne@68 84 }
jpayne@68 85 return count;
jpayne@68 86 }
jpayne@68 87
jpayne@68 88 int next(int x, int y){
jpayne@68 89 int sum=neighbors(x, y);
jpayne@68 90 return (sum==3 || (sum==2 && grid[x][y]==1)) ? 1 : 0;
jpayne@68 91 }
jpayne@68 92
jpayne@68 93 int neighbors(int x, int y){
jpayne@68 94 // int minX=Tools.max(x-1, 0);
jpayne@68 95 // int minY=Tools.max(y-1, 0);
jpayne@68 96 // int maxX=Tools.min(x+1, xdim-1);
jpayne@68 97 // int maxY=Tools.min(y+1, ydim-1);
jpayne@68 98
jpayne@68 99 int sum=-grid[x][y];
jpayne@68 100 // for(int i=minX; i<=maxX; i++){
jpayne@68 101 // for(int j=minY; j<=maxY; j++){
jpayne@68 102 // sum+=grid[i][j];
jpayne@68 103 // }
jpayne@68 104 // }
jpayne@68 105 for(int i=-1; i<=1; i++){
jpayne@68 106 for(int j=-1; j<=1; j++){
jpayne@68 107 sum+=grid[(i+x+xdim)%xdim][(j+y+ydim)%ydim];
jpayne@68 108 }
jpayne@68 109 }
jpayne@68 110 return sum;
jpayne@68 111 }
jpayne@68 112
jpayne@68 113 void print(int round){
jpayne@68 114
jpayne@68 115 StringBuilder sb=new StringBuilder();
jpayne@68 116 System.out.print("\033[H\033[2J");
jpayne@68 117 sb.append("\nRound "+round+"\n");
jpayne@68 118 for(int x=0; x<xdim; x++){
jpayne@68 119 for(int y=0; y<ydim; y++){
jpayne@68 120 sb.append(grid[x][y]==0 ? ' ' : '@');
jpayne@68 121 }
jpayne@68 122 sb.append('\n');
jpayne@68 123 }
jpayne@68 124 // System.out.print("\033[H\033[2J");
jpayne@68 125 // System.out.flush();
jpayne@68 126 System.out.println(sb);
jpayne@68 127 System.out.flush();
jpayne@68 128 }
jpayne@68 129
jpayne@68 130 int[][] grid;
jpayne@68 131 int xdim, ydim, rounds;
jpayne@68 132 float prob;
jpayne@68 133
jpayne@68 134 }