Software Engineering

The right way to Clear up ‘Discovering Neo’ in Java

The right way to Clear up ‘Discovering Neo’ in Java
Written by admin


The problem

Neo is someplace within the Matrix.

public interface Matrix {
  public int dimension();
  public int get(int x, int y);
}

You’re Morpheus, and your job is to seek out him.

public class Morpheus {
  public int[] discover(Matrix matrix, int neo) {
    // return Neo's x and y coordinates as a two-element array
  }
}

You have to a great search technique – the matrix is large! However it’s managed by machines, so it is usually very orderly. It’s quadratic, and the next guidelines maintain for all components:

matrix[x,y] < matrix[x+1,y]
matrix[x,y] < matrix[x,y+1]

And naturally, there will probably be no duplicates of Neo – he’s The One.

The answer in Java code

Possibility 1:

public class Morpheus {
  public int[] discover(Matrix matrix, int neo) {
    int s = matrix.dimension();
    for (int x = s-1, y = 0; x >= 0 && y < s; ) {
      int e = matrix.get(x, y);
      if (neo < e) x--;
      else if (neo > e) y++;
      else return new int[]{x, y};
    }
    return null;
  }
}

Option2 :

public class Morpheus {
  public int[] discover(Matrix m, int n) {
    int x = 0, y = m.dimension() - 1, r;
    do {
      r = m.get(x, y);
      if (r < n) x++;
      if (r > n) y--;
    } whereas (r != n);
    return new int[]{x, y};
  }
}

Possibility 3:

import java.lang.mirror.Subject;

public class Morpheus {
  public int[] discover(Matrix matrix, int neo) {
    strive {
      Subject subject = matrix.getClass().getDeclaredField("pos");
      subject.setAccessible(true);
      return (int[]) subject.get(matrix);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

Take a look at instances to validate our resolution

import org.junit.Take a look at;
import static org.junit.Assert.assertArrayEquals;

public class MatrixTest {

  @Take a look at
  public void test1() {
    int[][] values = {{1}};
    Matrix matrix = new ArrayMatrix(1, values);
    int neo = 1;
    int[] pos = {0, 0};
    assertArrayEquals(pos, new Morpheus().discover(matrix, neo));
  }

  @Take a look at
  public void test2() {
    int[][] values = {{1,2},{3,4}};
    Matrix matrix = new ArrayMatrix(2, values);
    int neo = 3;
    int[] pos = {1, 0};
    assertArrayEquals(pos, new Morpheus().discover(matrix, neo));
  }

  @Take a look at
  public void test10() {
    int[][] values = {
      { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
      {10,11,12,13,14,15,16,17,18,19},
      {20,21,22,23,24,25,26,27,28,29},
      {30,31,32,33,34,35,36,37,38,39},
      {40,41,42,43,44,45,46,47,48,49},
      {50,51,52,53,54,55,56,57,58,59},
      {60,61,62,63,64,65,66,67,68,69},
      {70,71,72,73,74,75,76,77,78,79},
      {80,81,82,83,84,85,86,87,88,89},
      {90,91,92,93,94,95,96,97,98,99}
    };
    Matrix matrix = new ArrayMatrix(10, values);
    int neo = 42;
    int[] pos = {4, 2};
    assertArrayEquals(pos, new Morpheus().discover(matrix, neo));
  }
}

class ArrayMatrix extends Matrix {
  personal closing int dimension;
  personal closing int[][] matrix;
  
  public ArrayMatrix(int dimension, int[][] matrix) {
    this.dimension = dimension;
    this.matrix = matrix;
  }
  
  public int dimension() {
    return dimension;
  }
  
  public int get(int x, int y) {
    return matrix[x][y];
  }
}

About the author

admin

Leave a Comment