Skip to content

Commit

Permalink
feat(2023): add solution for challenge #16
Browse files Browse the repository at this point in the history
  • Loading branch information
iswilljr committed Dec 16, 2023
1 parent 16d12a3 commit 40a8880
Show file tree
Hide file tree
Showing 4 changed files with 266 additions and 1 deletion.
51 changes: 51 additions & 0 deletions 2023/challenge-16/README.md
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!**
176 changes: 176 additions & 0 deletions 2023/challenge-16/challenge-16.test.ts
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,
})
})
38 changes: 38 additions & 0 deletions 2023/challenge-16/challenge-16.ts
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]
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ This repository contains the solutions to the challenges proposed by [@midudev](
| 13 | Calculating the time | 🟢 | [Show](https://adventjs.dev/challenges/2023/13) | [Go](./2023/challenge-13/challenge-13.ts) |
| 14 | Avoid the alarm | 🟠 | [Show](https://adventjs.dev/challenges/2023/14) | [Go](./2023/challenge-14/challenge-14.ts) |
| 15 | Autonomous robot | 🟠 | [Show](https://adventjs.dev/challenges/2023/15) | [Go](./2023/challenge-15/challenge-15.ts) |
| 16 | -- | -- | -- | -- |
| 16 | Friday deployment | 🟢 | [Show](https://adventjs.dev/challenges/2023/16) | [Go](./2023/challenge-16/challenge-16.ts) |
| 17 | -- | -- | -- | -- |
| 18 | -- | -- | -- | -- |
| 19 | -- | -- | -- | -- |
Expand Down

0 comments on commit 40a8880

Please sign in to comment.