Я не мог придумать какой-либо idomati c / функциональный стиль, чтобы сделать это, но мне пришла в голову идея просто создать лениво вычисляемую функцию подкачки, которая меняет столбцы со строками, когда она хочет вытащить, не создавая новую list.
fun <T> List<List<T>>.swapped() = sequence {
var index = 0
while (index < size) {
yield(map { it[index] })
index++
}
}
fun main() {
val list = listOf(
listOf(0, 0, 0),
listOf(0, 0, 0),
listOf(1, 0, 1)
)
val cntRows = list.count { it.all { el -> el == 0 } }
val cntCols = list.swapped().count { it.all { el -> el == 0 } }
println("cntRows: $cntRows")
println("cntCols: $cntCols")
}
Я изо всех сил старался оптимизировать его и делал это за те же шаги O (n * m), что и при обычном подсчете строк, так как последовательности лениво вычисляются .