From 8ac8772da1ec72537451e69a360ac7e941c836bc Mon Sep 17 00:00:00 2001 From: gikf <60067306+gikf@users.noreply.github.com> Date: Wed, 26 May 2021 10:52:42 +0200 Subject: [PATCH] fix(curriculum): rework Project Euler 86 (#42189) * fix: rework challenge to use argument in function * fix: add solution --- .../project-euler/problem-86-cuboid-route.md | 60 ++++++++++++++++--- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md b/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md index 358806c952..caa496a114 100644 --- a/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md +++ b/curriculum/challenges/english/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md @@ -14,22 +14,40 @@ A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a f However, there are up to three "shortest" path candidates for any given cuboid and the shortest route doesn't always have integer length. -It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is 1975. +It can be shown that there are exactly `2060` distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is `1975`. -Find the least value of M such that the number of solutions first exceeds one million. +Find the least value of M such that the number of solutions first exceeds `n`. # --hints-- -`cuboidRoute()` should return a number. +`cuboidRoute(2000)` should return a number. ```js -assert(typeof cuboidRoute() === 'number'); +assert(typeof cuboidRoute(2000) === 'number'); ``` -`cuboidRoute()` should return 1818. +`cuboidRoute(2000)` should return `100`. ```js -assert.strictEqual(cuboidRoute(), 1818); +assert.strictEqual(cuboidRoute(2000), 100); +``` + +`cuboidRoute(25000)` should return `320`. + +```js +assert.strictEqual(cuboidRoute(25000), 320); +``` + +`cuboidRoute(500000)` should return `1309`. + +```js +assert.strictEqual(cuboidRoute(500000), 1309); +``` + +`cuboidRoute(1000000)` should return `1818`. + +```js +assert.strictEqual(cuboidRoute(1000000), 1818); ``` # --seed-- @@ -37,16 +55,40 @@ assert.strictEqual(cuboidRoute(), 1818); ## --seed-contents-- ```js -function cuboidRoute() { +function cuboidRoute(n) { return true; } -cuboidRoute(); +cuboidRoute(2000); ``` # --solutions-- ```js -// solution required +function cuboidRoute(n) { + // Based on https://www.mathblog.dk/project-euler-86-shortest-path-cuboid/ + function getLength(a, b) { + return Math.sqrt(a ** 2 + b ** 2); + } + + let M = 2; + let counter = 0; + + while (counter < n) { + M++; + for (let baseHeightWidth = 3; baseHeightWidth <= 2 * M; baseHeightWidth++) { + const pathLength = getLength(M, baseHeightWidth); + if (Number.isInteger(pathLength)) { + if (baseHeightWidth <= M) { + counter += Math.floor(baseHeightWidth / 2); + } else { + counter += 1 + M - Math.floor((baseHeightWidth + 1) / 2); + } + } + } + } + + return M; +} ```