diff --git a/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Main.kt b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Main.kt new file mode 100644 index 00000000..237032cf --- /dev/null +++ b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Main.kt @@ -0,0 +1,19 @@ +package traverse_level_order + +public data class TreeNode(val `val`: Int, var left: TreeNode? = null, var right: TreeNode? = null) + +public fun TreeNode?.traverseLevelOrder(): Sequence> { + if (this == null) { + return sequenceOf() + } + + var nodesAtLevel = listOf(this) + + return sequence { + while (nodesAtLevel.isNotEmpty()) { + yield(nodesAtLevel) + + nodesAtLevel = nodesAtLevel.flatMap { listOf(it.left, it.right) }.filterNotNull() + } + } +} diff --git a/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Test.kt b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Test.kt new file mode 100644 index 00000000..be6c0016 --- /dev/null +++ b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/Test.kt @@ -0,0 +1,32 @@ +package traverse_level_order + +import kotlin.test.* + +internal class LevelOrderTraversalTest { + + @Test + fun itTraversesLevelOrderEmptyTree() { + val root: TreeNode? = null + assertContentEquals( + root.traverseLevelOrder().flatMap { it }.map { it.`val` }.toList(), emptyList()) + } + + @Test + fun itTraversesLevelOrderSingleNode() { + val root: TreeNode = TreeNode(0) + assertContentEquals( + root.traverseLevelOrder().flatMap { it }.map { it.`val` }.toList(), listOf(0)) + } + + @Test + fun itTraversesLevelOrderFullTree() { + val root: TreeNode = + TreeNode( + 1, + TreeNode(2, TreeNode(4, TreeNode(8)), TreeNode(5)), + TreeNode(3, TreeNode(6), TreeNode(7))) + assertContentEquals( + root.traverseLevelOrder().flatMap { it }.map { it.`val` }.toList(), + listOf(1, 2, 3, 4, 5, 6, 7, 8)) + } +} diff --git a/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/goody.json b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/goody.json new file mode 100644 index 00000000..7a3d7555 --- /dev/null +++ b/workspaces/adventure-pack/goodies/kotlin/src/traverse_level_order/goody.json @@ -0,0 +1,3 @@ +{ + "name": "traverseLevelOrder()" +} 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 5f019b60..3ae9f260 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 @@ -2444,6 +2444,34 @@ public fun lcm(a: Int, b: Int): Int = a / gcd(a, b) * b /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; +exports[`App can equip single goody: Kotlin traverseLevelOrder() 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +public data class TreeNode(val \`val\`: Int, var left: TreeNode? = null, var right: TreeNode? = null) + +public fun TreeNode?.traverseLevelOrder(): Sequence> { + if (this == null) { + return sequenceOf() + } + + var nodesAtLevel = listOf(this) + + return sequence { + while (nodesAtLevel.isNotEmpty()) { + yield(nodesAtLevel) + + nodesAtLevel = nodesAtLevel + .flatMap { listOf(it.left, it.right) } + .filterNotNull() + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + exports[`App can equip single goody: Python 3 UnionFind 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 54db0721..b4c61f50 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 @@ -1356,6 +1356,30 @@ import gcd_int_int.gcd public fun lcm(a: Int, b: Int): Int = a / gcd(a, b) * b" `; +exports[`App can render goody: Kotlin traverseLevelOrder() 1`] = ` +"package traverse_level_order + +public data class TreeNode(val \`val\`: Int, var left: TreeNode? = null, var right: TreeNode? = null) + +public fun TreeNode?.traverseLevelOrder(): Sequence> { + if (this == null) { + return sequenceOf() + } + + var nodesAtLevel = listOf(this) + + return sequence { + while (nodesAtLevel.isNotEmpty()) { + yield(nodesAtLevel) + + nodesAtLevel = nodesAtLevel + .flatMap { listOf(it.left, it.right) } + .filterNotNull() + } + } +}" +`; + exports[`App can render goody: Python 3 UnionFind 1`] = ` "class UnionFind: