#include <iostream>
using namespace std;

#define SAFE_DELETE( x ) { if ( x ){ delete x; x = NULL; } }

class Vector2{
public:
	Vector2() : x( 0 ), y( 0 ), round( false ), check( false ), prev( NULL ), next( NULL ){}
	Vector2( double aX, double aY ) : round( false ), check( false ), prev( NULL ), next( NULL ){
		x = aX;
		y = aY;
	}

	void operator=( Vector2& a ){
		x = a.x;
		y = a.y;
	}

	bool round, check;
	double x, y;
	Vector2 *prev, *next;
};

class VecList{
public:
	VecList() : mSize( 0 ), head( NULL ), tail( NULL ){
		head = new Vector2;
		tail = new Vector2;
		head->next = tail;
		tail->prev = head;
	}
	~VecList(){
		init();
		SAFE_DELETE( tail );
		SAFE_DELETE( head );
	}

	void init(){
		for ( int i = mSize; i > 0; --i ){
			Vector2* a = tail->prev;
			a->prev->next = a->next;
			a->next->prev = a->prev;
			SAFE_DELETE( a );
		}
		mSize = 0;
	}
	void pushBack( Vector2 v ){
		Vector2* a = new Vector2( v.x, v.y );
		a->prev = tail->prev;
		a->next = tail;
		a->prev->next = a;
		a->next->prev = a;
		++mSize;
	}
	int cntInner(){
		int cnt = 0;
		Vector2 *it = head, *a = head->next, *start;
		for ( int i = 0; i < mSize; ++i ){
			it = it->next;
			if ( a->x > it->x ) a = it;
		}
		start = a;

		Vector2* b = head->next;
		if ( b == a ) b = b->next;
		do {
			it = head;
			for ( int i = 0; i < mSize; ++i ){
				it = it->next;
				if ( it == a || it == b ) continue;
				if ( cross( a, b, it ) < 0 ){
					b = it;
				}
			}
			Vector2* t = a;
			a = b;
			b = t;
			++cnt;
		}while ( !( a == start ) );

		return mSize - cnt;
	}

private:
	double cross( Vector2* a, Vector2* b, Vector2* c ){
		return ( b->x - a->x ) * ( c->y - a->y ) - ( b->y - a->y ) * ( c->x - a->x );
	}
	int mSize;
	Vector2 *head, *tail;
};

int main(){
	int n;
	char c;
	VecList list;

	while ( cin >> n && n ){
		list.init();
		Vector2 a;
		for ( int i = 0; i < n; ++i ){
			cin >> a.x >> c >>a.y;
			list.pushBack( a );
		}

		cout << list.cntInner() << endl;
	}

	return 0;
}