Skip to content

Instantly share code, notes, and snippets.

@juliofruta
Created August 28, 2023 03:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juliofruta/b8cd92d4f6c6f96f3250311f597f588a to your computer and use it in GitHub Desktop.
Save juliofruta/b8cd92d4f6c6f96f3250311f597f588a to your computer and use it in GitHub Desktop.
enum Parenthesis: String {
case open = "("
case closed = ")"
}
indirect enum Tree {
case character(value: Parenthesis, next: Tree?)
var description: String {
switch self {
case let .character(value: parenthesis, next: tree):
return "\(parenthesis.rawValue)\(tree?.description ?? "")"
}
}
var count: Int {
switch self {
case let .character(value: Parenthesis, next: tree):
return 1 + (tree?.count ?? 0)
}
}
var string: String {
switch self {
case let .character(value: parenthesis, next: tree):
return parenthesis.rawValue + (tree?.string ?? "")
}
}
var isBalanced: Bool {
var stack: [String] = []
var iterator = self.string.makeIterator()
while let next = iterator.next() {
if next == "(" {
stack.append("(")
} else {
if stack.isEmpty {
return false
} else {
stack.popLast()
}
}
}
return stack.isEmpty
}
}
func generate(size n: Int) -> [Tree] {
if n == 1 {
return [
Tree.character(value: .open, next: nil),
Tree.character(value: .closed, next: nil)
]
} else {
let trees = generate(size: n - 1)
let openTree = trees.map { Tree.character(value: .open, next: $0) }
let closedTree = trees.map { Tree.character(value: .closed, next: $0) }
return openTree + closedTree
}
}
func generateStrings(size n: Int) -> [String] {
generate(size: n)
.filter { $0.isBalanced }
.map { $0.string }
}
print(generateStrings(size: 12))
@juliofruta
Copy link
Author

lacks backtracking

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment