Files
2022-01-20 20:30:18 +01:00

4.0 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5ea2815a8640bcc6cb7dab3c リクレル数 5 385287 lychrel-numbers

--description--

  1. 0より大きい整数 n₀ を取得します。
  2. n₀ を反転させ、 これを n₀ に追加して、級数の次の数 n を作ります。
  3. n が回文数になったとき、すなわち逆順の n の桁 == n になったときに停止します。

上記の漸化式は、適用するほとんどの開始数値 n = 1, 2, ... で、かなり早く回文数になり終了します。

例えば、 n₀ = 12 の場合、以下のようになります。

12
12 + 21 = 33,  a palindrome!

n₀ = 55 の場合、以下のようになります。

55
55 + 55 = 110
110 + 011 = 121,  a palindrome!

加算の後に回文数のチェックが行われることに注意してください。

開始数の中にはこのプロセスが永遠に続くかのように見えるものもあります。開始数が 196 のこの漸化式は回文数を形成せずに、数百万桁の数字を形成しながら、何百万もの計算を繰り返しています。 回文数で終わらない数字をリクレル数と呼びます。

このタスクでは、リクレル数は、500 回 (以上) の繰り返しの範囲において回文数を形成しない任意の開始数とします。

種子数と親族リクレル数:

リクレル数の数列で生成される整数もリクレル数になります。

一般に、1つのリクレル数からの数列は、以前のリクレル数候補からの数列に収束することがあります。例えば196と689で始まる数列は次のようになります。

    196
    196 + 691 = 887
    887 + 788 = 1675
    1675 + 5761 = 7436
    7436 + 6347 = 13783
    13783 + 38731 = 52514
    52514 + 41525 = 94039
    ...
    689
    689 + 986 = 1675
    1675 + 5761 = 7436
    ...

689 で始まる数列が、196 の数列に収束し、196 の場合と同じ数字が続くことが分かります。

このことから、リクレル数を真の種子数としてのリクレル数候補と、回文数にはならないものの、より小さいリクレル数から生成された数列の一部とみられる整数を数列内に生成する親族数にさらに分割できます。

--instructions--

パラメータとして数値を取る関数を記述してください。 数値がリクレル数の場合は true を返します。 それ以外は、falseを返します。 繰り返しの範囲は 500 回であることに注意してください。

--hints--

isLychrel は関数とします。

assert(typeof isLychrel === 'function');

isLychrel(12) はブール値を返す必要があります。

assert(typeof isLychrel(12) === 'boolean');

isLychrel(12)false を返す必要があります。

assert.equal(isLychrel(12), false);

isLychrel(55)false を返す必要があります。

assert.equal(isLychrel(55), false);

isLychrel(196)true を返す必要があります。

assert.equal(isLychrel(196), true);

isLychrel(879)true を返す必要があります。

assert.equal(isLychrel(879), true);

isLychrel(44987)false を返す必要があります。

assert.equal(isLychrel(44987), false);

isLychrel(7059)true を返す必要があります。

assert.equal(isLychrel(7059), true);

--seed--

--seed-contents--

function isLychrel(n) {

}

--solutions--

function isLychrel(n) {
  function reverse(num) {
    return parseInt(
      num
        .toString()
        .split('')
        .reverse()
        .join('')
    );
  }

  var i;
  for (i = 0; i < 500; i++) {
    n = n + reverse(n);
    if (n == reverse(n)) break;
  }

  return i == 500;
}