#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std ;
const int N=25 ;
int x1,y1,x2,y2 ;
int visit1[N][N] ;
int visit2[N][N] ;
int xx[]={1,1,2,2,2,2,-1,-1,-2,-2,-2,-2};
int yy[]={-2,2,-2,-1,1,2,-2,2,-1,1,-2,2};
struct node
{
int x,y,step ;
};
int bfs1()
{
queue<node>q ;
q.push({x1,y1,0}) ;
while(q.size())
{
node t=q.front() ;
q.pop();
if(t.x==1&&t.y==1) return t.step ;
else
{
for(int i=0;i<12;i++)
{
int idx=t.x+xx[i] ;
int idy=t.y+yy[i] ;
if(idx>=1&&idx<=20&&idy>=1&&idy<=20&&!visit1[idx][idy])
{
if(idx==1&&idy==1) return t.step+1 ;
else
{
visit1[idx][idy]=1 ;
q.push({idx,idy,t.step+1}) ;
}
}
}
}
}
return -1 ;
}
int bfs2()
{
queue<node>p ;
p.push({x2,y2,0}) ;
while(p.size())
{
node r=p.front() ;
p.pop();
if(r.x==1&&r.y==1) return r.step ;
else
{
for(int i=0;i<12;i++)
{
int idx=r.x+xx[i] ;
int idy=r.y+yy[i] ;
if(idx>=1&&idx<=25&&idy>=1&&idy<=25&&!visit2[idx][idy])
{
if(idx==1&&idy==1) return r.step+1 ;
else
{
visit2[idx][idy]=1 ;
p.push({idx,idy,r.step+1}) ;
}
}
}
}
}
return -1 ;
}
int main()
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2) ;
memset(visit1,0,sizeof(visit1)) ;
memset(visit2,0,sizeof(visit2)) ;
cout<<bfs1()<<" "<<bfs2()<<endl ;
return 0 ;
}