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.Linq;
using System.Collections.Generic;

namespace Miscelleneous {
   class Program {
      public static int cin() { return int.Parse(Console.ReadLine()); }
      public static int[] cins() {
         string s = Console.ReadLine();
         if (string.IsNullOrEmpty(s)) return new int[]{ };
         string[] ss = s.Split(',');
         int[] Res = new int[ss.Length];
         for (int i = 0; i<ss.Length; i++) Res[i]=int.Parse(ss[i]);
         return Res;
      }
      public static double[] dins() {
         string s = Console.ReadLine();
         if (string.IsNullOrEmpty(s)) return new double[]{ };
         string[] ss = s.Split(',');
         double[] Res = new double[ss.Length];
         for (int i = 0; i<ss.Length; i++) Res[i]=double.Parse(ss[i]);
         return Res;
      }
      public static void print(object s) { Console.WriteLine(s.ToString()); }
      static void Main(string[] args) {
         double[] D;
         while (true) {
            D = dins();
            if (D.Length==0) break;
            //"Convex" is as same as "Exists vertex s.t. angle beyond pi"
            print(Prod(D) ? "YES" : "NO");
         }
      }

      static bool Prod(double[] JS) {
         double[] vs = new double[8];
         for (int i = 0; i<8; i++) 
            vs[i]=i<6?JS[i+2]-JS[i]:JS[i-6]-JS[i];
         double gaiz;
         int sym=0;
         bool Res = true;
         for (int i = 0; i<3; i++) {
            gaiz=vs[0+2*i]*vs[3+2*i]-vs[1+2*i]*vs[2+2*i];
            if (i==0) sym=Math.Sign(gaiz);
            else if (Math.Sign(gaiz)!=sym) { Res=false; break; }
         }
         gaiz=vs[6]*vs[1]-vs[7]*vs[0];
         Res&=Math.Sign(gaiz)==sym;
         return Res;
      }
   }
}