У меня есть список списков целых.Нужно получить список сумм всех элементов в столбце, идущих справа налево, с нулевым значением, если значение в столбце отсутствует (строка короче других):
( 1, 7),
( 3, 3, 6, 0),
(),
( 9, 1, 6, 7, 2),
...
---------------------
( 9, 4, 9, 14, 9)
Iнаписал это на Java (скажем, императивный язык):
int[][] s = {
{ 1, 7 },
{ 3, 4, 6, 0 },
{},
{ 9, 1, 6, 7, 2 }
};
int maxLen = 0;
for (int[] x : s) {
maxLen = Integer.max(maxLen, x.length);
}
int[] sum = new int[maxLen];
for (int j = maxLen; j-- > 0; ) {
for (int[] i : s) {
int idxFromEnd = j - maxLen + i.length;
sum[j] += idxFromEnd >= 0 ? i[idxFromEnd] : 0;
}
}
и затем перевел на Scala:
val s = List(
List( 1, 7 ),
List( 3, 4, 6, 0 ),
List(),
List( 9, 1, 6, 7, 2 ),
)
val maxLen = s.view.map(_.length).max
val sum =
for (i <- 0 until maxLen)
yield s.view.map(row => {
val idxFromEnd = i - maxLen + row.length
row.lift(idxFromEnd).getOrElse(0)
}).sum
Не могли бы вы, ребята, предложить идиоматический способ написать это на Scala.Хвостовая рекурсия также допустима.