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 JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br =
				new BufferedReader(new InputStreamReader(System.in));
		for (String str; (str=br.readLine()) != null; ) {
			String[] data = str.split(",");

			double xa = Double.parseDouble(data[0]);
			double ya = Double.parseDouble(data[1]);

			double xb = Double.parseDouble(data[2]);
			double yb = Double.parseDouble(data[3]);

			double xc = Double.parseDouble(data[4]);
			double yc = Double.parseDouble(data[5]);

			double xd = Double.parseDouble(data[6]);
			double yd = Double.parseDouble(data[7]);
			/*
			 * vector ab : (xb-xa, yb-ya)
			 * vector ac
			 * vector ad
			 * vector bc : (xc-xb, yc-yb)
			 * vector ba
			 * vector bd
			 * vector cd : (xd-xc, yd-yc)
			 * vector ca
			 * vector cb
			 */
			Vector2d a = new Vector2d(xa, ya);
			Vector2d b = new Vector2d(xb, yb);
			Vector2d c = new Vector2d(xc, yc);
			Vector2d d = new Vector2d(xd, yd);
			if ( isSameSide(a, b, c, d)
					&& isSameSide(b, c, d, a)
					&& isSameSide(c, d, a, b) ) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		}
	}

	public static class Vector2d {
		private double x;
		private double y;

		public Vector2d(double x, double y) {
			this.x = x;
			this.y = y;
		}
		// vecotr this - v
		public Vector2d minus(Vector2d v) {
			return new Vector2d(this.x - v.x, this.y - v.y);
		}
		// outerProduct this x b
		public double op(Vector2d b) {
			return this.x * b.y  -  this.y * b.x;
		}
	}
	/*
	 * outerProduct
	 * a = (a.x, a.y)
	 * b = (b.x, b.y)
	 */
//	public static double op(Vector2d a, Vector2d b) {
//		return a.x * b.y  -  a.y * b.x;
//	}

	// line ab, point c, point d
	public static boolean isSameSide(
			Vector2d a, Vector2d b, Vector2d c, Vector2d d) {
		Vector2d ab = b.minus(a);
		Vector2d ac = c.minus(a);
		Vector2d ad = d.minus(a);
//		if ( op(ab, ac) > 0 && op(ab, ad) > 0 ) {
		if ( ab.op(ac) > 0 && ab.op(ad) > 0 ) {
			return true;
//		} else if ( op(ab, ac) < 0 && op(ab, ad) < 0 ) {
		} else if ( ab.op(ac) < 0 && ab.op(ad) < 0 ) {
			return true;
		} else {
			return false;
		}
	}

}