Me gustaría poder generar una matriz de todas las permutaciones posibles de un Bool ( true/false o 1/0 ) de un tamaño dado n , en Swift. Por ejemplo, dado n=2 , el resultado de llamar a generate(2) sería
let array: [Bool] = generate(2) // [[false, false], [false, true], [true, false], [true, true]] Busqué en Swift-algorithms pero todo lo que veo son permutaciones y combinaciones de una matriz de elementos proporcionada. Estos algoritmos no parecen abordar el escenario de un Bool con n>2 . Además, no estoy seguro de qué nombre llamar a este algoritmo.
Aquí hay una implementación recursiva simple:
import Foundation func recursion(depth: Int, arr: [[Bool]]) -> [[Bool]] { if depth == .zero { return arr } var newArr: [[Bool]] = [] for item in arr { let newItem1 = item + [false] let newItem2 = item + [true] newArr += [newItem1, newItem2] } return recursion(depth: depth-1, arr: newArr) } print(recursion(depth: 1, arr: [[]])) print(recursion(depth: 2, arr: [[]])) print(recursion(depth: 3, arr: [[]]))Esto da la salida:
[[false], [true]] [[false, false], [false, true], [true, false], [true, true]] [[false, false, false], [false, false, true], [false, true, false], [false, true, true], [true, false, false], [true, false, true], [true, true, false], [true, true, true]]Solo por diversión, un enfoque funcional:
extension RangeReplaceableCollection { var combinations: [Self] { generate(2) } func generate(_ n: Int) -> [Self] { repeatElement(self, count: n).reduce([.init()]) { result, element in result.flatMap { elements in element.map { elements + CollectionOfOne($0) } } } } }Uso:
let elements = [false, true] // [false, true] let combinations = elements.combinations // [[false, false], [false, true], [true, false], [true, true]] let generateThree = elements.generate(3) // [[false, false, false], [false, false, true], [false, true, false], [false, true, true], [true, false, false], [true, false, true], [true, true, false], [true, true, true]]o
let elements = [0, 1] // [0, 1] let combinations = elements.combinations // [[0, 0], [0, 1], [1, 0], [1, 1]] let generateThree = elements.generate(3) // [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]o con cadenas (colección de caracteres):
let elements = "01" // "01" let combinations = elements.combinations // ["00", "01", "10", "11"] let generateThree = elements.generate(3) // ["000", "001", "010", "011", "100", "101", "110", "111"]