private static int evaluateForPattern(State state, int patternSize) {
    int size = State.BORAD_SIZE;
    int value = 0;
    int i, j;
    Pattern pattern1 = new Pattern(patternSize);
    Pattern pattern2 = new Pattern(patternSize);
    for (i = 0; i < size; i++) {
      pattern1.reset();
      pattern2.reset();
      for (j = 0; j < patternSize; j++) {
        pattern1.put(state.board[j][i]);
        pattern2.put(state.board[i][j]);
      }
      j--;
      do {
        //                System.out.println("i:" + i + " j:" + j);
        value += pattern1.matches();
        value += pattern2.matches();

        j++;
        if (j == size) break;
        //                pattern1 -= state.board[j - patternSize][i];
        pattern1.put(state.board[j][i]);
        //                pattern1 += state.board[j][i];
        //                pattern2 -= state.board[i][j - patternSize];
        pattern2.put(state.board[i][j]);
        //                pattern2 += state.board[i][j];
      } while (true);
    }
    // (k1-k2: 45 degree, k1-k3 : 135 degree)
    int k1, k2, k3;
    for (i = -(size - patternSize); i <= size - patternSize; i++) {
      if (i < 0) {
        k1 = -i;
        k2 = 0;
        k3 = size - 1;
      } else {
        k1 = 0;
        k2 = i;
        k3 = size - i - 1;
      }
      pattern1.reset();
      pattern2.reset();
      for (j = 0; j < patternSize; j++) {
        pattern1.put(state.board[k1 + j][k2 + j]);
        pattern2.put(state.board[k1 + j][k3 - j]);
      }
      j--;
      do {
        value += pattern1.matches();
        value += pattern2.matches();

        j++;
        // 2 patterns are symmetric, so detection for 1 is enough
        if (k1 + j == size || k2 + j == size) break;
        //                pattern1 -= state.board[k1 + j - patternSize][k2 + j - patternSize];
        pattern1.put(state.board[k1 + j][k2 + j]);
        //                pattern1 += state.board[k1 + j][k2 + j];
        //                pattern2 -= state.board[k1 + j - patternSize][k3 - j + patternSize];
        pattern2.put(state.board[k1 + j][k3 - j]);
        //                pattern2 += state.board[k1 + j][k3 - j];
      } while (true);
    }

    return value;
  }