Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

凸？

平面上の異なる 4 点　$A (x_a, y_a)$, $B (x_b, y_b)$, $C (x_c, y_c)$, $D(x_d, y_d)$ の座標を読み込んで、それら 4 点を頂点とした四角形 $ABCD$ に凹みがなければ YES、凹みがあれば NO と出力するプログラムを作成してください。

凹みのある四角形とは図 1 のような四角形です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

$x_a$,$y_a$,$x_b$,$y_b$,$x_c$,$y_c$,$x_d$,$y_d$

$x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$, $x_d$, $y_d$ はそれぞれ -100 以上 100 以下であり、実数で与えられます。

1 直線上に 3 つ以上点が並ぶことはないものとします。また、入力順に点を結んでいけば、四角形になる順番に点の座標が入力されるものとします。（つまり、図 2 のような形になる順番で点が与えられることはありません。)

データセットの数は 100 を超えません。

Output

各データセットごとに、YES または NO を１行に出力します。

Sample Input

0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0
0.0,0.0,3.0,0.0,1.0,1.0,1.0,3.0

Output for the Sample Input

YES
NO

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mondai0035
{
	class Program
	{
		static void Main(string[] args)
		{
			/*for( int i = 0; i <= 360; i += 10 ) {
				Console.WriteLine( "{0}={1:f5}", i, i / 180.0 * Math.PI );
			}
			return;*/
			
			while( true ) {
				var	str	= Console.ReadLine();
				if( str == null ) {
					break;
				}
				var	p	= Array.ConvertAll( str.Split( ',' ), s => double.Parse( s ) );
				
				var	angle	= new double[ 4 ];
				for( int i = 0; i < 4; i++ ) {
					var	x	= p[ ((i + 1) % 4) * 2 ] - p[ i * 2 ];
					var	y	= p[ ((i + 1) % 4) * 2 + 1 ] - p[ i * 2 + 1 ];
					angle[ i ]	= Math.Atan2( y, x );
					//Console.WriteLine( "{0}:{1:f5}", i, angle[ i ] );
				}
				
				int	cnt	=0;
				for( int i = 0; i < 4; i++ ) {
					var	d	= angle[ (i + 1) % 4 ] - angle[ i ];
					if( Math.Abs( d ) > Math.PI ) {
						if( d < 0.0f ) { d	+= Math.PI * 2.0; }
						else           { d	-= Math.PI * 2.0; }
					}
					if( Math.Sign( d ) > 0.0 ) {
						cnt++;
					} else {
						cnt--;
					}
				}

				if( (cnt == 4) || (cnt == -4)) {
					Console.WriteLine( "YES" );
				} else {
					Console.WriteLine( "NO" );
				}
			}
		}
	}
}