#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <fstream>
#include <complex>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL;
typedef pair<double, double> P;
static const double EPS = 1e-5;

#define FOR(i,k,n) for (int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)

int main(void){
  int n;
  while(cin>>n){
    if(n==0) break;
    double x,y;
    vector<P> point;
    REP(i,n){
      scanf("%lf,%lf",&x,&y);
      point.push_back(P(y,x));
    }
    sort(point.begin(),point.end());
    reverse(point.begin(),point.end());
    REP(i,point.size()){
      swap(point[i].first,point[i].second);
    }
    P f,n;
    double arg;
    f = point[0];
    REP(i,point.size()){
      if(point[i].first<f.first) f = point[i];
    }
    vector<pair<double,P> > tmp;
    REP(i,point.size())if(point[i]!=f){
      arg = atan2(point[i].second-f.second,point[i].first-f.first);
      tmp.push_back(pair<double,P>(arg,point[i]));
    }
    sort(tmp.begin(),tmp.end());
    n = tmp[0].second;
    int ans = 2;
    arg = tmp[0].first;
    while(n!=f){
      double arg2;
      vector<pair<double,P> > argvec;
      REP(i,point.size()){
        if(n==point[i]) continue;
        int nx = point[i].first; int ny = point[i].second;
        arg2 = atan2(ny-n.second, nx-n.first);
        argvec.push_back(pair<double,P>(arg2,point[i]));
      }
      vector<pair<double,P> >::iterator it;
      sort(argvec.begin(),argvec.end());
      it = upper_bound(argvec.begin(),argvec.end(),pair<double,P>(arg,n));
      if(it==argvec.end()) it = argvec.begin();
      if(f==(*it).second){
        cout<<point.size()-ans<<endl;
        break;
      }else{
        arg = (*it).first;
        n = (*it).second;
        ans++;
      }
    }
  }
  return 0;
}