#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>

typedef long long ll;
using namespace std;

#define mod 1000000007
#define INF 1000000000
#define LLINF 2000000000000000000LL

#define SIZE 100000

struct Point{
    typedef double Type;
    
    Type x,y;
    
    Point(Type X,Type Y){
        x = X;
        y = Y;
    }
    
    bool operator< (const Point &B) const{
        return x==B.x ? y < B.y : x < B.x;
    }
};

/* ConvexHull(??????) */

bool ccw(Point &base,Point &A,Point &B){
    return (A.x-base.x)*(B.y-base.y) - (A.y-base.y)*(B.x-base.x) >= 0; //double?????? -EPS
}

vector<Point> ConvexHull(vector<Point> s){
    vector<Point> upper,lower;
    int n = (int)s.size();
    
    if(n<3) return s;
    
    sort(s.begin(),s.end());
    
    upper.push_back(s[0]);
    upper.push_back(s[1]);
    lower.push_back(s[n-1]);
    lower.push_back(s[n-2]);
    
    for(int i=2;i<n;i++){
        for(int m = (int)upper.size();m>=2 && ccw(upper[m-2],upper[m-1],s[i]); m--){
            upper.pop_back();
        }
        upper.push_back(s[i]);
    }
    
    for(int i=n-3;i>=0;i--){
        for(int m = (int)lower.size();m>=2 && ccw(lower[m-2],lower[m-1],s[i]); m--){
            lower.pop_back();
        }
        lower.push_back(s[i]);
    }
    
    reverse(lower.begin(),lower.end());
    for(int i=(int)upper.size()-2;i>=1;i--) lower.push_back(upper[i]);
    
    return lower;
}

int calc(int n){
    double x,y;
    
    //scanf("%d",&n);
    
    vector<Point> vec,ans;
    
    for(int i=0;i<n;i++){
        scanf("%lf,%lf",&x,&y);
        vec.push_back(Point(x,y));
    }
    
    ans = ConvexHull(vec);
    
    printf("%d\n",n-(int)ans.size());
    
    return 0;
}

int main(){
    int n;
    while(1){
        scanf("%d",&n);
        if(n==0) break;
        calc(n);
    }
    return 0;
}