Как получить суммирование диагональных линий с помощью функций высшего порядка? - PullRequest
0 голосов
/ 04 октября 2018

Рассмотрим следующий 2D-массив:

let array = [
                [11, 2, 4],
                [4, 5, 6],
                [10, 8, -12]
            ]

То, что я хочу получить, - это суммирование диагоналей:

  • As firstDiagnal: 11 + 5 + (-12) = 4
  • Как secondDiagnal: 4 + 5 + 10 = 19

Я мог бы добиться этого, используя стандартный цикл for-in:

var firstDiagnal = 0
var secondDiagnal = 0

for i in 0..<array.count {
    firstDiagnal += array[i][i]
    secondDiagnal += array[i][array[i].count - 1 - i]
}

print(firstDiagnal)
print(secondDiagnal)

Однако, что могло бы быть, если бы мы попытались использовать функции высшего порядка ?такие как map и reduce?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Начнем с того, что вы можете написать аккуратное расширение, чтобы вывести диагональ из вложенного массива:

extension Array {

    func diagonal<T>(order: Int) -> [T] where Element == [T] {

        var order = order
        return self.compactMap {
            guard order >= 0, $0.count > order else {
                order -= 1
                return nil
            }
            let output = $0[order]
            order -= 1
            return output
        }
    }
}

let array = [[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]]

print(array.diagonal(order: 0)) // [1]
print(array.diagonal(order: 1)) // [2, 4]
print(array.diagonal(order: 2)) // [3, 5 ,7]
print(array.diagonal(order: 3)) // [6, 8]

Это просто случай болтового стандартного сокращения и суммы:

let fristDiagonal = array.diagonal(order: 0).reduce(0, +)
let secondDiagonal = array.diagonal(order: 1).reduce(0, +)
0 голосов
/ 04 октября 2018

Чтобы получить первую сумму, вам нужен i-й элемент i-й строки:

let firstDiag = array.enumerated().map { $1[$0] }.reduce(0, +)

Чтобы получить вторую сумму, вы хотите то же самое, но столбцы поменялись местами:

let secondDiag = array.enumerated().map { $1.reversed()[$0] }.reduce(0, +)
...