freeCodeCamp/curriculum/challenges/japanese/10-coding-interview-prep/rosetta-code/ludic-numbers.md

4.8 KiB

id title challengeType forumTopicId dashedName
5ea281203167d2b0bdefca00 ルディック数 5 385282 ludic-numbers

--description--

ルディック数は素数を生成するのにエラトステネスの篩が使用されるのとちょうど同じように、篩法による素数生成に関わります。

最初のルディック数は1です。

続けてルディック数を生成するために、2 から開始し、増加していく整数の配列を作成します。

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

(ループ)

  • 結果として生成された配列の最初の要素を次のルディック数 2 として取ります。
  • インデックスされた要素を、2 つ目ごとに配列から削除します (最初の要素を含む)。
  • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
  • (いくつかのループをアンローリング...)
  • 結果として生成された配列の最初の要素を次のルディック数 3 として取ります。
  • インデックスされた要素を、3 つ目ごとに配列から削除します (最初の項目を含む)。
  • 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 ...
  • 結果として生成された配列の最初の要素を次のルディック数 5 として取ります。
  • インデックスされた要素を、5 つ目ごとに配列から削除します (最初の項目を含む)。
  • 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55 59 61 65 67 71 73 77 ...
  • 結果として生成された配列の最初の要素を次のルディック数 7 として取ります。
  • インデックスされた要素を、7 つ目ごとに配列から削除します (最初の項目を含む)。
  • 7 11 13 17 23 25 29 31 37 41 43 47 53 55 59 61 67 71 73 77 83 85 89 91 97 ...
  • ...
  • 現在の配列の最初の要素を次のルディック数 L として取ります。
  • インデックスされた要素を、L 番目ごとに配列から削除します (最初の項目を含む)。
  • ...

--instructions--

与えられた数値以下のすべてのルディック数を返す関数を記述してください。

--hints--

ludic は関数とします。

assert(typeof ludic === 'function', '<code>ludic</code> should be a function.');

ludic(2) は配列を返す必要があります。

assert(Array.isArray(ludic(2)));

ludic(2)[1, 2] を返す必要があります。

assert.deepEqual(ludic(2), [1, 2]);

ludic(3)[1, 2, 3] を返す必要があります。

assert.deepEqual(ludic(3), [1, 2, 3]);

ludic(5)[1, 2, 3, 5] を返す必要があります。

assert.deepEqual(ludic(5), [1, 2, 3, 5]);

ludic(20)[1, 2, 3, 5, 7, 11, 13, 17] を返す必要があります。

assert.deepEqual(ludic(20), [1, 2, 3, 5, 7, 11, 13, 17]);

ludic(26)[1, 2, 3, 5, 7, 11, 13, 17, 23, 25] を返す必要があります。

assert.deepEqual(ludic(26), [1, 2, 3, 5, 7, 11, 13, 17, 23, 25]);

--seed--

--seed-contents--

function ludic(n) {

}

--solutions--

function ludic(n) {
  const makeArr = (s, e) => new Array(e + 1 - s).fill(s).map((e, i) => e + i);

  const filterAtInc = (arr, n) => arr.filter((e, i) => (i + 1) % n);

  const makeLudic = (arr, result) => {
    const iter = arr.shift();
    result.push(iter);
    return arr.length ? makeLudic(filterAtInc(arr, iter), result) : result;
  };

  const ludicResult = makeLudic(makeArr(2, n), [1]);

  return ludicResult;
}