From 40a8880b7b2f4dcbc94120582ced44b9e6f08a39 Mon Sep 17 00:00:00 2001 From: iswilljr Date: Sat, 16 Dec 2023 13:52:16 -0500 Subject: [PATCH] feat(2023): add solution for challenge #16 --- 2023/challenge-16/README.md | 51 +++++++ 2023/challenge-16/challenge-16.test.ts | 176 +++++++++++++++++++++++++ 2023/challenge-16/challenge-16.ts | 38 ++++++ README.md | 2 +- 4 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 2023/challenge-16/README.md create mode 100644 2023/challenge-16/challenge-16.test.ts create mode 100644 2023/challenge-16/challenge-16.ts diff --git a/2023/challenge-16/README.md b/2023/challenge-16/README.md new file mode 100644 index 0000000..aeaad1d --- /dev/null +++ b/2023/challenge-16/README.md @@ -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!** diff --git a/2023/challenge-16/challenge-16.test.ts b/2023/challenge-16/challenge-16.test.ts new file mode 100644 index 0000000..fe7730f --- /dev/null +++ b/2023/challenge-16/challenge-16.test.ts @@ -0,0 +1,176 @@ +import { describe } from 'vitest' +import { transformTree } from './challenge-16' + +const TEST_CASES: TestCases< + Array, + Record | 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, + }) +}) diff --git a/2023/challenge-16/challenge-16.ts b/2023/challenge-16/challenge-16.ts new file mode 100644 index 0000000..f8ce25e --- /dev/null +++ b/2023/challenge-16/challenge-16.ts @@ -0,0 +1,38 @@ +export function transformTree(tree: Array) { + if (!tree.length) return null + + const rootTree: Array | 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] +} diff --git a/README.md b/README.md index 31ce42e..954a03f 100644 --- a/README.md +++ b/README.md @@ -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 | -- | -- | -- | -- |