Рекурсивно з'єднані сукупні суми [N] з M ітераціями


14

Візьміть два натуральних числа Nі Mстворіть з’єднані сукупні суми [N]з Mітераціями. Виведіть результат останньої ітерації.

Визначення об'єднаної сукупної суми:

  1. Почніть з числа Nі визначте послідовністьX = [N]
  2. Додайте до Xсукупних сумX
  3. Повторіть крок 2 Mрази.

Сукупна сума вектора, X = [x1, x2, x3, x4]є: [x1, x1+x2, x1+x2+x3, x1+x2+x3+x4].

Приклад із N = 1та M = 4:

P = функція сукупної суми.

M = 0: [1]
M = 1: [1, 1]                    -  X = [1, P(1)] = [[1], [1]]      
M = 2: [1, 1, 1, 2]              -  X = [X, P(X)] = [[1, 1], [1, 2]]
M = 3: [1, 1, 1, 2, 1, 2, 3, 5]  -  X = [X, P(X)] = [[1, 1, 1, 2], [1, 2, 3, 5]]
M = 4: [1, 1, 1, 2, 1, 2, 3, 5, 1, 2, 3, 5, 6, 8, 11, 16]

Зауважте, що перший X = [1]не вважається ітерацією. Ви можете взяти M = 5для наведеного вище прикладу (таким чином, рахуючи X = [1]як одну ітерацію).

Це OEIS A107946


Тестові приклади:

N = 5, M = 1
5, 5

N = 2, M = 3
2, 2, 2, 4, 2, 4, 6, 10

N = 4, M = 6
4, 4, 4, 8, 4, 8, 12, 20, 4, 8, 12, 20, 24, 32, 44, 64, 4, 8, 12, 20, 24, 32, 44, 64, 68, 76, 88, 108, 132, 164, 208, 272, 4, 8, 12, 20, 24, 32, 44, 64, 68, 76, 88, 108, 132, 164, 208, 272, 276, 284, 296, 316, 340, 372, 416, 480, 548, 624, 712, 820, 952, 1116, 1324, 1596

Це , тому найкоротший код виграє. Необов’язкові формати введення та виведення.


Зараз трохи пізно, але чи Nсправді щось додає до проблеми? Це просто постійний коефіцієнт, на який ви множите результат.
— Мартін Ендер

Відповіді:


7

Haskell , 35 байт

n!m=iterate((++)<*>scanl1(+))[n]!!m

Спробуйте в Інтернеті!

Завдяки H.PWiz за -18 байт


tail.scanl(+)0може бутиscanl1(+)
— H.PWiz

@ H.PWiz Спасибі, я завжди забуваю про *1версії scanта fold.
— Мего


1
35 байт з використаннямiterate
— H.PWiz

Я просто збираюся відмовитися від пояснення - занадто багато зусиль, щоб змінювати його кожен раз: P
— Мего


6

Лушпиння , 9 8 7 байт

Завдяки H.PWiz за збереження 1 байта.

!¡S+G+;

Спробуйте в Інтернеті!

Використовується на основі 1 M.

Пояснення

      ;     Wrap N in a list to get [N].
 ¡          Iterate the following function on this list and collect
            the results in an infinite list.
  S+        Concatenate the current value with...
    G+      ...the cumulative sum. We're not using the cumsum built-in ∫ 
            because it prepends a zero.
!           Use M as an index into the infinite list.

Чи був також мій підхід, я не впевнений, чи це пограбування. Крім того , я вже запропонував для cumsumне повертати провідне 0(що - то , що допоможе заощадити 2 байта в даному випадку).
— Ерік Аутгольфер

Може ot∫бути G+?
— H.PWiz

@ H.PWiz Хм ... документи виглядають незрозумілими щодо цього (AFAIK "сканування" означає "зменшити" не "кумулятивне зменшення").
— Ерік Аутгольфер

Fє зменшення G- це кумулятивне зменшення
— H.PWiz

5

MATL , 6 байт

:"tYsh

Входи M, а потім N.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

:"      % Implicitly input M. Do the following M times
  t     %   Implicitly input N the first time. Duplicate
  Ys    %   Cumulative sum
  h     %   Concatenate horizontally
        % Implicitly end loop. Implicitly display stack

3
Whaaaaat? Я впевнений, що пробував це 100 разів. Я навіть спробував перейти на сайт Сьювера, щоб переконатися, що це не якась дивна помилка в TIO ... Я цього зовсім не розумію ...
— Стюі Гріффін

2
Я не можу перестати думати про це ... Я абсолютно впевнений, що писав ці точні символи знову і знову і намагався запустити його на двох різних сайтах, без успіху. Оскільки це не може бути так, єдине пояснення, що залишилося - це я божеволію ... Це справді псується з головою!
— Стюі Гріффін


3

Python 2 , 83 78 75 71 65 63 60 байт

def f(n,m):r=n,;exec"s=0\nfor c in r:s+=c;r+=s,\n"*m;print r

Спробуйте в Інтернеті!

Збережено 6 8 байт завдяки Роду
Збережено 3 байти завдяки Еріку


@Rod Більше дякую: D
— TFeld

Вам не потрібно [:], rє tuple.
— Ерік Аутгольфер

@EriktheOutgolfer, спасибі, це залишилося від того, коли r був у списку
— TFeld

3

Діалог APL , 12 байт

{(⊢,+\)⍣⍺⊢⍵}

Бере N з правого боку і M з лівого. СпробуйтеAPL тут!

Пояснення:

{(⊢,+\)⍣⍺⊢⍵}
{          } an anonymous function
 (⊢,+\)      a train for a single iteration:
  ⊢           the right argument
   ,          concatenated with
    +\        the cumulative sum 
       ⍣     repeated
        ⍺     left argument times
         ⊢⍵  on the right argument

Любіть пояснення. Дуже ясно, що відбувається. Важко зрозуміти APL інакше: P
— Емінья





0

JavaScript (ES6), 55 54 байти

Здійснює введення в синтаксис currying (m)(n).

m=>g=a=>m--?g([...a=+a?[a]:a,...a.map(x=>s+=x,s=0)]):a

Тестові справи


0

Желе , 5 байт

;+\$¡

Спробуйте в Інтернеті!

Пропонована версія Dennis (повертається nзамість [n]масивів Singleton).


Wі ⁹можуть бути видалені.
— Денніс

@ Денніс Боюся, що результат не буде правильним тоді? Я подумав про це, але якщо я отримаю вхідні дані 1і 0боюся, що повернусь 1замість цього, [1]якщо я видалю їх, і я не можу використовувати повну програму замість цього, оскільки його результат все одно буде таким.
— Ерік Аутгольфер

1це те, як Jelly відображає масив [1]. Я не бачу проблем з цим.
— Денніс

@ Деніс Хм ... трохи підозріло до цього (як я вже говорив в останній частині свого коментаря вище) ... чи існує якийсь консенсус, який це дозволяє, чи це вважатиметься "стандартною лазівкою, що зловживає типами даних"?
— Erik the Outgolfer

Обидва формати нормально.
— CG.

0

Clojure, 67 байт

#(loop[c[%]i %2](if(= i 0)c(recur(into c(reductions + c))(dec i))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.