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

import java.util.*

class Vector(p1: Pair<Double, Double>, p2: Pair<Double, Double>) {
    private val x = p2.first - p1.first
    private val y = p2.second - p1.second

    fun cross(other: Vector): Double = this.x * other.y - this.y * other.x
}

fun calc(p1: Pair<Double, Double>, p2: Pair<Double, Double>, p3: Pair<Double, Double>): Boolean {
    val v1 = Vector(p1, p2)
    val v2 = Vector(p2, p3)
    return v1.cross(v2) >= 0
}

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)
    while (sc.hasNext()) {
        val a = sc.nextLine().split(",").map { it.toDouble() }
        val p = Array(4) { i -> Pair(a[i*2], a[i*2+1]) }
        var flag = true
        for (i in 0..3) {
            for (j in 0..3) {
                for (k in 0..3) {
                    for (l in 0..3) {
                        if (hashSetOf<Int>(i, j, k, l).size != 4) continue
                        if (hashSetOf(calc(p[j], p[i], p[l]), calc(p[k], p[j], p[l]), calc(p[i], p[k], p[l])).size == 1) {
                            //println("$i, $j, $k, ${calc(p[j], p[i], p[l])}, ${calc(p[k], p[j], p[l])}, ${calc(p[i], p[k], p[l])}")
                            flag = false
                        }

                    }
                }
            }
        }
        if (flag) println("YES")
        else println("NO")
    }
}