#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstring>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>

#define mp       make_pair
#define pb       push_back
#define all(x)   (x).begin(),(x).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define repi(i,a,b) for(int i = (a); i < (b); i++)

using namespace std;

typedef    long long          ll;
typedef    unsigned long long ull;
typedef    vector<bool>       vb;
typedef    vector<int>        vi;
typedef    vector<vb>         vvb;
typedef    vector<vi>         vvi;
typedef    pair<int,int>      pii;

const int INF=1<<29;
const double EPS=1e-9;

const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

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

// 内積 (dot product) : a・b = |a||b|cosΘ
double dot(P a, P b) {
	return (a.real() * b.real() + a.imag() * b.imag());
}

// 外積 (cross product) : a×b = |a||b|sinΘ
double cross(P a, P b) {
	return (a.real() * b.imag() - a.imag() * b.real());
}
//(x,y)をx昇順にソート
bool cmp(P a,P b){
	if(a.real()!=b.real()){
		return a.real()<b.real();
	}else{
		return a.imag()<b.imag();
	}
}

/*Graham Scan*/
//凸多角形を求める
int n;
vector<P> getConvex(P *ps){
	sort(ps,ps+n,cmp);
	int k = 0;
	vector<P> convex(n*2);
	for(int i =0;i < n;i++){
		while(2 <=k&&cross(convex[k-1]-convex[k-2],ps[i]-convex[k-1])<=0){
			k--;
		}
		convex[k++]=ps[i];
	}
	for(int i =n-2,t = k;i >=0;i--){
		while(t <k&& cross(convex[k-1]-convex[k-2],ps[i]-convex[k-1])<=0){
			k--;
		}
		convex[k++]=ps[i];
	}
	convex.resize(k-1);
	return convex;
}
int main(){
	while(cin>>n,n){
		P g[120];
		for(int i =0; i<n;i++){
			double x,y;
			char c;
			cin>>x>>c>>y;
			g[i]=P(x,y);
		}
		vector<P> convex =getConvex(g);
		cout <<n-convex.size()<<endl;
	}
	return 0;
}