#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
#define pi pair<int, int>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define eb emplace_back
#define pb push_back
#define TASK "DTTG"
#define ms(a, x) memset(a, x, sizeof(a))
#define all(a) a.begin(), a.end()
#define All(a, n) a + 1, a + 1 + n
#define LOG 19
const int INF = 1e18;
const int mod = 1e9;
const int N = 1e5 + 5;
const int MOD = 998244353;
struct Point{
int x, y;
bool operator == (const Point &other) const{
return x == other.x && y == other.y;
}
};
Point a, b, c, m, n;
int cross(Point u, Point v, Point w){
return (v.x - u.x) * (w.y - u.y) - (v.y - u.y) * (w.x - u.x);
}
bool trenDoan(Point u, Point v, Point w){
return cross(u, v, w) == 0
&& min(u.x, v.x) <= w.x
&& w.x <= max(u.x, v.x)
&& min(u.y, v.y) <= w.y
&& w.y <= max(u.y, v.y);
}
bool giaoNhau(Point u, Point v, Point s, Point t){
int c1 = cross(u, v, s);
int c2 = cross(u, v, t);
int c3 = cross(s, t, u);
int c4 = cross(s, t, v);
if(c1 == 0 && trenDoan(u, v, s)) return true;
if(c2 == 0 && trenDoan(u, v, t)) return true;
if(c3 == 0 && trenDoan(s, t, u)) return true;
if(c4 == 0 && trenDoan(s, t, v)) return true;
return ((c1 > 0 && c2 < 0) || (c1 < 0 && c2 > 0))
&& ((c3 > 0 && c4 < 0) || (c3 < 0 && c4 > 0));
}
bool trongTamGiac(Point p){
int s1 = cross(a, b, p);
int s2 = cross(b, c, p);
int s3 = cross(c, a, p);
return (s1 > 0 && s2 > 0 && s3 > 0)
|| (s1 < 0 && s2 < 0 && s3 < 0);
}
bool trungCanh(Point u, Point v){
return trenDoan(u, v, m) && trenDoan(u, v, n)
&& cross(u, v, m) == 0
&& cross(u, v, n) == 0;
}
void nhap(){
cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
cin >> m.x >> m.y >> n.x >> n.y;
}
void solve(){
if(trungCanh(a, b) || trungCanh(b, c) || trungCanh(c, a)){
cout << 3 << nn;
return;
}
if(trongTamGiac(m) && trongTamGiac(n)){
cout << 4 << nn;
return;
}
vector<Point> canh = {a, b, c};
vector<Point> diem;
for(int i = 0; i < 3; i++){
Point u = canh[i];
Point v = canh[(i + 1) % 3];
if(!giaoNhau(m, n, u, v)) continue;
if(cross(m, n, u) == 0 && cross(m, n, v) == 0){
if(trenDoan(m, n, u)) diem.pb(u);
if(trenDoan(m, n, v)) diem.pb(v);
if(trenDoan(u, v, m)) diem.pb(m);
if(trenDoan(u, v, n)) diem.pb(n);
}
else{
if(cross(m, n, u) == 0 && trenDoan(m, n, u)) diem.pb(u);
else if(cross(m, n, v) == 0 && trenDoan(m, n, v)) diem.pb(v);
else if(cross(u, v, m) == 0 && trenDoan(u, v, m)) diem.pb(m);
else if(cross(u, v, n) == 0 && trenDoan(u, v, n)) diem.pb(n);
else{
int c1 = cross(m, n, u);
int c2 = cross(m, n, v);
int c3 = cross(u, v, m);
int c4 = cross(u, v, n);
if(((c1 > 0 && c2 < 0) || (c1 < 0 && c2 > 0))
&& ((c3 > 0 && c4 < 0) || (c3 < 0 && c4 > 0))){
cout << 2 << nn;
return;
}
}
}
}
sort(all(diem), [](Point u, Point v){
if(u.x != v.x) return u.x < v.x;
return u.y < v.y;
});
diem.erase(unique(all(diem)), diem.end());
if(diem.size() >= 2) cout << 2 << nn;
else if(diem.size() == 1) cout << 1 << nn;
else cout << 0 << nn;
}
signed main(){
if(fopen(TASK".INP", "r")){
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
nhap();
solve();
return (0 ^ 0);
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIG5uICJcbiIKI2RlZmluZSBwaSBwYWlyPGludCwgaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgbGIgbG93ZXJfYm91bmQKI2RlZmluZSB1YiB1cHBlcl9ib3VuZAojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIFRBU0sgIkRUVEciCgojZGVmaW5lIG1zKGEsIHgpIG1lbXNldChhLCB4LCBzaXplb2YoYSkpCiNkZWZpbmUgYWxsKGEpIGEuYmVnaW4oKSwgYS5lbmQoKQojZGVmaW5lIEFsbChhLCBuKSBhICsgMSwgYSArIDEgKyBuCgojZGVmaW5lIExPRyAxOQoKY29uc3QgaW50IElORiA9IDFlMTg7CmNvbnN0IGludCBtb2QgPSAxZTk7CmNvbnN0IGludCBOID0gMWU1ICsgNTsKY29uc3QgaW50IE1PRCA9IDk5ODI0NDM1MzsKc3RydWN0IFBvaW50ewogICAgaW50IHgsIHk7CiAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBQb2ludCAmb3RoZXIpIGNvbnN0ewogICAgICAgIHJldHVybiB4ID09IG90aGVyLnggJiYgeSA9PSBvdGhlci55OwogICAgfQp9OwoKUG9pbnQgYSwgYiwgYywgbSwgbjsKCmludCBjcm9zcyhQb2ludCB1LCBQb2ludCB2LCBQb2ludCB3KXsKICAgIHJldHVybiAodi54IC0gdS54KSAqICh3LnkgLSB1LnkpIC0gKHYueSAtIHUueSkgKiAody54IC0gdS54KTsKfQoKYm9vbCB0cmVuRG9hbihQb2ludCB1LCBQb2ludCB2LCBQb2ludCB3KXsKICAgIHJldHVybiBjcm9zcyh1LCB2LCB3KSA9PSAwCiAgICAgICAgJiYgbWluKHUueCwgdi54KSA8PSB3LngKICAgICAgICAmJiB3LnggPD0gbWF4KHUueCwgdi54KQogICAgICAgICYmIG1pbih1LnksIHYueSkgPD0gdy55CiAgICAgICAgJiYgdy55IDw9IG1heCh1LnksIHYueSk7Cn0KYm9vbCBnaWFvTmhhdShQb2ludCB1LCBQb2ludCB2LCBQb2ludCBzLCBQb2ludCB0KXsKICAgIGludCBjMSA9IGNyb3NzKHUsIHYsIHMpOwogICAgaW50IGMyID0gY3Jvc3ModSwgdiwgdCk7CiAgICBpbnQgYzMgPSBjcm9zcyhzLCB0LCB1KTsKICAgIGludCBjNCA9IGNyb3NzKHMsIHQsIHYpOwogICAgaWYoYzEgPT0gMCAmJiB0cmVuRG9hbih1LCB2LCBzKSkgcmV0dXJuIHRydWU7CiAgICBpZihjMiA9PSAwICYmIHRyZW5Eb2FuKHUsIHYsIHQpKSByZXR1cm4gdHJ1ZTsKICAgIGlmKGMzID09IDAgJiYgdHJlbkRvYW4ocywgdCwgdSkpIHJldHVybiB0cnVlOwogICAgaWYoYzQgPT0gMCAmJiB0cmVuRG9hbihzLCB0LCB2KSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gKChjMSA+IDAgJiYgYzIgPCAwKSB8fCAoYzEgPCAwICYmIGMyID4gMCkpCiAgICAgICAgJiYgKChjMyA+IDAgJiYgYzQgPCAwKSB8fCAoYzMgPCAwICYmIGM0ID4gMCkpOwp9Cgpib29sIHRyb25nVGFtR2lhYyhQb2ludCBwKXsKICAgIGludCBzMSA9IGNyb3NzKGEsIGIsIHApOwogICAgaW50IHMyID0gY3Jvc3MoYiwgYywgcCk7CiAgICBpbnQgczMgPSBjcm9zcyhjLCBhLCBwKTsKCiAgICByZXR1cm4gKHMxID4gMCAmJiBzMiA+IDAgJiYgczMgPiAwKQogICAgICAgIHx8IChzMSA8IDAgJiYgczIgPCAwICYmIHMzIDwgMCk7Cn0KCmJvb2wgdHJ1bmdDYW5oKFBvaW50IHUsIFBvaW50IHYpewogICAgcmV0dXJuIHRyZW5Eb2FuKHUsIHYsIG0pICYmIHRyZW5Eb2FuKHUsIHYsIG4pCiAgICAgICAgJiYgY3Jvc3ModSwgdiwgbSkgPT0gMAogICAgICAgICYmIGNyb3NzKHUsIHYsIG4pID09IDA7Cn0KCnZvaWQgbmhhcCgpewogICAgY2luID4+IGEueCA+PiBhLnkgPj4gYi54ID4+IGIueSA+PiBjLnggPj4gYy55OwogICAgY2luID4+IG0ueCA+PiBtLnkgPj4gbi54ID4+IG4ueTsKfQoKdm9pZCBzb2x2ZSgpewogICAgaWYodHJ1bmdDYW5oKGEsIGIpIHx8IHRydW5nQ2FuaChiLCBjKSB8fCB0cnVuZ0NhbmgoYywgYSkpewogICAgICAgIGNvdXQgPDwgMyA8PCBubjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZih0cm9uZ1RhbUdpYWMobSkgJiYgdHJvbmdUYW1HaWFjKG4pKXsKICAgICAgICBjb3V0IDw8IDQgPDwgbm47CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdmVjdG9yPFBvaW50PiBjYW5oID0ge2EsIGIsIGN9OwogICAgdmVjdG9yPFBvaW50PiBkaWVtOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspewogICAgICAgIFBvaW50IHUgPSBjYW5oW2ldOwogICAgICAgIFBvaW50IHYgPSBjYW5oWyhpICsgMSkgJSAzXTsKCiAgICAgICAgaWYoIWdpYW9OaGF1KG0sIG4sIHUsIHYpKSBjb250aW51ZTsKICAgICAgICBpZihjcm9zcyhtLCBuLCB1KSA9PSAwICYmIGNyb3NzKG0sIG4sIHYpID09IDApewogICAgICAgICAgICBpZih0cmVuRG9hbihtLCBuLCB1KSkgZGllbS5wYih1KTsKICAgICAgICAgICAgaWYodHJlbkRvYW4obSwgbiwgdikpIGRpZW0ucGIodik7CiAgICAgICAgICAgIGlmKHRyZW5Eb2FuKHUsIHYsIG0pKSBkaWVtLnBiKG0pOwogICAgICAgICAgICBpZih0cmVuRG9hbih1LCB2LCBuKSkgZGllbS5wYihuKTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaWYoY3Jvc3MobSwgbiwgdSkgPT0gMCAmJiB0cmVuRG9hbihtLCBuLCB1KSkgZGllbS5wYih1KTsKICAgICAgICAgICAgZWxzZSBpZihjcm9zcyhtLCBuLCB2KSA9PSAwICYmIHRyZW5Eb2FuKG0sIG4sIHYpKSBkaWVtLnBiKHYpOwogICAgICAgICAgICBlbHNlIGlmKGNyb3NzKHUsIHYsIG0pID09IDAgJiYgdHJlbkRvYW4odSwgdiwgbSkpIGRpZW0ucGIobSk7CiAgICAgICAgICAgIGVsc2UgaWYoY3Jvc3ModSwgdiwgbikgPT0gMCAmJiB0cmVuRG9hbih1LCB2LCBuKSkgZGllbS5wYihuKTsKICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIGludCBjMSA9IGNyb3NzKG0sIG4sIHUpOwogICAgICAgICAgICAgICAgaW50IGMyID0gY3Jvc3MobSwgbiwgdik7CiAgICAgICAgICAgICAgICBpbnQgYzMgPSBjcm9zcyh1LCB2LCBtKTsKICAgICAgICAgICAgICAgIGludCBjNCA9IGNyb3NzKHUsIHYsIG4pOwogICAgICAgICAgICAgICAgaWYoKChjMSA+IDAgJiYgYzIgPCAwKSB8fCAoYzEgPCAwICYmIGMyID4gMCkpCiAgICAgICAgICAgICAgICAmJiAoKGMzID4gMCAmJiBjNCA8IDApIHx8IChjMyA8IDAgJiYgYzQgPiAwKSkpewogICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgMiA8PCBubjsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBzb3J0KGFsbChkaWVtKSwgW10oUG9pbnQgdSwgUG9pbnQgdil7CiAgICAgICAgaWYodS54ICE9IHYueCkgcmV0dXJuIHUueCA8IHYueDsKICAgICAgICByZXR1cm4gdS55IDwgdi55OwogICAgfSk7CiAgICBkaWVtLmVyYXNlKHVuaXF1ZShhbGwoZGllbSkpLCBkaWVtLmVuZCgpKTsKICAgIGlmKGRpZW0uc2l6ZSgpID49IDIpIGNvdXQgPDwgMiA8PCBubjsKICAgIGVsc2UgaWYoZGllbS5zaXplKCkgPT0gMSkgY291dCA8PCAxIDw8IG5uOwogICAgZWxzZSBjb3V0IDw8IDAgPDwgbm47Cn0KCnNpZ25lZCBtYWluKCl7CiAgICBpZihmb3BlbihUQVNLIi5JTlAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKFRBU0siLklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oVEFTSyIuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CiAgICBuaGFwKCk7CiAgICBzb2x2ZSgpOwogICAgcmV0dXJuICgwIF4gMCk7Cn0K