#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>

using namespace std;

const double EPS = 1e-9;
static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;

struct Point{
  double x,y;
  Point(double x = 0, double y = 0): x(x),y(y){};
  bool operator < (const Point& p) const{
    if(x != p.x) return x < p.x;
    return y < p.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);}
  double own_dot(){return x*x+y*y;};
};

double dot(Point a, Point b){
  return a.x*b.x+a.y*b.y;
}

double cross(Point a, Point b){
  return a.x*b.y-a.y*b.x; 
}

int ccw(Point p0, Point p1, Point p2){
  Point a = p1-p0;
  Point 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.own_dot() < b.own_dot()) return ONLINE_FRONT;
  return ON_SEGMENT;
}

vector<Point> andrewScan(vector<Point> s){
  vector<Point> u,l;
  
  if(s.size() < 3) return s;

  sort(s.begin(),s.end());
  
  u.push_back(s[0]);
  u.push_back(s[1]);
  l.push_back(s[s.size()-1]);
  l.push_back(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.push_back(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.push_back(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){
    vector<Point> V(n);
    for(int i = 0; i < n; i++) scanf("%lf,%lf",&V[i].x,&V[i].y);
    cout << n-andrewScan(V).size() << endl;
  }
  return 0;
}