-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(2023): add solution for challenge #16
- Loading branch information
Showing
4 changed files
with
266 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# Challenge #16: Friday deployment | ||
|
||
Yesterday, someone did a production deployment and the application for assembling Christmas trees broke. We've been asked to fix it as soon as possible. | ||
|
||
The problem is that the format of the trees has changed. **It's an array of numbers… but it should be an object!** For example, the tree: `[3, 1, 0, 8, 12, null, 1]` looks like this: | ||
|
||
```js | ||
// 3 | ||
// / \ | ||
// 1 0 | ||
// / \ \ | ||
// 8 12 1 | ||
``` | ||
|
||
What we need is to transform the array into an object where each node of the tree has `value`, `left`, and `right` properties. | ||
|
||
For example, running your `transformTree` function with `[3, 1, 0, 8, 12, null, 1]` should return this: | ||
|
||
```js | ||
{ | ||
value: 3, | ||
left: { | ||
value: 1, | ||
left: { | ||
value: 8, | ||
left: null, | ||
right: null | ||
}, | ||
right: { | ||
value: 12, | ||
left: null, | ||
right: null | ||
} | ||
}, | ||
right: { | ||
value: 0, | ||
left: null, | ||
right: { | ||
value: 1, | ||
left: null, | ||
right: null | ||
} | ||
} | ||
} | ||
``` | ||
|
||
The elf on duty who tried to solve the problem before going home, left us some clues: | ||
|
||
- **If a node doesn't have a value, it's represented with null. Therefore, if a node has a null value, it won't have any children.** | ||
- **The root node is at index 0 in the array.** | ||
- **There's a relationship between the index of a node and the index of its children. Look for the pattern!** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
import { describe } from 'vitest' | ||
import { transformTree } from './challenge-16' | ||
|
||
const TEST_CASES: TestCases< | ||
Array<number | null>, | ||
Record<string, any> | null | ||
> = [ | ||
{ args: [], expected: null }, | ||
{ | ||
args: [1], | ||
expected: { | ||
value: 1, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
{ | ||
args: [1, 2, 3], | ||
expected: { | ||
value: 1, | ||
left: { | ||
value: 2, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 3, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
{ | ||
args: [1, 2, 3, 4, 5], | ||
expected: { | ||
value: 1, | ||
left: { | ||
value: 2, | ||
left: { | ||
value: 4, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 5, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
right: { | ||
value: 3, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
{ | ||
args: [1, 2, 3, 4, 5, 6, 7], | ||
expected: { | ||
value: 1, | ||
left: { | ||
value: 2, | ||
left: { | ||
value: 4, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 5, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
right: { | ||
value: 3, | ||
left: { | ||
value: 6, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 7, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
}, | ||
{ | ||
args: [17, 0, null, null, 1], | ||
expected: { | ||
value: 17, | ||
left: { | ||
value: 0, | ||
left: null, | ||
right: { | ||
value: 1, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
right: null, | ||
}, | ||
}, | ||
{ | ||
args: [3, 1, 0, 8, 12, null, 1], | ||
expected: { | ||
value: 3, | ||
left: { | ||
value: 1, | ||
left: { | ||
value: 8, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 12, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
right: { | ||
value: 0, | ||
left: null, | ||
right: { | ||
value: 1, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
}, | ||
{ | ||
args: [2, 7, 5, null, 6, null, 9, null, null, 1, 11, null, null, null, 10], | ||
expected: { | ||
value: 2, | ||
left: { | ||
value: 7, | ||
left: null, | ||
right: { | ||
value: 6, | ||
left: { | ||
value: 1, | ||
left: null, | ||
right: null, | ||
}, | ||
right: { | ||
value: 11, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
right: { | ||
value: 5, | ||
left: null, | ||
right: { | ||
value: 9, | ||
left: null, | ||
right: { | ||
value: 10, | ||
left: null, | ||
right: null, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
] | ||
|
||
describe('Challenge #16: Friday deployment', () => { | ||
buildChallengeTestCases({ | ||
cases: TEST_CASES, | ||
fn: transformTree, | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
export function transformTree(tree: Array<number | null>) { | ||
if (!tree.length) return null | ||
|
||
const rootTree: Array<Record<string, any> | null> = [ | ||
{ | ||
value: tree[0], | ||
left: null, | ||
right: null, | ||
}, | ||
] | ||
|
||
let index = 1 | ||
|
||
for (const node of tree.slice(1)) { | ||
let subTree = null | ||
|
||
if (node != null) { | ||
const parentIndex = index - Math.trunc(index / 2) - 1 | ||
const side = index % 2 === 0 ? 'right' : 'left' | ||
const parent = rootTree[parentIndex] | ||
|
||
subTree = { | ||
value: node, | ||
left: null, | ||
right: null, | ||
} | ||
|
||
if (parent) { | ||
parent[side] = subTree | ||
} | ||
} | ||
|
||
index++ | ||
rootTree.push(subTree) | ||
} | ||
|
||
return rootTree[0] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters