diff --git a/.gitignore b/.gitignore index b9c50855..a5424946 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ yarn-error.log !.yarn/releases !.yarn/sdks !.yarn/versions + +.idea diff --git a/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/__init__.py b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/__init__.py new file mode 100644 index 00000000..59fba37a --- /dev/null +++ b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/__init__.py @@ -0,0 +1,29 @@ +from typing import Generator, Optional, List + + +class TreeNode: + def __init__( + self, + val: int = 0, + children: List["TreeNode"] = [], + ): + self.val = val + self.children = children + + +def traverse_postorder_n_ary( + root: Optional[TreeNode], +) -> Generator[TreeNode, None, None]: + stack = [(root, False)] + while stack: + node, did_traverse_children = stack.pop() + if not node: + continue + + if did_traverse_children: + yield node + continue + + stack.append((node, True)) + for child in reversed(node.children): + stack.append((child, False)) diff --git a/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/goody.json b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/goody.json new file mode 100644 index 00000000..e1ffc187 --- /dev/null +++ b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/goody.json @@ -0,0 +1,3 @@ +{ + "name": "traverse_postorder_n_ary" +} diff --git a/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/test.py b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/test.py new file mode 100644 index 00000000..d29851fb --- /dev/null +++ b/workspaces/adventure-pack/goodies/python3/src/traverse_postorder_n_ary/test.py @@ -0,0 +1,58 @@ +from . import * + + +def test_empty_tree() -> None: + assert list(traverse_postorder_n_ary(None)) == [] + + +def test_root_only() -> None: + root = TreeNode(10) + assert [node.val for node in traverse_postorder_n_ary(root)] == [10] + + +def test_three_children() -> None: + root = TreeNode(10) + root.children = [TreeNode(4), TreeNode(5), TreeNode(6)] + assert [node.val for node in traverse_postorder_n_ary(root)] == [ + 4, + 5, + 6, + 10, + ] + + +def test_unbalanced_tree() -> None: + root = TreeNode(1) + root.children = [TreeNode(2)] + root.children[0].children = [TreeNode(3)] + root.children[0].children[0].children = [TreeNode(4)] + + assert [node.val for node in traverse_postorder_n_ary(root)] == [4, 3, 2, 1] + + +def test_large_tree() -> None: + root = TreeNode(1) + root.children = [TreeNode(2), TreeNode(3), TreeNode(4)] + root.children[0].children = [TreeNode(5), TreeNode(6)] + root.children[0].children[0].children = [TreeNode(8), TreeNode(9)] + root.children[0].children[0].children[1].children = [ + TreeNode(11), + TreeNode(12), + ] + root.children[0].children[1].children = [TreeNode(10)] + root.children[2].children = [TreeNode(7)] + + assert [node.val for node in traverse_postorder_n_ary(root)] == [ + 8, + 11, + 12, + 9, + 5, + 10, + 6, + 2, + 3, + 7, + 4, + 1, + ] diff --git a/workspaces/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap b/workspaces/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap index f6beb8e6..316c6ea5 100644 --- a/workspaces/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap +++ b/workspaces/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap @@ -3042,6 +3042,44 @@ def traverse_postorder( ########################### END ADVENTURE PACK CODE ############################" `; +exports[`App can equip single goody: Python 3 traverse_postorder_n_ary 1`] = ` +"########################## BEGIN ADVENTURE PACK CODE ########################### +# Adventure Pack commit fake-commit-hash +# Running at: https://example.com/ + +from typing import Generator, Optional, List + + +class TreeNode: + def __init__( + self, + val: int = 0, + children: List["TreeNode"] = [], + ): + self.val = val + self.children = children + + +def traverse_postorder_n_ary( + root: Optional[TreeNode], +) -> Generator[TreeNode, None, None]: + stack = [(root, False)] + while stack: + node, did_traverse_children = stack.pop() + if not node: + continue + + if did_traverse_children: + yield node + continue + + stack.append((node, True)) + for child in reversed(node.children): + stack.append((child, False)) + +########################### END ADVENTURE PACK CODE ############################" +`; + exports[`App can equip single goody: Python 3 traverse_preorder 1`] = ` "########################## BEGIN ADVENTURE PACK CODE ########################### # Adventure Pack commit fake-commit-hash diff --git a/workspaces/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap b/workspaces/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap index 42f7a1dd..b96fdd53 100644 --- a/workspaces/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap +++ b/workspaces/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap @@ -1748,6 +1748,38 @@ def traverse_postorder( stack.append((node.left, False))" `; +exports[`App can render goody: Python 3 traverse_postorder_n_ary 1`] = ` +"from typing import Generator, Optional, List + + +class TreeNode: + def __init__( + self, + val: int = 0, + children: List["TreeNode"] = [], + ): + self.val = val + self.children = children + + +def traverse_postorder_n_ary( + root: Optional[TreeNode], +) -> Generator[TreeNode, None, None]: + stack = [(root, False)] + while stack: + node, did_traverse_children = stack.pop() + if not node: + continue + + if did_traverse_children: + yield node + continue + + stack.append((node, True)) + for child in reversed(node.children): + stack.append((child, False))" +`; + exports[`App can render goody: Python 3 traverse_preorder 1`] = ` "from typing import Generator, Optional