Skip to content

Commit 73cc4ce

Browse files
committed
Add satellite
1 parent 8c5ab1c commit 73cc4ce

File tree

7 files changed

+255
-1
lines changed

7 files changed

+255
-1
lines changed

config.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,14 @@
926926
"practices": [],
927927
"prerequisites": [],
928928
"difficulty": 6
929+
},
930+
{
931+
"slug": "satellite",
932+
"name": "Satellite",
933+
"uuid": "b09b1106-6ca1-49e2-8cb6-8dcf86f37675",
934+
"practices": [],
935+
"prerequisites": [],
936+
"difficulty": 5
929937
}
930938
]
931939
},
@@ -984,4 +992,4 @@
984992
"used_for/scripts",
985993
"used_for/web_development"
986994
]
987-
}
995+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Instructions
2+
3+
Imagine you need to transmit a binary tree to a satellite approaching Alpha Centauri and you have limited bandwidth.
4+
Since the tree has no repeating items it can be uniquely represented by its [pre-order and in-order traversals][wiki].
5+
6+
Write the software for the satellite to rebuild the tree from the traversals.
7+
8+
A pre-order traversal reads the value of the current node before (hence "pre") reading the left subtree in pre-order.
9+
Afterwards the right subtree is read in pre-order.
10+
11+
An in-order traversal reads the left subtree in-order then the current node and finally the right subtree in-order.
12+
So in order from left to right.
13+
14+
For example the pre-order traversal of this tree is [a, i, x, f, r].
15+
The in-order traversal of this tree is [i, a, f, x, r]
16+
17+
```text
18+
a
19+
/ \
20+
i x
21+
/ \
22+
f r
23+
```
24+
25+
Note: the first item in the pre-order traversal is always the root.
26+
27+
[wiki]: https://en.wikipedia.org/wiki/Tree_traversal
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"authors": [
3+
"lpizzinidev"
4+
],
5+
"contributors": [
6+
"BNAndras"
7+
],
8+
"files": {
9+
"solution": [
10+
"satellite.coffee"
11+
],
12+
"test": [
13+
"satellite.spec.coffee"
14+
],
15+
"example": [
16+
".meta/example.coffee"
17+
]
18+
},
19+
"blurb": "Rebuild binary trees from pre-order and in-order traversals."
20+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Satellite
2+
@treeFromTraversals: (preorder, inorder) ->
3+
if preorder.length != inorder.length
4+
throw new Error 'traversals must have the same length'
5+
6+
uniquePreorder = new Set preorder
7+
uniqueInorder = new Set inorder
8+
9+
if uniquePreorder.size != preorder.length or uniqueInorder.size != inorder.length
10+
throw new Error 'traversals must contain unique items'
11+
12+
preorderSorted = preorder.slice().sort().join(',')
13+
inorderSorted = inorder.slice().sort().join(',')
14+
15+
if preorderSorted != inorderSorted
16+
throw new Error 'traversals must have the same elements'
17+
18+
if preorder.length == 0
19+
return {}
20+
21+
head = preorder[0]
22+
preorderRest = preorder.slice 1
23+
inorderIndex = inorder.indexOf head
24+
25+
leftInorder = inorder.slice 0, inorderIndex
26+
rightInorder = inorder.slice inorderIndex + 1
27+
28+
leftPreorder = preorderRest.filter node -> leftInorder.includes node
29+
rightPreorder = preorderRest.filter node -> rightInorder.includes node
30+
31+
{
32+
value: head
33+
left: @treeFromTraversals leftPreorder, leftInorder
34+
right: @treeFromTraversals rightPreorder, rightInorder
35+
}
36+
37+
module.exports = Satellite
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# This is an auto-generated file.
2+
#
3+
# Regenerating this file via `configlet sync` will:
4+
# - Recreate every `description` key/value pair
5+
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
6+
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
7+
# - Preserve any other key/value pair
8+
#
9+
# As user-added comments (using the # character) will be removed when this file
10+
# is regenerated, comments can be added via a `comment` key.
11+
12+
[8df3fa26-811a-4165-9286-ff9ac0850d19]
13+
description = "Empty tree"
14+
15+
[f945ccfc-05e3-47d7-825b-0270559d43ad]
16+
description = "Tree with one item"
17+
18+
[a0121d5f-37b0-48dd-9c64-cba4c4464135]
19+
description = "Tree with many items"
20+
21+
[6074041f-4891-4d81-a128-401050c2a3b0]
22+
description = "Reject traversals of different length"
23+
24+
[27916ce4-45f3-4d8b-8528-496fedc157ca]
25+
description = "Reject inconsistent traversals of same length"
26+
27+
[d86a3d72-76a9-43b5-9d3a-e64cb1216035]
28+
description = "Reject traversals with repeated items"
29+
30+
[af31ae02-7e5b-4452-a990-bccb3fca9148]
31+
description = "A degenerate binary tree"
32+
33+
[ee54463d-a719-4aae-ade4-190d30ce7320]
34+
description = "Another degenerate binary tree"
35+
36+
[87123c08-c155-4486-90a4-e2f75b0f3e8f]
37+
description = "Tree with many more items"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class Satellite
2+
@treeFromTraversals: (preorder, inorder) ->
3+
4+
module.exports = Satellite
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
Satellite = require './satellite'
2+
3+
describe 'Satellite', ->
4+
it 'Empty tree', ->
5+
preorder = []
6+
inorder = []
7+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual {}
8+
9+
xit 'Tree with one item', ->
10+
preorder = ['a']
11+
inorder = ['a']
12+
expected =
13+
value: 'a'
14+
left: {}
15+
right: {}
16+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual expected
17+
18+
xit 'Tree with many items', ->
19+
preorder = ['a', 'i', 'x', 'f', 'r']
20+
inorder = ['i', 'a', 'f', 'x', 'r']
21+
expected =
22+
value: 'a'
23+
left:
24+
value: 'i'
25+
left: {}
26+
right: {}
27+
right:
28+
value: 'x'
29+
left:
30+
value: 'f'
31+
left: {}
32+
right: {}
33+
right:
34+
value: 'r'
35+
left: {}
36+
right: {}
37+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual expected
38+
39+
xit 'Reject traversals of different length', ->
40+
preorder = ['a', 'b']
41+
inorder = ['b', 'a', 'r']
42+
expect(-> Satellite.treeFromTraversals(preorder, inorder)).toThrow new Error 'traversals must have the same length'
43+
44+
xit 'Reject inconsistent traversals of same length', ->
45+
preorder = ['x', 'y', 'z']
46+
inorder = ['a', 'b', 'c']
47+
expect(-> Satellite.treeFromTraversals(preorder, inorder)).toThrow new Error 'traversals must have the same elements'
48+
49+
xit 'Reject traversals with repeated items', ->
50+
preorder = ['a', 'b', 'a']
51+
inorder = ['b', 'a', 'a']
52+
expect(-> Satellite.treeFromTraversals(preorder, inorder)).toThrow new Error 'traversals must contain unique items'
53+
54+
xit 'A degenerate binary tree', ->
55+
preorder = ['a', 'b', 'c', 'd']
56+
inorder = ['d', 'c', 'b', 'a']
57+
expected =
58+
value: 'a'
59+
left:
60+
value: 'b'
61+
left:
62+
value: 'c'
63+
left:
64+
value: 'd'
65+
left: {}
66+
right: {}
67+
right: {}
68+
right: {}
69+
right: {}
70+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual expected
71+
72+
xit 'Another degenerate binary tree', ->
73+
preorder = ['a', 'b', 'c', 'd']
74+
inorder = ['a', 'b', 'c', 'd']
75+
expected =
76+
value: 'a'
77+
left: {}
78+
right:
79+
value: 'b'
80+
left: {}
81+
right:
82+
value: 'c'
83+
left: {}
84+
right:
85+
value: 'd'
86+
left: {}
87+
right: {}
88+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual expected
89+
90+
xit 'Tree with many more items', ->
91+
preorder = ['a', 'b', 'd', 'g', 'h', 'c', 'e', 'f', 'i']
92+
inorder = ['g', 'd', 'h', 'b', 'a', 'e', 'c', 'i', 'f']
93+
expected =
94+
value: 'a'
95+
left:
96+
value: 'b'
97+
left:
98+
value: 'd'
99+
left:
100+
value: 'g'
101+
left: {}
102+
right: {}
103+
right:
104+
value: 'h'
105+
left: {}
106+
right: {}
107+
right: {}
108+
right:
109+
value: 'c'
110+
left:
111+
value: 'e'
112+
left: {}
113+
right: {}
114+
right:
115+
value: 'f'
116+
left:
117+
value: 'i'
118+
left: {}
119+
right: {}
120+
right: {}
121+
expect(Satellite.treeFromTraversals(preorder, inorder)).toEqual expected

0 commit comments

Comments
 (0)