Mercurial > repos > rliterman > csp2
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 } |