#include<bits/stdc++.h>
#define range(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,b) range(i,0,b)
#define pb(a) push_back(a)
#define all(a) (a).begin(), (a).end()
#define debug(x) cout << "debug " << x << endl;
using namespace std;

#define EPS (1e-10)
#define equals(a, b) ( fabs((a) - (b)) < EPS )

/*struct Point{ double x, y; }; //????????¨????§???????
typedef Point Vector; //?????????????????¨????§???????
struct Segment{ //???????????¨????§???????
    Point p1, p2;
};
typedef Segment Line; //???????????¨????§???????
*/
class Point{
    public:
        double x, y;

        Point(double x = 0, double y = 0): x(x), y(y) {}

        Point operator + (Point p) { return Point(x + p.x, y + p.y); }
        Point operator - (Point p) { return Point(x - p.x, y - p.y); }
        Point operator * (double a) { return Point(a * x, a * y); }
        Point operator / (double a) { return Point(x / a, y / a); }

        double abs() { return sqrt(norm());}
        double norm() { return x * x + y * y; }

        bool operator < (const Point &p) const {
            return x != p.x ? x < p.x : y < p.y;
        }

        bool operator == (const Point &p) const {
            return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
        }
};

typedef Point Vector;
typedef vector<Point> Polygon; //????§???¢

double dot(Vector a, Vector b){ //????????????a??¨b?????????
    return a.x * b.x + a.y * b.y;
}

double cross(Vector a, Vector b){ //????????????a??¨b?????????
    return a.x*b.y - a.y*b.x;
}

static const int COUNTER_CLOCKWISE = 1; //???????¨???????
static const int CLOCKWISE = -1; //????¨???????
static const int ONLINE_BACK = 2; //2,0,1?????????????????????
static const int ONLINE_FRONT = -2; //0,1,2?????????????????????
static const int ON_SEGMENT = 0; //??????0,1????????????

int ccw(Point p0, Point p1, Point p2){
    Vector a = p1 - p0;
    Vector b = p2 - p0;
    if( cross(a, b) > EPS ) return COUNTER_CLOCKWISE;
    if( cross(a, b) < -EPS ) return CLOCKWISE;
    if( dot(a, b) < -EPS ) return ONLINE_BACK;
    if( a.norm() < b.norm() ) return ONLINE_FRONT;

    return ON_SEGMENT;
}

Polygon andrewScan( Polygon s ){
    Polygon u, l;
    if( s.size() < 3) return s;
    sort(s.begin(), s.end()); //x,y??????????????????????????????
    //x????°?????????????????????????u?????????
    u.pb(s[0]);
    u.pb(s[1]);
    //x?????§????????????????????????l?????????
    l.pb(s[s.size() - 1]);
    l.pb(s[s.size() - 2]);

    for(int i = 2; i < s.size(); i++){
        for(int n = u.size(); n >= 2 && ccw(u[n - 2], u[n - 1], s[i]) != CLOCKWISE; n--){
            u.pop_back();
        }
        u.pb(s[i]);
    }

    for(int i = s.size() - 3; i >= 0; i--){
        for(int n = l.size(); n >= 2 && ccw(l[n - 2], l[n - 1], s[i]) != CLOCKWISE; n--){
            l.pop_back();
        }
        l.pb(s[i]);
    }

    reverse(l.begin(), l.end());
    for(int i = u.size() - 2; i >= 1; i--) l.push_back(u[i]);

    return l;
}


int main(){
    int n;
    while(cin >> n,n){
        Point p;
        Polygon s;
        char g;
        rep(i,n){
            cin >> p.x >> g >> p.y;
            s.pb(p);
        }
        //debug(andrewScan(s).size());
        cout << n - andrewScan(s).size() << endl;
        s.clear();
    }
}

Measured memory_bytes: 1244