#include <bits/stdc++.h>
#pragma warning(disable : 4786)
#pragma comment(linker, "/STACK:16777216")
using namespace std;
template <class T>
inline T SQ(T a) {
  return a * a;
}
template <class T>
inline T MAX(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T MIN(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline T ABS(T a) {
  return a < 0 ? (a * -1) : a;
}
template <class T>
inline void SWAP(T &a, T &b) {
  a ^= b;
  b = a ^ b;
  a ^= b;
}
template <class T>
inline T GCD(T a, T b) {
  while (b) {
    b ^= a ^= b ^= a %= b;
  }
  return a;
}
template <class T, class T1>
inline void REVS(T1 &A, T i, T j) {
  for (; i < j; i++, j--) SWAP(A[i], A[j]);
}
template <class T, class T1>
inline void REVC(T1 A[], T i, T j) {
  for (; i < j; i++, j--) SWAP(A[i], A[j]);
}
const int SZ = 10;
const double EPS = 1e-11;
const long long INF = 2147383647;
const double PI = 2 * acos(0.0);
int vhx[] = {0, -1, 0, 1}, vhy[] = {-1, 0, 1, 0};
int vhax[] = {0, -1, -1, -1, 0, 1, 1, 1}, vhay[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int vis[SZ][SZ];
bool inRange(int a, int b) { return a >= 1 && a <= 8 && b >= 1 && b <= 8; }
void bfs(int x, int y) {
  int i, a, b;
  queue<int> q;
  q.push(x);
  q.push(y);
  vis[x][y] = 0;
  while (!q.empty()) {
    x = q.front();
    q.pop();
    y = q.front();
    q.pop();
    for (i = 0; i <= 7; i++) {
      a = x + vhax[i];
      b = y + vhay[i];
      if (inRange(a, b) && vis[a][b] == -1) {
        vis[a][b] = vis[x][y] + 1;
        q.push(a);
        q.push(b);
      }
    }
  }
}
int main() {
  int r1, c1, r2, c2, rook, bishop, king, p1, p2;
  scanf("%d %d %d %d", &r1, &c1, &r2, &c2);
  if (r1 == r2 || c1 == c2)
    rook = 1;
  else
    rook = 2;
  p1 = r1 + c1;
  p2 = r2 + c2;
  if (p1 % 2 == p2 % 2) {
    if (ABS(r2 - r1) == ABS(c2 - c1))
      bishop = 1;
    else
      bishop = 2;
  } else {
    bishop = 0;
  }
  memset(vis, -1, sizeof(vis));
  bfs(r1, c1);
  king = vis[r2][c2];
  printf("%d %d %d\n", rook, bishop, king);
  return 0;
}
