Получить все возможные комбинации элементов в массиве без повторяющихся групп в Swift - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать расширение для массива, в котором я могу получить все возможные комбинации массива без генерации повторяющихся групп, включая комбинацию без элементов.

Например, для этого массива:

[1, 2, 3, 4]

Должны быть сгенерированы следующие возможные комбинации:

[[], [1], [2], [3], [4], [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]

Обратите внимание, что ни одна из групп не повторяется, т.е.: если есть группа [1, 2], то другой группы нет: [2, 1].

Это самый близкий результат, который мне удалось получить:

public extension Array {

func allPossibleCombinations() -> [[Element]] {
    var output: [[Element]] = [[]]
    for groupSize in 1...self.count {
        for (index1, item1) in self.enumerated() {
            var group = [item1]
            for (index2, item2) in self.enumerated() {
                if group.count < groupSize {
                    if index2 > index1 {
                        group.append(item2)
                        if group.count == groupSize {
                            output.append(group)
                            group = [item1]
                            continue
                        }
                    }
                } else {
                    break
                }
            }
            if group.count == groupSize {
                output.append(group)
            }
        }
    }
    return output
}

}

Но отсутствует возможная комбинация предметов в группе размера 3 (я только вернусь [1, 2, 3] и [2, 3, 4].

Очень ценится!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете использовать flatMap также, чтобы объединить их в одну строку.

    extension Array {
        var combinationsWithoutRepetition: [[Element]] {
            guard !isEmpty else { return [[]] }
            return Array(self[1...]).combinationsWithoutRepetition.flatMap { [$0, [self[0]] + $0] }
        }
    }

 print([1,2,3,4].combinationsWithoutRepetition)
0 голосов
/ 10 мая 2018
extension Array {
    var combinations: [[Element]] {
        if count == 0 {
            return [self]
        }
        else {
            let tail = Array(self[1..<endIndex])
            let head = self[0]

            let first = tail.combinations
            let rest = first.map { $0 + [head] }

            return first + rest
        }
    }
}

print([1, 2, 3, 4].combinations)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...