Wireworld/Java
With help from Conway's Game of Life#Java: <lang java5>public class Wireworld{
public static final char empt = ' '; public static final char head = 'h'; public static final char tail = 't'; public static final char ctor = '.';
public static char[][] iterate(char[][] world){ char[][] nextGen = new char[world.length][world[0].length]; for(int row = 0; row < world.length; row++){//each row String thisRow = new String(world[row]); for(int col = 0; col < thisRow.length(); col++){//each char in the row switch (world[row][col]) { case head: nextGen[row][col] = tail; continue; case tail: nextGen[row][col] = ctor; continue; case empt: nextGen[row][col] = empt; continue; default: } String above = "";//neighbors above String same = "";//neighbors in the same row String below = "";//neighbors below if(col == 0){//all the way on the left //no one above if on the top row //otherwise grab the neighbors from above above = (row == 0) ? null : new String(world[row - 1]).substring(col, col + 2); same = thisRow.substring(col + 1, col + 2); //no one below if on the bottom row //otherwise grab the neighbors from below below = (row == world.length - 1) ? null : new String(world[row + 1]).substring(col, col + 2); }else if (col == thisRow.length() - 1){//right //no one above if on the top row //otherwise grab the neighbors from above above = (row == 0) ? null : new String(world[row - 1]).substring(col - 1, col + 1); same = thisRow.substring(col - 1, col); //no one below if on the bottom row //otherwise grab the neighbors from below below = (row == world.length - 1) ? null : new String(world[row + 1]).substring(col - 1, col + 1); }else{//anywhere else //no one above if on the top row //otherwise grab the neighbors from above above = (row == 0) ? null : new String(world[row - 1]).substring(col - 1, col + 2); same = thisRow.substring(col - 1, col) + thisRow.substring(col + 1, col + 2); //no one below if on the bottom row //otherwise grab the neighbors from below below = (row == world.length - 1) ? null : new String(world[row + 1]).substring(col - 1, col + 2); } int heads = headsInNeighborhood(above, same, below); switch (heads){ case 1: case 2: nextGen[row][col] = head; break; default: nextGen[row][col] = ctor; } } } return nextGen; }
private static int headsInNeighborhood(String above, String same, String below){ int ans = 0; if(above != null){//no one above for(char x : above.toCharArray()){//each neighbor from above if(x == head){ ans++;//count it if a head is here } } } for(char x : same.toCharArray()){//two on either side if(x == head){ ans++;//count it if a head is here } } if(below != null){//no one below for(char x : below.toCharArray()){//each neighbor below if(x == head){ ans++;//count it if a head is here } } } return ans; }
public static void main(String[] args){ char[][] world = { "th.........".toCharArray(), ". . ".toCharArray(), " ... ".toCharArray(), ". . ".toCharArray(), "ht.. ......".toCharArray() }; for(int i = 0; i <= 20; i++){ System.out.println("Iteration " + i + ":"); printWorld(world); System.out.println(); world = iterate(world); } }
private static void printWorld(char[][] world){ for(char[] row : world){ System.out.println(row); } }
}</lang>
- Output:
Iteration 0: th......... . . ... . . ht.. ...... Iteration 1: .th........ h . ... h . t... ...... Iteration 2: h.th....... t . ... t . .h.. ...... Iteration 3: th.th...... . h ... . . hth. ...... Iteration 4: .th.th..... h t hhh h . t.th ...... Iteration 5: h.th.th.... t . ttt t . .h.t ...... Iteration 6: th.th.th... . h ... . . hth. ...... Iteration 7: .th.th.th.. h t hhh h . t.th ...... Iteration 8: h.th.th.th. t . ttt t . .h.t ...... Iteration 9: th.th.th.th . h ... . . hth. ...... Iteration 10: .th.th.th.t h t hhh h . t.th ......