Я думаю, что самое короткое (пуленепробиваемое) решение, когда Row является классом дел (отбрасывая логическое значение), равно
(for ((Row(v1,c1), Row(v2,c2)) <- (rows zip rows.take(1) ::: rows) if (v1 != v2 || c1 == c2)) yield v1).sum
Некоторые другие решения не обрабатывают регистр с пустым списком, ноВо многом это связано с тем, что sliding
содержит ошибку, из-за которой он возвращает частичный список, если список слишком короткий.Мне понятнее (а также пуленепробиваемое):
(rows zip rows.take(1) ::: rows).collect{
case (Row(v1,c1), Row(v2,c2)) if (v1 != v2 || c1 == c2) => v1
}.sum
(что всего на два символа больше, если держать его на одной строке).Если вам нужен пропущенный номер,
val indicated = (rows zip rows.take(1) ::: rows).collect {
case (Row(v1,c1), Row(v2,c2)) => (v1, v1 != v2 || c1 == c2)
}
val countSkip = indicated.filterNot(_._2).length
val sum = indicated.filter(_._2).map(_._1).sum