2018-09-30 23:01:58 +01:00
---
title: Taxicab numbers
id: 594ecc0d9a8cf816e3340187
challengeType: 5
2019-08-05 09:17:33 -07:00
forumTopicId: 302337
2018-09-30 23:01:58 +01:00
---
## Description
< section id = 'description' >
2019-03-10 22:12:52 +09:00
A < a href = "https://en.wikipedia.org/wiki/Hardy– Ramanujan number" title = "wp: Hardy– Ramanujan number" target = "_blank" > taxicab number< / a > (the definition that is being used here) is a positive integer that can be expressed as the sum of two positive cubes in more than one way.
2019-06-14 20:04:16 +09:00
The first taxicab number is < code > 1729< / code > , which is:
2019-03-10 22:12:52 +09:00
< span style = "margin-left: 2em;" > 1< sup > 3< / sup > + 12< sup > 3< / sup > and< / span >
< span style = "margin-left: 2em;" > 9< sup > 3< / sup > + 10< sup > 3< / sup > .< / span >
2018-09-30 23:01:58 +01:00
Taxicab numbers are also known as:
2019-03-10 22:12:52 +09:00
< ul >
< li > taxi numbers< / li >
< li > taxi-cab numbers< / li >
< li > taxi cab numbers< / li >
< li > Hardy-Ramanujan numbers< / li >
< / ul >
2018-09-30 23:01:58 +01:00
< / section >
## Instructions
< section id = 'instructions' >
2019-03-10 22:12:52 +09:00
Write a function that returns the lowest < code > n< / code > taxicab numbers. For each of the taxicab numbers, show the number as well as its constituent cubes.
2019-06-14 20:04:16 +09:00
< strong > See also:< / strong >
2019-03-10 22:12:52 +09:00
< ul >
2019-05-22 23:30:29 +09:00
< li > < a href = "https://oeis.org/A001235" target = "_blank" > A001235 taxicab numbers< / a > on The On-Line Encyclopedia of Integer Sequences.< / li >
2019-03-10 22:12:52 +09:00
< li > < a href = "https://en.wikipedia.org/wiki/Taxicab_number" target = "_blank" > taxicab number< / a > on Wikipedia.< / li >
< / ul >
2018-09-30 23:01:58 +01:00
< / section >
## Tests
< section id = 'tests' >
```yml
2018-10-04 14:37:37 +01:00
tests:
2019-11-20 07:01:31 -08:00
- text: < code > taxicabNumbers</ code > should be a function.
2019-07-26 05:24:52 -07:00
testString: assert(typeof taxicabNumbers === 'function');
2019-03-10 22:12:52 +09:00
- text: < code > taxicabNumbers</ code > should return an array.
2019-07-26 05:24:52 -07:00
testString: assert(typeof taxicabNumbers(2) === 'object');
2019-03-10 22:12:52 +09:00
- text: < code > taxicabNumbers</ code > should return an array of numbers.
2019-07-26 05:24:52 -07:00
testString: assert(typeof taxicabNumbers(100)[0] === 'number');
2019-11-20 07:01:31 -08:00
- text: < code > taxicabNumbers(4)</ code > should return [1729, 4104, 13832, 20683].
2019-07-26 05:24:52 -07:00
testString: assert.deepEqual(taxicabNumbers(4), res4);
2019-03-10 22:12:52 +09:00
- text: < code > taxicabNumbers(25)</ code > should return [1729, 4104, 13832, 20683, 32832, 39312, 40033, 46683, 64232, 65728, 110656, 110808, 134379, 149389, 165464, 171288, 195841, 216027, 216125, 262656, 314496, 320264, 327763, 373464, 402597]
2019-07-26 05:24:52 -07:00
testString: assert.deepEqual(taxicabNumbers(25), res25);
2019-03-10 22:12:52 +09:00
- text: < code > taxicabNumbers(39)</ code > resulting numbers from 20 - 29 should be [314496,320264,327763,373464,402597,439101,443889,513000,513856].
2019-07-26 05:24:52 -07:00
testString: assert.deepEqual(taxicabNumbers(39).slice(20, 29), res39From20To29);
2018-09-30 23:01:58 +01:00
```
< / section >
## Challenge Seed
< section id = 'challengeSeed' >
< div id = 'js-seed' >
```js
2019-03-10 22:12:52 +09:00
function taxicabNumbers(n) {
2018-09-30 23:01:58 +01:00
// Good luck!
return true;
}
```
< / div >
### After Test
< div id = 'js-teardown' >
```js
2018-10-20 21:02:47 +03:00
const res4 = [1729, 4104, 13832, 20683];
const res25 = [
1729, 4104, 13832, 20683, 32832, 39312, 40033, 46683, 64232, 65728, 110656,
110808, 134379, 149389, 165464, 171288, 195841, 216027, 216125, 262656, 314496, 320264, 327763,
373464, 402597
];
const res39From20To29 = [314496, 320264, 327763, 373464, 402597, 439101, 443889, 513000, 513856];
2018-09-30 23:01:58 +01:00
```
< / div >
< / section >
## Solution
< section id = 'solution' >
```js
function taxicabNumbers(nNumbers) {
const cubeN = [];
const s3s = {};
const e = 100;
for (let n = 1; n < e ; n + = 1 ) {
cubeN[n] = n * n * n;
}
for (let a = 1; a < e - 1 ; a + = 1 ) {
const a3 = cubeN[a];
for (let b = a; b < e ; b + = 1 ) {
const b3 = cubeN[b];
const s3 = a3 + b3;
let abs = s3s[s3];
if (!abs) {
s3s[s3] = abs = [];
}
abs.push([a, b]);
}
}
let i = 0;
const res = [];
Object.keys(s3s).forEach(s3 => {
const abs = s3s[s3];
if (abs.length >= 2) { // No two cube pairs found
i += 1;
if (i < = nNumbers) {
res.push(s3);
}
}
});
return res.map(item => parseInt(item, 10));
}
```
< / section >