#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<list>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
#define LATTE 100000

struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x; y=_y;
    }
};
 
struct Line{
    double x[2],y[2];
    Line(){}
    Line(Point p,Point q){
        x[0]=p.x; x[1]=q.x;
        y[0]=p.y; y[1]=q.y;
    }
};
 
void RevXY(Point &p){
    swap(p.x,p.y);
}
 
void RevXY(Line &l){
    for(int i=0;i<2;i++) swap(l.x[i],l.y[i]);
}
 
bool Is_SameSide(Line l,Point p,Point q){
    if(l.x[1]==l.x[0]){
        RevXY(l); RevXY(p); RevXY(q);
    }
    double a,b;
    a = (l.y[1]-l.y[0])/(l.x[1]-l.x[0]);
    b = l.y[0]-a*l.x[0];
    if((p.y-(a*p.x+b))*(q.y-(a*q.x+b))>0) return true;
    else return false;
}

int main(){
	Point P[100];
	int N,ans;
	while(cin>>N,N){
		bool used[100]={};
		ans = N;
		for(int i=0;i<N;i++){
			scanf("%lf,%lf",&P[i].x,&P[i].y);
		}
		for(int i=0;i<N-1;i++){
			for(int j=i+1;j<N;j++){
				Point p(LATTE,LATTE);
				Line l(P[i],P[j]);
				bool flag=true;
				for(int k=0;k<N;k++){
					if(i==k || j==k) continue;
					if(p.x==LATTE){
						p = P[k];
						continue;
					}
					if(Is_SameSide(l,p,P[k])==false){
						flag = false;
						break;
					}
				}
				if(flag==true){
					if(used[i]==false) ans--;
					used[i] = true;
					if(used[j]==false) ans--;
					used[j] = true;
				}
			}
		}
		printf("%d\n",ans);
	}
}