#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <sstream>
#include <climits>
#include <cmath>
#include <map>
#include <stack>
using namespace std;
#define M_PI 3.141592
#define toRad 2.0*M_PI/360.0
#define inin(x) int x;cin>>x;
#define all(x) x.begin(),x.end()
#define debug(x) cout<<#x<<" "<<x<<endl;
#define rep(i,n) for(int i=0;i<(int)n;i++)
#define EPS 1e-12
#define pri_max 60000
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };

/*
bool memo[pri_max] = {};
vector<int> pri;
void calc()
{
	for (int i = 2; i < pri_max; i++)
	{
		if (memo[i] == false)
		{
			pri.push_back(i);
			for (int l = i; l < pri_max; l += i)
			{
				memo[l] = true;
			}
		}
	}
}*/

int convex_hull(vector<pdd> a)
{
	vector<pdd> u, d;
	sort(all(a));
	for (int i = 0; i < a.size(); i++)
	{
		for (int l = u.size() - 1; l >= 1; l--)
		{
			double v1, v2;
			v1 = atan2(u[l].first - u[l - 1].first, u[l].second - u[l - 1].second);
			v2 = atan2(a[i].first - u[l - 1].first, a[i].second - u[l - 1].second);
			if (v2 < v1)u.pop_back();
		}
		u.push_back(a[i]);
	}

	for (int i = 0; i < a.size(); i++)
	{
		for (int l = d.size() - 1; l >= 1; l--)
		{
			double v1, v2;
			v1 = atan2(d[l].first - d[l - 1].first, d[l].second - d[l - 1].second);
			v2 = atan2(a[i].first - d[l - 1].first, a[i].second - d[l - 1].second);
			if (v2 > v1)d.pop_back();
		}
		d.push_back(a[i]);
	}

	for (int i = 0; i < u.size(); i++)
	{
		//cout << u[i].first << " " << u[i].second << endl;
	}
	return u.size()+d.size()-2;
}


int main()
{
	int n;
	while (cin >> n&&n)
	{
		vector<pdd> v;
		for (int i = 0; i < n; i++)
		{
			double x, y;
			scanf("%lf,%lf", &x, &y);
			v.push_back(pdd(x, y));
		}
		cout << n - convex_hull(v) << endl;
	}
}