--- id: 5949b579404977fbaefcd736 title: Ціле число "9 мільярдів імен Бога" challengeType: 5 forumTopicId: 302219 dashedName: 9-billion-names-of-god-the-integer --- # --description-- Це завдання є варіацією [оповідання Артура Кларка](https://en.wikipedia.org/wiki/The Nine Billion Names of God#Plot_summary "wp: The Nine Billion Names of God#Plot_summary"). (Той хто розв'язує завдання, має знати про наслідки виконання даного завдання.) Детальніше про те, що означає "name"(ім'я):
1 1 1 1 1 1 1 2 1 1 1 2 2 1 1 1 3 3 2 1 1Де рядки $n$ відповідають цілому числу $n$ і кожна колонка $C$ у рядку $m$ зліва направо відповідає кількості імен, які починаються з $C$. Зауважте, що сума $n$-го рядку $P(n)$ - це функція розбиття цілого числа. # --instructions-- Використовуйте функцію, що повертає суму $n$-го рядка. # --hints-- `numberOfNames` має бути функцією. ```js assert(typeof numberOfNames === 'function'); ``` `numberOfNames(5)` має дорівнювати 7. ```js assert.equal(numberOfNames(5), 7); ``` `numberOfNames(12)` має дорівнювати 77. ```js assert.equal(numberOfNames(12), 77); ``` `numberOfNames(18)` має дорівнювати 385. ```js assert.equal(numberOfNames(18), 385); ``` `numberOfNames(23)` має дорівнювати 1255. ```js assert.equal(numberOfNames(23), 1255); ``` `numberOfNames(42)` має дорівнювати 53174. ```js assert.equal(numberOfNames(42), 53174); ``` `numberOfNames(123)` має дорівнювати 2552338241. ```js assert.equal(numberOfNames(123), 2552338241); ``` # --seed-- ## --seed-contents-- ```js function numberOfNames(num) { return true; } ``` # --solutions-- ```js function numberOfNames(num) { const cache = [ [1] ]; for (let l = cache.length; l < num + 1; l++) { let Aa; let Mi; const r = [0]; for (let x = 1; x < l + 1; x++) { r.push(r[r.length - 1] + (Aa = cache[l - x < 0 ? cache.length - (l - x) : l - x])[(Mi = Math.min(x, l - x)) < 0 ? Aa.length - Mi : Mi]); } cache.push(r); } return cache[num][cache[num].length - 1]; } ```