Primer – Predict Array

Predict the output of the following code without running it. The same code is written in C, C++, Python, and Java. The working codes are stored here.
Answer: [4 3 2 1 8 7 6 5 12 11 10 9]


C

int** performOps(int **A, int m, int n, int *len1, int *len2) {
    int i, j;
    *len1 = m;
    *len2 = n;
    int **B = (int **)malloc((*len1) * sizeof(int *));
    for (i = 0; i < *len1; i++)
        B[i] = (int *)malloc((*len2) * sizeof(int));

    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            B[i][n - 1 - j] = A[i][j];
    return B;
}

int main() {
    const int m = 3, n = 4;
    /********** Generate A **********/
    int **A = (int**)malloc(sizeof(int*)*m);
    for (int i = 0; i < m; ++i) A[i] 
        = (int*)malloc(sizeof(int) *n);
    for (int idx = 0; idx < m; ++idx)
        for (int jdx = 0; jdx < n; ++jdx)
            A[idx][jdx] = idx * n + jdx+1;
    /********** End of Gen **********/
    // A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int len1, len2;
    int **B = performOps(A, m, n, &len1, &len2);
    int i, j;
    for (i = 0; i < len1; i++)
        for (j = 0; j < len2; j++)
            printf("%d ", B[i][j]);
}

C++

vector<vector<int> > performOps(vector<vector<int> > &A) {
    vector<vector<int> > B;
    B.resize(A.size());
    for (int i = 0; i < A.size(); i++) {
        B[i].resize(A[i].size());
        for (int j = 0; j < A[i].size(); j++) {
            B[i][A[i].size() - 1 - j] = A[i][j];
        }
    }
    return B;
}

int main() {
	vector<vector<int> > A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
	vector<vector<int> > B = performOps(A);
	for (int i = 0; i < B.size(); i++)
	    for (int j = 0; j < B[i].size(); j++)
	    	cout << B[i][j] << " ";
}

Java

ArrayList<ArrayList<Integer>> performOps(ArrayList<ArrayList<Integer>> A) {
    ArrayList<ArrayList<Integer>> B = new ArrayList<ArrayList<Integer>>();
    for (int i = 0; i < A.size(); i++) {
        B.add(new ArrayList<Integer>());
    
        for (int j = 0; j < A.get(i).size(); j++) {
            B.get(i).add(0);
        }

        for (int j = 0; j < A.get(i).size(); j++) {
            B.get(i).set(A.get(i).size() - 1 - j, A.get(i).get(j));
        }
    }
    return B;
}
void main(String[] args) {
    /********** Generate A **********/
    ArrayList<ArrayList<Integer>> A = new ArrayList<>(Arrays.asList(
        new ArrayList<>(Arrays.asList(1, 2, 3, 4)), 
        new ArrayList<>(Arrays.asList(5, 6, 7, 8)), 
        new ArrayList<>(Arrays.asList(9, 10, 11, 12))));
    /********** End of Gen **********/
    // A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    ArrayList<ArrayList<Integer>> B = performOps(A);
    for (int i = 0; i < B.size(); i++)
        for (int j = 0; j < B.get(i).size(); j++)
            System.out.print(B.get(i).get(j) + " ");
}

Python

def performOps(A):
  m = len(A)
  n = len(A[0])
  B = []
  for i in xrange(len(A)):
    B.append([0] * n)
    for j in xrange(len(A[i])):
      B[i][n - 1 - j] = A[i][j]
  return B

if __name__ == '__main__':
  A = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
  B = performOps(A)
  for i in xrange(len(B)):
    for j in xrange(len(B[i])):
      print B[i][j],

Edit: Fixed Python bug