#include <bits/stdc++.h>
using namespace std;
bool visited[8][8];
struct node {
  int r;
  int c;
  int moves;
};
bool isValid(int r, int c) {
  if (r < 8 && r >= 0 && c < 8 && c >= 0 && visited[r][c] == false) {
    return true;
  }
  return false;
}
int main() {
  int r1, c1, r2, c2;
  int moves, r, c;
  int rock, bishop = 0, king;
  cin >> r1 >> c1 >> r2 >> c2;
  r1--;
  c1--;
  r2--;
  c2--;
  node start;
  start.r = r1;
  start.c = c1;
  start.moves = 0;
  queue<node> q;
  q.push(start);
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      visited[i][j] = false;
    }
  }
  int flag = 0;
  while (!q.empty()) {
    node check = q.front();
    q.pop();
    r = check.r;
    c = check.c;
    visited[r][c] = true;
    moves = check.moves;
    if (r == r2 && c == c2) {
      cout << moves;
      break;
    }
    int i = r + 1, j = c;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      i++;
    }
    i = r;
    j = c + 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      j++;
    }
    i = r - 1;
    j = c;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      i--;
    }
    i = r;
    j = c - 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      j--;
    }
  }
  while (!q.empty()) {
    q.pop();
  }
  q.push(start);
  moves = 0;
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      visited[i][j] = false;
    }
  }
  while (!q.empty()) {
    node check = q.front();
    q.pop();
    r = check.r;
    c = check.c;
    moves = check.moves;
    visited[r][c] = true;
    if (r == r2 && c == c2) {
      cout << " " << moves;
      flag = 1;
      break;
    }
    int i = r + 1, j = c + 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      i++;
      j++;
    }
    i = r - 1;
    j = c + 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      j++;
      i--;
    }
    i = r + 1;
    j = c - 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      i++;
      j--;
    }
    i = r - 1;
    j = c - 1;
    while (isValid(i, j)) {
      node newNode;
      newNode.r = i;
      newNode.c = j;
      newNode.moves = moves + 1;
      q.push(newNode);
      j--;
      i--;
    }
  }
  if (!flag) {
    cout << " " << 0;
  }
  cout << " " << max((int)abs(r1 - r2), (int)abs(c1 - c2));
  return 0;
}
