#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <unordered_map>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <ctime>
#include <vector>
#include <fstream>
#include <list>
#include <iomanip>
#include <numeric>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(s) memset(s, 0, sizeof(s))
const int inf = 0x3f3f3f3f;
#define LOCAL
#define ft(i,n,m) for(int i=n;i<=m;i++)
#define fw(i,n,m) for(int i=n;i>=m;i--)
#define rr register int
#define mmp(x,y) make_pair(x,y)
int x1,x2,y_1,y2;
bool vis[1000][1000];
const int dx[]={0,-1,-1,1,1,-2,-2,2,2,2,-2,2,-2};
const int dy[]={0,-2,2,-2,2,-1,1,-1,1,2,-2,-2,2};
struct node
{
int x,y;
int step;
};
queue<node>q;
int bfs(int x,int y)
{
node a;
a.x=x,a.y=y;
a.step=0;
q.push(a);
while(!q.empty()){
a=q.front();
q.pop();
ft(i,1,12){
node c;
c.x=a.x+dx[i],c.y=a.y+dy[i];
if(c.x>=1&&c.y>=1&&vis[c.x][c.y]==0){
if(c.x==1&&c.y==1)return c.step;
vis[c.x][c.y]=1;
c.step=a.step+1;
q.push(c);
}
}
}
}
void solve()
{
cin>>x1>>y_1>>x2>>y2;
cout<<bfs(x1,y_1)<<endl;
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
cout<<bfs(x2,y2);
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
solve();
return 0;
}