#include <iostream>
#include <vector>
#include <algorithm>
#include <complex>
#include <climits>
#include <cmath>
 
// 許容する誤差ε
#define EPS (1e-10)

//浮動小数点演算の誤差を考慮した比較を行うマクロ
//等しい(=)　!=を使いたい場合は、!EQとすればよい
#define EQ(x,y) (fabs((x) - (y)) < EPS)
//小なり(<)
#define LT(x,y) ((x) - (y) <= -EPS)
//小なりイコール(<=)
#define LE(x,y) ((x) - (y) < EPS)
//大なり(>)
#define GT(x,y) ((x) - (y) >= EPS)
//大なりイコール(<)
#define GE(x,y) ((x) - (y) > -EPS)

// 2つのベクトルが等しいかどうか
#define EQV(a,b) ( EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()) )
// 円周率
#define PI (acos(-1.0))
//　0≦t＜PIの範囲で偏角を求める（通常のarg()は -PI≦t≦PI)
#define POSARG(a) (arg((a)) > 0.0? arg((a)) : 2.0*PI + arg((a)))

using namespace std;
typedef complex<double> P;
 
double ccw(P& p1, P& p2, P& p3)
{
    return ((p2.real() - p1.real())*(p3.imag() - p1.imag()) 
                - (p2.imag() - p1.imag())*(p3.real() - p1.real())) > 0;
}// ccw>0 => ccw, ccw=0 => colinear, ccw<0, cw
 
bool complex_pred(const P& a, const P& b)
{
    if (a.real() != b.real())
        return a.real() < b.real();
    else
        return a.imag() < b.imag();
}
 
vector<P> solve(vector<P> vc)
{
	sort(vc.begin(), vc.end(), complex_pred);

	int k = 0;
	vector<P> vc2(vc.size()*2);
	
	for (int i = 0; i < (int)vc.size(); i++)
	{
		while( k >= 2 && !ccw(vc2[k-1], vc2[k-2], vc[i]))
		{
			k--;
		}
		
		vc2[k]=vc[i];
		k++;
	}

	int t = k;
	
	for (int i = vc.size()-1; i >= 0; i--)
	{
		while ( k > t && !ccw(vc2[k-1], vc2[k-2], vc[i]))
		{
			k--;
		}
		
		vc2[k]=vc[i];
		k++;
	}
	
	vc2.resize(k-1);
	return vc2;
}

 
int main()
{
    int n;
     
    while(cin >> n, n)
    {
        vector<P> vc;
        vc.clear();
         
        for(int i = 0; i < n; i++)
        {
            char c;
            double a, b;
            cin >> a;
            cin >> c;
            cin >> b;
            vc.push_back(P(a, b));
        }
         
        vector<P> vc2 = solve(vc);
        cout << int(n - vc2.size()) << endl;
    }
     
    return 0;
}