#include<iostream>

using namespace std;

struct point{
	double x;
	double y;

	bool operator != ( point& p )
	{
		return ( x != p.x || y != p.y );
	}
	bool operator == ( point& p )
	{
		return ( x == p.x && y == p.y );
	}
};

point getLeftPoint( int n , point *points );
double getCrossProduct( const point& a , const point& b , const point& o );
point operator - ( const point& a , const point& b );
istream& operator >> ( istream& s , point& p );

int main(void)
{
	point points[100];
	int n;
	int ans;

	while(1)
	{
		cin >> n;
		if( cin.eof() )
		{
			break;
		}
		for( int i = 0 ; i < n ; i++ )
		{
			cin >> points[i];
		}

		point leftPoint = getLeftPoint( n , points );
		point stdPoint = leftPoint;
		point outsideLeftPoint;
		int vertexCounter = 0;

		while(1)
		{
			for( int i = 0 ; i < n ; i++ )
			{
				int flag = 0;
				if( points[i] != stdPoint )
				{
					for( int j = 0 ; j < n ; j++ )
					{
						if( points[j] != stdPoint )
						{
							if( getCrossProduct( points[i] , points[j] , stdPoint ) > 0 )
							{
								flag = 1;
								break;
							}
						}
					}
					if( flag == 0 )
					{
						outsideLeftPoint = points[i];
						break;
					}
				}
			}
			stdPoint = outsideLeftPoint;
			vertexCounter++;
			if( outsideLeftPoint == leftPoint )
			{
				break;
			}
		}
		ans = n - vertexCounter;
		std::cout << ans << endl;
	}

	return 0;
}

point getLeftPoint( int n , point *points )
{
	point leftPoint = points[0];
	for( int i = 1 ; i < n ; i++ )
	{
		if( points[i].x < leftPoint.x )
		{
			leftPoint = points[i];
		}
	}
	return leftPoint;
}

double getCrossProduct( const point& a , const point& b , const point& o )
{
	point ao = a - o;
	point bo = b - o;
	return (ao.x * bo.y) - (ao.y * bo.x);
}

point operator - ( const point& a , const point& b )
{
	point p;
	p.x = a.x - b.x;
	p.y = a.y - b.y;
	return p;
}

istream& operator >> ( istream& s , point& p )
{
	char c;
	return s >> p.x >> c >> p.y;
}