fix(curriculum): rework Project Euler 86 (#42189)
* fix: rework challenge to use argument in function * fix: add solution
This commit is contained in:
@ -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;
|
||||
}
|
||||
```
|
||||
|
Reference in New Issue
Block a user