lots of exercises in java... from https://github.com/exercism/java

GoCounting.java 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import java.awt.Point;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6. class GoCounting {
  7. private Player[][] board;
  8. GoCounting (String boardString) {
  9. String[] lines = boardString.split("\n");
  10. board = new Player[lines[0].length()][lines.length];
  11. for (int i = 0; i < lines.length; i++) {
  12. for (int j = 0; j < lines[i].length(); j++) {
  13. if (lines[i].charAt(j) == 'B') {
  14. board[j][i] = Player.BLACK;
  15. } else if (lines[i].charAt(j) == 'W') {
  16. board[j][i] = Player.WHITE;
  17. } else {
  18. board[j][i] = Player.NONE;
  19. }
  20. }
  21. }
  22. }
  23. private ArrayList<Point> getAdjacent(Point p) {
  24. ArrayList<Point> adjacent = new ArrayList<>();
  25. if (p.x > 0) {
  26. adjacent.add(new Point(p.x - 1, p.y));
  27. }
  28. if (p.x < board.length - 1) {
  29. adjacent.add(new Point(p.x + 1, p.y));
  30. }
  31. if (p.y > 0) {
  32. adjacent.add(new Point(p.x, p.y - 1));
  33. }
  34. if (p.y < board[0].length - 1) {
  35. adjacent.add(new Point(p.x, p.y + 1));
  36. }
  37. return adjacent;
  38. }
  39. Player getTerritoryOwner(int x, int y) {
  40. if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {
  41. throw new IllegalArgumentException("Invalid coordinate");
  42. }
  43. if (board[x][y] == Player.BLACK || board[x][y] == Player.WHITE) {
  44. return Player.NONE;
  45. }
  46. ArrayList<Point> visited = new ArrayList<>();
  47. ArrayList<Point> edges = new ArrayList<>();
  48. ArrayList<Point> territory = new ArrayList<>();
  49. ArrayList<Point> tovisit = new ArrayList<>();
  50. tovisit.add(new Point(x, y));
  51. while (tovisit.size() > 0) {
  52. Point current = tovisit.remove(0);
  53. if (board[current.x][current.y] == Player.NONE) {
  54. visited.add(current);
  55. territory.add(current);
  56. ArrayList<Point> adjacent = getAdjacent(current);
  57. for (Point p : adjacent) {
  58. if (!visited.contains(p) && !tovisit.contains(p)) {
  59. tovisit.add(p);
  60. }
  61. }
  62. } else {
  63. edges.add(current);
  64. }
  65. }
  66. if (edges.size() == 0) {
  67. return Player.NONE;
  68. }
  69. Player owner = board[edges.get(0).x][edges.get(0).y];
  70. for (int i = 0; i < edges.size(); i++) {
  71. if (owner != board[edges.get(i).x][edges.get(i).y]) {
  72. owner = Player.NONE;
  73. }
  74. }
  75. return owner;
  76. }
  77. Set<Point> getTerritory(int x, int y) {
  78. if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {
  79. throw new IllegalArgumentException("Invalid coordinate");
  80. }
  81. ArrayList<Point> visited = new ArrayList<>();
  82. HashSet<Point> territory = new HashSet<>();
  83. ArrayList<Point> tovisit = new ArrayList<>();
  84. tovisit.add(new Point(x, y));
  85. while (tovisit.size() > 0) {
  86. Point current = tovisit.remove(0);
  87. if (board[current.x][current.y] == Player.NONE) {
  88. visited.add(current);
  89. territory.add(current);
  90. ArrayList<Point> adjacent = getAdjacent(current);
  91. for (Point p : adjacent) {
  92. if (!visited.contains(p) && !tovisit.contains(p)) {
  93. tovisit.add(p);
  94. }
  95. }
  96. }
  97. }
  98. return territory;
  99. }
  100. HashMap<String, Set<Point>> getTerritories() {
  101. HashMap<String, Set<Point>> territories = new HashMap<String, Set<Point>>();
  102. territories.put("WHITE", new HashSet<Point>());
  103. territories.put("BLACK", new HashSet<Point>());
  104. territories.put("NONE", new HashSet<Point>());
  105. for (int i = 0; i < board[0].length; i++) {
  106. for (int j = 0; j < board.length; j++) {
  107. if (board[j][i] == Player.NONE) {
  108. if (getTerritoryOwner(j, i) == Player.NONE) {
  109. territories.get("NONE").add(new Point(j, i));
  110. } else if (getTerritoryOwner(j, i) == Player.BLACK) {
  111. territories.get("BLACK").add(new Point(j, i));
  112. } else {
  113. territories.get("WHITE").add(new Point(j, i));
  114. }
  115. }
  116. }
  117. }
  118. return territories;
  119. }
  120. }