#include<iostream>
#include<complex>
#include<algorithm>
#include<vector>
using namespace std;
typedef complex < double > P;
typedef vector< P > G;
struct L:public vector< P >{ // L:線分
  L(const P& a,const P& b){push_back(a);push_back(b);}
};
const double EPS = 1e-8;
const double INF = 1e12;
namespace std{
  bool operator <(const P& a,const P& b){
    return  real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
  }
}
double cross(const P& a,const P& b){
  return imag(conj(a) * b);
}
double dot(const P& a,const P& b){
  return real(conj(a) * b);
}
int ccw(P a,P b,P c){
  b -= a; c -= a;
  if(cross(b,c) > 0) return 1;
  if(cross(b,c) < 0) return -1;
  if(dot(b,c) < 0) return 2; // c--a--b
  if(norm(b) < norm(c)) return -2; // a--b--c
  return 0; // a--c--b
}
int n_covex_hull(vector<P> ps){
  int n = ps.size(), k = 0;
  sort(ps.begin(), ps.end());
  vector<P> ch(2*n);
  for(int i = 0 ; i < n ; ch[k++] = ps[i++] ){
    while(k >= 2 && ccw(ch[k-2], ch[k-1], ps[i]) <= 0) --k;
  }
  for(int i = n-2, t = k+1 ; i >= 0 ; ch[k++] = ps[i--] ){
    while(k >= t && ccw(ch[k-2], ch[k-1], ps[i]) <= 0) --k;
  }
  return k - 1;
}

int main(){
  int n;
  char o;
  while(cin >> n, n){
    vector< P > pts(n);
    for(int i = 0 ; i < n ; i++ ){
      cin >> pts[i].real() >> o >>pts[i].imag();
    }
    cout << n - n_covex_hull(pts) << endl;
  }
}