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

MinesweeperBoard.java 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. final class MinesweeperBoard {
  4. private static final char MINE_CHAR = '*';
  5. private static final char SPACE_CHAR = ' ';
  6. private final List<String> rawRepresentation;
  7. private final int numberOfRows;
  8. private final int numberOfColumns;
  9. MinesweeperBoard(final List<String> rawRepresentation) {
  10. this.rawRepresentation = rawRepresentation;
  11. this.numberOfRows = rawRepresentation.size();
  12. this.numberOfColumns = rawRepresentation.isEmpty() ? 0 : rawRepresentation.get(0).length();
  13. }
  14. List<String> withNumbers() {
  15. final List<String> result = new ArrayList<>();
  16. for (int rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
  17. result.add(getRowWithNumbers(rowNumber));
  18. }
  19. return result;
  20. }
  21. private String getRowWithNumbers(final int rowNumber) {
  22. StringBuilder result = new StringBuilder(numberOfColumns);
  23. for (int columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
  24. result.append(getCellNumber(rowNumber, columnNumber));
  25. }
  26. return result.toString();
  27. }
  28. private char getCellNumber(final int rowNumber, final int columnNumber) {
  29. // If (rowNumber, columnNumber) is a mine, we're done.
  30. if (rawRepresentation.get(rowNumber).charAt(columnNumber) == MINE_CHAR) {
  31. return MINE_CHAR;
  32. }
  33. final int mineCount = computeMineCountAround(rowNumber, columnNumber);
  34. // If computed count is positive, add it to the annotated row. Otherwise, add a blank space.
  35. return mineCount > 0 ? Character.forDigit(mineCount, 10) : SPACE_CHAR;
  36. }
  37. private int computeMineCountAround(final int rowNumber, final int columnNumber) {
  38. int result = 0;
  39. // Compute row and column ranges to inspect (respecting board edges).
  40. final int minRowToInspect = Math.max(rowNumber - 1, 0);
  41. final int maxRowToInspect = Math.min(rowNumber + 1, numberOfRows - 1);
  42. final int minColToInspect = Math.max(columnNumber - 1, 0);
  43. final int maxColToInspect = Math.min(columnNumber + 1, numberOfColumns - 1);
  44. // Count mines in the cells surrounding (row, col).
  45. for (int rowToInspect = minRowToInspect; rowToInspect <= maxRowToInspect; rowToInspect++) {
  46. for (int colToInspect = minColToInspect; colToInspect <= maxColToInspect; colToInspect++) {
  47. if (rawRepresentation.get(rowToInspect).charAt(colToInspect) == MINE_CHAR) {
  48. result += 1;
  49. }
  50. }
  51. }
  52. return result;
  53. }
  54. }