property validating

🧩 Syntax:
class Solution {
    fun movesToChessboard(board: Array<IntArray>): Int {
        val n = board.size

        fun row(r: Int): List<Int> = board[r].asList()
        fun col(c: Int): List<Int> = (0 until n).map { r -> board[r][c] }.toList()

        run {
            // validate rows
            val rToCnt = (0 until n).map { r -> row(r) }.groupingBy { it }.eachCount()
            if (rToCnt.size != 2) return -1
            if (rToCnt.keys.none { it.first() == 0 }) return -1
            if (rToCnt.keys.none { it.first() == 1 }) return -1
            val r0 = rToCnt.keys.first { it.first() == 0 }
            val r1 = rToCnt.keys.first { it.first() == 1 }
            val deltaR = rToCnt.getValue(r0) - rToCnt.getValue(r1)
            if (deltaR !in -1..1) return -1

            // validate cols
            val cToCnt = (0 until n).map { c -> col(c) }.groupingBy { it }.eachCount()
            if (cToCnt.size != 2) return -1
            if (cToCnt.keys.none { it.first() == 0 }) return -1
            if (cToCnt.keys.none { it.first() == 1 }) return -1
            val c0 = cToCnt.keys.first { it.first() == 0 }
            val c1 = cToCnt.keys.first { it.first() == 1 }
            val deltaC = cToCnt.getValue(c0) - cToCnt.getValue(c1)
            if (deltaC !in -1..1) return -1

            // validate row/col sums
            val rSumToCnt = rToCnt.map { (r, cnt) -> r.sum() to cnt }.toMap()
            val cSumToCnt = cToCnt.map { (c, cnt) -> c.sum() to cnt }.toMap()

            if (n % 2 == 0 && rSumToCnt.keys.any { it != n / 2 }) return -1
            if (n % 2 == 0 && cSumToCnt.keys.any { it != n / 2 }) return -1

            if (n % 2 == 1) {
                val majSum = rSumToCnt.maxBy { (k, v) -> v }.let { (k, v) -> k }
                val minSum = rSumToCnt.toList().single { (k, v) -> k != majSum }.let { (k, v) -> k }
                if (majSum != (n / 2) && majSum != (n + 1) / 2) return -1
                if (minSum != n - majSum) return -1
                if (cSumToCnt.getValue(majSum) != rSumToCnt.getValue(majSum)) return -1
                if (cSumToCnt.getValue(minSum) != rSumToCnt.getValue(minSum)) return -1
            }
        }

        val rowDataRaw = IntArray(n) { r -> board[r][0] }
        val cnt0 = swapCnt(rowDataRaw, 0)
        val cnt1 = swapCnt(rowDataRaw, 1)

        val colDataRow0 = board.first { it[0] == 0 }
        val colDataRow1 = board.first { it[0] == 1 }

        val r0c0 = cnt0 + swapCnt(colDataRow0, 0)
        val r0c1 = cnt0 + swapCnt(colDataRow0, 1)
        val r1c0 = cnt1 + swapCnt(colDataRow1, 0)
        val r1c1 = cnt1 + swapCnt(colDataRow1, 1)

        return listOf(r0c0, r0c1, r1c0, r1c1).filterNotNull().minOrNull() ?: -1
    }

    private fun swapCnt(arr: IntArray, v0: Int): Int? {
        check(v0 in 0..1)

        var i = 0
        var exp = v0
        var cnt0 = 0
        var cnt1 = 0

        while (i < arr.size) {
            if (arr[i] != exp && arr[i] == 0) cnt0++
            if (arr[i] != exp && arr[i] == 1) cnt1++

            i++
            exp = exp xor 1
        }

        return if (cnt0 == cnt1) cnt0 else null
    }
}

private operator fun Int?.plus(other: Int?) = when {
    this == null -> null
    other == null -> null
    else -> this!! + other!!
}