#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000 * 100 + 10;
int x1, y11111, x2, y2, dist[10][10];
pair<int, int> turnlad[4] = {make_pair(0, 1), make_pair(1, 0), make_pair(-1, 0),
                             make_pair(0, -1)};
pair<int, int> turnslon[4] = {make_pair(1, 1), make_pair(-1, 1),
                              make_pair(1, -1), make_pair(-1, -1)};
pair<int, int> turncrow[8] = {
    make_pair(0, 1), make_pair(1, 0),  make_pair(-1, 0), make_pair(0, -1),
    make_pair(1, 1), make_pair(-1, 1), make_pair(1, -1), make_pair(-1, -1)};
void init() {
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      dist[i][j] = INT_MAX;
    }
  }
  dist[x1][y11111] = 0;
}
bool good(int x, int y) { return (x >= 0 && x < 8 && y >= 0 && y < 8); }
int lad() {
  set<pair<int, pair<int, int> > > s;
  init();
  s.insert(make_pair(0, make_pair(x1, y11111)));
  while (!s.empty()) {
    pair<int, pair<int, int> > cur = *s.begin();
    s.erase(s.begin());
    for (int i = -7; i < 8; i++) {
      if (i != 0) {
        for (int j = 0; j < 4; j++) {
          int nx = cur.second.first + turnlad[j].first * i;
          int ny = cur.second.second + turnlad[j].second * i;
          if (good(nx, ny) &&
              dist[nx][ny] > dist[cur.second.first][cur.second.second] + 1) {
            s.erase(make_pair(dist[nx][ny], make_pair(nx, ny)));
            dist[nx][ny] = dist[cur.second.first][cur.second.second] + 1;
            s.insert(make_pair(dist[nx][ny], make_pair(nx, ny)));
          }
        }
      }
    }
  }
  return (dist[x2][y2] == INT_MAX ? 0 : dist[x2][y2]);
}
int slon() {
  set<pair<int, pair<int, int> > > s;
  init();
  s.insert(make_pair(0, make_pair(x1, y11111)));
  while (!s.empty()) {
    pair<int, pair<int, int> > cur = *s.begin();
    s.erase(s.begin());
    for (int i = -7; i < 8; i++) {
      if (i != 0) {
        for (int j = 0; j < 4; j++) {
          int nx = cur.second.first + turnslon[j].first * i;
          int ny = cur.second.second + turnslon[j].second * i;
          if (good(nx, ny) &&
              dist[nx][ny] > dist[cur.second.first][cur.second.second] + 1) {
            s.erase(make_pair(dist[nx][ny], make_pair(nx, ny)));
            dist[nx][ny] = dist[cur.second.first][cur.second.second] + 1;
            s.insert(make_pair(dist[nx][ny], make_pair(nx, ny)));
          }
        }
      }
    }
  }
  return (dist[x2][y2] == INT_MAX ? 0 : dist[x2][y2]);
}
int crow() {
  set<pair<int, pair<int, int> > > s;
  init();
  s.insert(make_pair(0, make_pair(x1, y11111)));
  while (!s.empty()) {
    pair<int, pair<int, int> > cur = *s.begin();
    s.erase(s.begin());
    for (int j = 0; j < 8; j++) {
      int nx = cur.second.first + turncrow[j].first;
      int ny = cur.second.second + turncrow[j].second;
      if (good(nx, ny) &&
          dist[nx][ny] > dist[cur.second.first][cur.second.second] + 1) {
        s.erase(make_pair(dist[nx][ny], make_pair(nx, ny)));
        dist[nx][ny] = dist[cur.second.first][cur.second.second] + 1;
        s.insert(make_pair(dist[nx][ny], make_pair(nx, ny)));
      }
    }
  }
  return (dist[x2][y2] == INT_MAX ? 0 : dist[x2][y2]);
}
int main() {
  scanf("%d%d%d%d", &x1, &y11111, &x2, &y2);
  x1--, y11111--, y2--, x2--;
  int ans1 = lad();
  int ans2 = slon();
  int ans3 = crow();
  printf("%d %d %d", ans1, ans2, ans3);
  return 0;
}
