#include <iostream>
#include <complex>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

typedef complex<double> P;
typedef vector<P> G;


#define X(a)		( (a).real() )
#define Y(a)		( (a).imag() )
#define EQ(a,b)		( -EPS<(a)-(b) && (a)-(b)<EPS )
#define EQV(a,b)	( EQ(X(a),X(b)) && EQ(Y(a),Y(b)) )

#define unit(a)		( (a)/abs(a) )
#define normal(a)	( (a)*P(0,1) )
#define dot(a,b)	( X((a)*conj(b)) )
#define cross(a,b)	( Y(conj(a)*(b)) )

namespace std
{
	bool operator < (const P& a, const P& b)
	{
		return X(a)!=X(b) ? X(a)<X(b) : Y(a)<Y(b);
	}
}

// 3ツ点ツづ個暗環置ツ甘鳴係
int ccw(P a, P b, P c)
{
	b -= a; c -= a;
	if(cross(b, c) > 0)   return +1;	// counter clockwise
	if(cross(b, c) < 0)   return -1;	// clockwise
	if(dot(b, c) < 0)     return +2;	// c--a--b on line
	if(norm(b) < norm(c)) return -2;	// a--b--c on line
	return 0;
}


G convexhull(G g)
{
	G h(2*g.size());
	sort(g.begin(), g.end());

	int i,k,t,sz=g.size();
	for(i=0,k=0; i<sz; h[k++]=g[i++])
	{
		while( k>=2 && ccw(h[k-2],h[k-1],g[i])<=0 ) k--;
	}
	for(i=sz-2,t=k+1; i>=0; h[k++]=g[i--])
	{
		while( k>=t && ccw(h[k-2],h[k-1],g[i])<=0 ) k--;
	}

	h.resize(k-1);
	return h;
}


int main()
{
	int n; double x,y; char c;
	while(cin >> n, n)
	{
		G g,h;
		while(n--)
		{
			cin >> x >> c >> y;
			g.push_back(P(x,y));
		}
		h=convexhull(g);
		cout << g.size()-h.size() << endl;
	}
}