#include<bits/stdc++.h>
#define N_MAX 100
#define sz stack.size()
using namespace std;
typedef complex<double> P; //Point
typedef pair<P,P> L; //Line, Segment
const double EPS = 1e-8;
vector<P> v;
double x,y;
int n,ans;
P a;

namespace std {
  bool operator < (const P& a, const P& b){
    return fabs(real(a)-real(b)) < EPS ? imag(a) < imag(b) : real(a) < real(b);
  }
}
 
double cross(P a, P b){ return imag(conj(a)*b); }

double dot(P a, P b){ return real(conj(a)*b); }

int ccw(P a, P b, P c){
  b -= a;
  c -= a;
  if(cross(b,c) > EPS) return 1;   // テ」ツδ凖」ツつッテ」ツδ暗」ツδォ(b-a)テ」ツ?ョテ・ツキツヲテ・ツ?エテ」ツ?ォテ」ツδ凖」ツつッテ」ツδ暗」ツδォ(c-a)テ」ツ?古・ツュツ佚・ツ慊ィテ」ツ?凖」ツつ凝」ツ??
  if(cross(b,c) < -EPS) return -1; // テ」ツδ凖」ツつッテ」ツδ暗」ツδォ(b-a)テ」ツ?ョテ・ツ渉ウテ・ツ?エテ」ツ?ォテ」ツδ凖」ツつッテ」ツδ暗」ツδォ(c-a)テ」ツ?古・ツュツ佚・ツ慊ィテ」ツ?凖」ツつ凝」ツ??
  if(dot(b,c) < -EPS) return 2;
  if(norm(b) < norm(c)) return -2;
  return 0;
}

vector<P> convex_hull2(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++]) // lower-hull
    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--]) // upper-hull
    while (k >= t && ccw(ch[k-2], ch[k-1], ps[i]) <= 0) --k;
  ch.resize(k-1);
  return ch;
}

bool isIntersectSP(L s, P p){ 
  return abs(s.first-p) + abs(s.second-p) - abs(s.second-s.first) < EPS; 
}

int main(){
  while(1){
    cin>>n;
    if(!n)break;
    for(int i=0;i<n;i++){
      scanf("%lf,%lf",&x,&y);
      a.real()=x;
      a.imag()=y;
      v.push_back(a);
    }
    ans=0;
    vector<P> r=convex_hull2(v);
    for(int i=0;i<n;i++){
      int f=0;
      for(int j=0;j<r.size();j++)
	if(isIntersectSP(L(r[j],r[(j+1)%r.size()]),v[i]))f=1;
      if(!f)ans++;
    }
    cout<<ans<<endl;
    v.clear();
  }
  return 0;
}