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

import scala.io.Source.stdin

object Main {
  type Vector = (Double,Double)
  def v(x:Vector,y:Vector):Vector = (x,y) match { case ((x0,y0),(x1,y1)) => (x1-x0,y1-y0) }
  def cross(x:Vector,y:Vector) = (x,y) match { case ((x0,y0),(x1,y1)) => x0*y1-x1*y0 }

  def main(args:Array[String]) = {
    val b = new StringBuilder

    for(l<-stdin.getLines.map(s=>s.split(",").map(_.toDouble))) {
      val v01 = v((l(0),l(1)), (l(2),l(3)))
      val v02 = v((l(0),l(1)), (l(4),l(5)))
      val v03 = v((l(0),l(1)), (l(6),l(7)))
      val v10 = v((l(2),l(3)), (l(0),l(1)))
      val v12 = v((l(2),l(3)), (l(4),l(5)))
      val v13 = v((l(2),l(3)), (l(6),l(7)))
      if(cross(v02, v01)*cross(v02,v03) < 0
          && cross(v13,v12)*cross(v13,v10) < 0)
        b.append("YES\n")
      else
        b.append("NO\n")
    }
    print(b.result)
  }
}