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;

public class Vector
{
    public double x { get; set; }
    public double y { get; set; }
}
public class hello
{
    public static void Main()
    {
        string line;
        for (; (line = Console.ReadLine()) != null;)
        {
            var s = Array.ConvertAll(line.Trim().Split(','), double.Parse);
            var a = new Vector { x = s[0], y = s[1] };
            var b = new Vector { x = s[2], y = s[3] };
            var c = new Vector { x = s[4], y = s[5] };
            var d = new Vector { x = s[6], y = s[7] };
            var j = judgeTri(a, b, c, d) * judgeTri(a, b, d, c) * judgeTri(a, c, d, b) * judgeTri(b, c, d, a);
            if (j == 0) Console.WriteLine("NO");
            else Console.WriteLine("YES");
        }
    }
    public static int judgeTri(Vector a, Vector b, Vector c, Vector p)
    {
        var ab = subVector(b, a);
        var bp = subVector(p, b);
        var bc = subVector(c, b);
        var cp = subVector(p, c);
        var ca = subVector(a, c);
        var ap = subVector(p, a);
        var c1 = ab.x * bp.y - ab.y * bp.x;
        var c2 = bc.x * cp.y - bc.y * cp.x;
        var c3 = ca.x * ap.y - ca.y * ap.x;
        if ((c1 > 0 && c2 > 0 && c3 > 0) || (c1 < 0 && c2 < 0 && c3 < 0)) return 0; // inside
        else return 1;  // outside
    }
    public static Vector subVector(Vector a, Vector b)
    {
        var c = new Vector();
        c.x = a.x - b.x;
        c.y = a.y - b.y;
        return c;
    }
}