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