Skip to content

Commit fe37b8e

Browse files
authored
satellite (#64)
1 parent 54c11de commit fe37b8e

File tree

8 files changed

+229
-0
lines changed

8 files changed

+229
-0
lines changed

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,14 @@
494494
"practices": [],
495495
"prerequisites": [],
496496
"difficulty": 6
497+
},
498+
{
499+
"slug": "satellite",
500+
"name": "Satellite",
501+
"uuid": "689501f5-1404-4358-b1f2-aea7798352c9",
502+
"practices": [],
503+
"prerequisites": [],
504+
"difficulty": 7
497505
}
498506
]
499507
},
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
return {
2+
default = {
3+
ROOT = { '.' }
4+
}
5+
}
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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"authors": [
3+
"glennj"
4+
],
5+
"files": {
6+
"solution": [
7+
"satellite.moon"
8+
],
9+
"test": [
10+
"satellite_spec.moon"
11+
],
12+
"example": [
13+
".meta/example.moon"
14+
]
15+
},
16+
"blurb": "Rebuild binary trees from pre-order and in-order traversals."
17+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
indexof = (list, elem) ->
2+
for i, v in ipairs list
3+
if v == elem
4+
return i
5+
return -1
6+
7+
uniq = (list) ->
8+
seen = {}
9+
for elem in *list
10+
return false if seen[elem]
11+
seen[elem] = true
12+
true
13+
14+
15+
do_tree = (preorder, inorder) ->
16+
return {} if #preorder == 0
17+
18+
root = preorder[1]
19+
idx = indexof inorder, root
20+
assert idx > 0, "traversals must have the same elements"
21+
22+
return {
23+
v: root,
24+
l: do_tree {table.unpack preorder, 2, idx}, {table.unpack inorder, 1, idx - 1},
25+
r: do_tree {table.unpack preorder, idx + 1, #preorder}, {table.unpack inorder, idx + 1, #inorder}
26+
}
27+
28+
29+
{
30+
tree: (preorder, inorder) ->
31+
assert #preorder == #inorder, "traversals must have the same length"
32+
assert uniq(preorder) and uniq(inorder), "traversals must contain unique items"
33+
34+
do_tree preorder, inorder
35+
}
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+
{
2+
tree: (preorder, inorder) ->
3+
error 'Implement me'
4+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
Satellite = require 'satellite'
2+
3+
describe 'satellite', ->
4+
it "Empty tree", ->
5+
result = Satellite.tree {}, {}
6+
expected = {}
7+
assert.are.same expected, result
8+
9+
pending "Tree with one item", ->
10+
result = Satellite.tree {"a"}, {"a"}
11+
expected = { v: "a", l: {}, r: {} }
12+
assert.are.same expected, result
13+
14+
pending "Tree with many items", ->
15+
result = Satellite.tree {"a", "i", "x", "f", "r"}, {"i", "a", "f", "x", "r"}
16+
expected = {
17+
v: "a",
18+
l: { v: "i", l: {}, r: {} },
19+
r: {
20+
v: "x",
21+
l: { v: "f", l: {}, r: {} },
22+
r: { v: "r", l: {}, r: {} }
23+
}
24+
}
25+
assert.are.same expected, result
26+
27+
pending "Reject traversals of different length", ->
28+
f = -> Satellite.tree {"a", "b"}, {"b", "a", "r"}
29+
assert.has.errors f, "traversals must have the same length"
30+
31+
pending "Reject inconsistent traversals of same length", ->
32+
f = -> Satellite.tree {"x", "y", "z"}, {"a", "b", "c"}
33+
assert.has.errors f, "traversals must have the same elements"
34+
35+
pending "Reject traversals with repeated items", ->
36+
f = -> Satellite.tree {"a", "b", "a"}, {"b", "a", "a"}
37+
assert.has.errors f, "traversals must contain unique items"
38+
39+
pending "A degenerate binary tree", ->
40+
result = Satellite.tree {"a", "b", "c", "d"}, {"d", "c", "b", "a"}
41+
expected = {
42+
v: "a",
43+
l: {
44+
v: "b",
45+
l: {
46+
v: "c",
47+
l: { v: "d", l: {}, r: {} },
48+
r: {}
49+
},
50+
r: {}
51+
},
52+
r: {}
53+
}
54+
assert.are.same expected, result
55+
56+
pending "Another degenerate binary tree", ->
57+
result = Satellite.tree {"a", "b", "c", "d"}, {"a", "b", "c", "d"}
58+
expected = {
59+
v: "a",
60+
l: {},
61+
r: {
62+
v: "b",
63+
l: {},
64+
r: {
65+
v: "c",
66+
l: {},
67+
r: { v: "d", l: {}, r: {} }
68+
}
69+
}
70+
}
71+
assert.are.same expected, result
72+
73+
pending "Tree with many more items", ->
74+
result = Satellite.tree {"a", "b", "d", "g", "h", "c", "e", "f", "i"}, {"g", "d", "h", "b", "a", "e", "c", "i", "f"}
75+
expected = {
76+
v: "a",
77+
l: {
78+
v: "b",
79+
l: {
80+
v: "d",
81+
l: { v: "g", l: {}, r: {} },
82+
r: { v: "h", l: {}, r: {} }
83+
},
84+
r: {}
85+
},
86+
r: {
87+
v: "c",
88+
l: { v: "e", l: {}, r: {} },
89+
r: {
90+
v: "f",
91+
l: { v: "i", l: {}, r: {} },
92+
r: {}
93+
}
94+
}
95+
}
96+
assert.are.same expected, result

0 commit comments

Comments
 (0)