Files
freeCodeCamp/curriculum/challenges/russian/08-coding-interview-prep/rosetta-code/taxicab-numbers.russian.md

4.6 KiB
Raw Blame History

title, id, challengeType, forumTopicId, localeTitle
title id challengeType forumTopicId localeTitle
Taxicab numbers 594ecc0d9a8cf816e3340187 5 302337 Номера такси

Description

Номер такси (определение, которое используется здесь) является положительным целым числом, которое может быть выражено как сумма двух положительных кубов более чем одним способом. Первый номер такси составляет 1729, что составляет: 1 3 + 12 3 и 9 3 + 10 3 . Номера такси также известны как: * номера такси * номера такси-такси * номера такси * номера Hardy-Ramanujan Задача: Напишите функцию, которая возвращает самые низкие номера такси. Для каждого номера такси, укажите номер, а также его составные кубы. См. Также: [http://oeis.org/A001235 A001235 номера такси) в онлайновой энциклопедии целочисленных последовательностей. Харди-Рамануджан на MathWorld. номер такси для MathWorld. номер такси в Википедии.

Instructions

Write a function that returns the lowest n taxicab numbers. For each of the taxicab numbers, show the number as well as its constituent cubes. See also:

Tests

tests:
  - text: <code>taxicabNumbers</code> is a function.
    testString: assert(typeof taxicabNumbers === 'function');
  - text: <code>taxicabNumbers</code> should return an array.
    testString: assert(typeof taxicabNumbers(2) === 'object');
  - text: <code>taxicabNumbers</code> should return an array of numbers.
    testString: assert(typeof taxicabNumbers(100)[0] === 'number');
  - text: <code>taxicabNumbers(4)</code> must return [1729, 4104, 13832, 20683].
    testString: assert.deepEqual(taxicabNumbers(4), res4);
  - 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]
    testString: assert.deepEqual(taxicabNumbers(25), res25);
  - text: <code>taxicabNumbers(39)</code> resulting numbers from 20 - 29 should be [314496,320264,327763,373464,402597,439101,443889,513000,513856].
    testString: assert.deepEqual(taxicabNumbers(39).slice(20, 29), res39From20To29);

Challenge Seed

function taxicabNumbers(n) {
  // Good luck!
  return true;
}

After Tests

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];

Solution

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));
}