Генерация подпоследовательностей:

осчитать максимально последовательные положительные числа, используя замыкания?

var numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
//in this case it should be 3

print(numbers.reduce(0, { $1 > 0 ? $0 + 1 : $0 } ))//this counts total positive numbers
 Anton06 нояб. 2017 г., 13:53
мы ищем числа в числах: 1,3,4 - все положительные, мы их считаем - их 3. затем 2 отрицательных числа, 2 положительных, 3 отрицательных и 1 положительное. Итак, максимум последовательных положительных чисел - 3.

Ответы на вопрос(4)

let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
let subsequences: [[Int]] = numbers.reduce(into: []) { (result, number) in
    guard
        var currentSequence = result.last,
        let lastNumber = currentSequence.last
    else {
        result = [[number]]
        return
    }

    if number == lastNumber + 1 {
        currentSequence.append(number)
        result.removeLast()
        result.append(currentSequence)
    } else {
        result.append([number])
    }
}
let longest = subsequences.max { $0.count < $1.count }
print(subsequences)
print("Longest subsequence: \(longest)")
print("Longest length: \(longest?.count)")
Решение Вопроса

Обновить: Более простое решение: разбить массив на слои положительных элементов и определить максимальную длину слоя:

let maxConsecutive = numbers.split(whereSeparator: { $0 <= 0 }).map { $0.count }.max()!
print(maxConsecutive) // 3

Старый ответ:) Используя идеи изСвифт бегущая сумма:



let maxConsecutive = numbers.map({
    () -> (Int) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c }
}()).max()!

Вотmap() сопоставляет каждый элемент массива с количеством последовательных положительных чисел вплоть до позиции элементов, в этом случае

[1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1]

Преобразование создается как «немедленно оцененное замыкание» для захвата переменнойc который содержит текущее количество последовательных положительных чисел. Преобразование увеличивается или сбрасываетсяcи возвращает обновленное значение.

Если массив может быть большим, измените его на

let maxConsecutive = numbers.lazy.map( ... ).max()!

так что максимальная длина прогона определяется без создания промежуточного массива.

 Anton06 нояб. 2017 г., 18:25
Спасибо, это именно то, что я хочу - простое и краткое решение! Как я могу найти среднее последовательное положительное число? С картой мы получаем [1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1], что теперь использовать, фильтровать и уменьшать? Результат должен быть [3,2,1], затем сумма 6 разделить на счет 3 = 2
 Anton07 нояб. 2017 г., 16:24
огромное спасибо!
 Martin R07 нояб. 2017 г., 16:11
@Anton: Вдохновленный вашим новым вопросом, я обновил этот ответ гораздо более простым решением.
var numbers = [1, 3, 4, -1, -2, 5, 2, -2, -3, -4, 5]

let result = numbers.reduce((current: 0, max: 0)) { result, number in
    var value = result

    if number > 0 {
        value.current += 1
        value.max = max(value.current, value.max)
    } else {
        value.current = 0
    }

    return value
}



result.max
 Martin R06 нояб. 2017 г., 14:21
Хорошая идея, но, похоже, есть некоторые проблемы. Возвращает 0 для данного массива.
 Arsen06 нояб. 2017 г., 14:37
@MartinR ты прав! Была проблема, но теперь она исправлена. Ура :)
var currentResult = 0
var maxResult = 0
for i in numbers {
    currentResult = i > 0 ? currentResult + 1 : 0
    if maxResult < currentResult {
       maxResult = currentResult
    }
}
print(maxResult)

 Anton06 нояб. 2017 г., 14:02
Спасибо, но мне нужно решение с крышками)
 Anton06 нояб. 2017 г., 14:13
print (numbers.reduce (0) {$ 1> 0? $ 0 + 1: 0}) - это дает мне 6 в этом примере - все положительные числа. Как получить максимальное число последовательных чисел с помощью замыканий (в данном случае 3)?
 Utemissov06 нояб. 2017 г., 14:37
@MartinR упс) Обновил код) Спасибо за проверку)
 Martin R06 нояб. 2017 г., 14:28
Это возвращает0 для массива[1,2,3,4]

Ваш ответ на вопрос