прохолодна без назви послідовність


19

Визначимо f n (k) як суму першого k доданків натуральних чисел [1, ∞), де кожне число повторюється n разів.

k       | 0    1    2    3    4    5    6    7    8    9
--------+-------------------------------------------------
f_1(k)  | 0    1    3    6    10   15   21   28   36   45
deltas  |   +1   +2   +3   +4   +5   +6   +7   +8   +9
--------+-------------------------------------------------
f_2(k)  | 0    1    2    4    6    9    12   16   20   25
deltas  |   +1   +1   +2   +2   +3   +3   +4   +4   +5
--------+-------------------------------------------------
f_3(k)  | 0    1    2    3    5    7    9    12   15   18
deltas  |   +1   +1   +1   +2   +2   +2   +3   +3   +3

Антидіагоналі цього квадратного масиву аналогічні послідовності OEIS A134546 .

Виклик

Напишіть програму / функцію, яка приймає два невід’ємні цілі числа n та k та виводить f n (k) .

Технічні умови

  • Стандартні правила вводу / виводу Застосовуються .
  • Стандартні лазівки будуть заборонені .
  • Ваше рішення може бути 0-індексованим або 1-індексованим для n та / або k, але вкажіть, який саме.
  • Ця задача полягає не у пошуку найкоротшого підходу на всіх мовах, а у пошуку найкоротшого підходу в кожній мові .
  • Ваш код буде набраний у байтах , як правило, в кодуванні UTF-8, якщо не вказано інше.
  • Вбудовані функції, які обчислюють цю послідовність, дозволені, але включається рішення, яке не покладається на вбудований.
  • Пояснення навіть для "практичних" мов заохочуються .

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

У цих тестових випадках n є 1-індексованим і k 0-індексованим.

n   k      fn(k)

1   2      3
2   11     36
11  14     17
14  21     28
21  24     27
24  31     38
31  0      0

У кількох кращих форматах:

1 2
2 11
11 14
14 21
21 24
24 31
31 0

1, 2
2, 11
11, 14
14, 21
21, 24
24, 31
31, 0

Довідкова реалізація

Про це написано в Haskell .

f n k = sum $ take k $ replicate n =<< [1..]

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

Цей виклик був пісочницею.


Ви вважаєте, що моя редакція покращує форматування, чи це просто у моєму браузері?
користувач202729

@ user202729 Хе ... це виглядає на моєму браузері, але я сумніваюся, що моє форматування виглядало добре у більшості браузерів ... Я просто триматиму його так, воно не втрачає жодного значення. Просто дивно виглядає. : P
повністюлюдський

Чи потрібно нам обробляти справу f_n(0) = 0для k0-індексованих?
Cinaski


3
@Fabian Ні, ви підсумовуєте лише перші kтерміни зі списку повторних натуральних чисел, а не перші n*k.
Мартін Ендер

Відповіді:


12

Рубі , 32 28 23 байти

->n,k{k.step(0,-n).sum}

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

Пояснення

Візуалізуємо суму як площу трикутника, наприклад, з n = 3 і k = 10:

*
*
*
**
**
**
***
***
***
****

Потім ми підсумовуємо за стовпцем замість рядка: перший стовпець - це k, потім k-n, k-2nі так далі.


8

Python 2 , 34 28 байт

lambda n,k:(k+k%n)*(k/n+1)/2

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

Дякую Мартіну Ендеру, Нілу та містеру Xcoder за допомогу.


1
Вам насправді k/nвсе одно не потрібно - k-(k/n)*nце просто k%n. Дивіться мою відповідь партії.
Ніл


Спасибі. Я не думав, що це може стати таким простим.
ГБ



5

Математика, 40 байт

Tr@Sort[Join@@Range@#2~Table~#][[;;#2]]&

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

Tr[Range@(s=⌊#2/#⌋)]#+#2~Mod~#(s+1)&

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

Математика, 18 байт

Мартін Ендер

Tr@Range[#2,0,-#]&

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

n~Sum~{n,#2,0,-#}&

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


2
Tr@Range[#2,0,-#]&або n~Sum~{n,#2,0,-#}&скориставшись хитрістю з відповіді Ruby від GB.
Мартін Ендер


5

Желе , 5 байт

Rxḣ³S

Ще один байт, ніж рішення @ Mr.Xcoder's Jelly, але це моє перше в історії подання в Jelly, і я все ще плутаюся з приводу того, як мовчазність Jelly вибирає операнди, тому я все ще задоволений. Зверніть увагу на порядок входів kтодіn .

Пояснення

Rxḣ³S
R           Range: [1,2,...,k]
 x          Times: repeat each element n times: [1,1,1,2,2,2,...,n,n,n]
  ḣ³        Head: take the first k elements. ³ returns the first argument.
    S       Sum

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


4

Желе , 4 байти

1-індексований

Ḷ:‘S

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


Ви можете зробити індексацію 0, тому я думаю, що Ḷ:Sтакож працює
dylnan

@dylnan Насправді я не думаю, що це означає 0-індексований тут. Я відкотився назад і побачимо
містер Xcoder

@dylnan Поділ на нуль - це помилка.
Erik the Outgolfer

4

JavaScript (ES6),  24  21 байт

Здійснює введення в синтаксис currying (n)(k). Повертається falseзамість0 .

n=>g=k=>k>0&&k+g(k-n)

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

Як?

n =>             // main unamed function taking n
  g = k =>       // g = recursive function taking k
    k > 0 &&     // if k is strictly positive:
      k +        //   add k to the final result
      g(k - n)   //   subtract n from k and do a recursive call

Це схоже на відповідь Ruby @ GB .

Завдання описує, як побудувати "сходи" зліва направо, тоді як ця рекурсивна функція будує її знизу вгору. При n = 2 і k = 11 :

staircase


3

Пакет, 34 байти

@cmd/cset/a(%2+%2%%%1)*(%2/%1+1)/2

Формула закритої форми, яку я знайшов. Перший аргумент n1-індексований, другий аргумент k0-індексований.




3

C, 38 34 байт

Рекурсивне визначення.

-4 байти завдяки Steadybox .

f(n,k){return k--?1+f(n,k)+k/n:0;}

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


32 байти містера Xcoder , ГБ

f(n,k){return(k+k%n)*(k/n+1)/2;}

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



1
Використовуючи підхід ГБ, 32 байти
Містер Xcoder

tio.run/… -> 28 байт
GB

1
34 байти (рекурсивна версія): f(n,k){return k--?1+f(n,k)+k/n:0;} Спробуйте в Інтернеті!
Steadybox

3

R , 37 33 31 байт

-6 байт завдяки Джузеппе

function(n,k)sum(rep(1:k,,k,n))

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

Нічого фантазійного. У [0:k]обробляє випадок , коли до = 0.


1
Ви можете позбутися від брекетів тут. Якщо ви використовуєте аргументи на замовлення rep.default, ви можете позбутися [0:k], використовуючи, rep(1:k,,k,n)але тоді ваша відповідь, головним чином, rturnbull's, але з базовою R, а неR + pryr
Джузеппе

1
Ще можна позбутися брекетів! {}
Джузеппе

заміна [0: k] отримала мене, і я забув про брекети :)
NofP


2

J , 13 байт

1#.]{.(#1+i.)

Як це працює:

Лівий аргумент - n, правий - k.

i. створює список 0..k-1

1+ додає одне до кожного номера списку, пожовтаючи 1,2, ..., k

# утворює гачок із зазначеним вище, тому копіюються n копій кожного елемента списку.

]{. візьміть першу n з них

1#. знайти їх суму за базовим перерахунком.

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


Мені подобається гачок.
cole

2

Сітківка , 29 26 байт

\d+
$*
(?=.*?(1+)$)\1
$'
1

Спробуйте в Інтернеті! Посилання включає тестові випадки та заголовок, щоб переформатувати їх на бажаний вхід (0-індексований kперший, 1-індексований nдругий). Мене надихнула відповідь Рубі @ GB. Пояснення:

\d+
$*

Перетворити в одинарне.

(?=.*?(1+)$)\1
$'

Збігайте кожен рядок nусередині kі замініть його всім після матчу. Це k-n, k-2n, k-3n, але nтакож після матчу, так що ви отримаєте k, k-n, і k-2nт.д. Це також відповідає n, який легко видаляється (він більше не потрібний).

1

Підсумуйте результати та перетворіть на десяткові.



2

Perl 6 , 39 байт

->\n,\k{(0,{|($_+1 xx n)}...*)[^k].sum}

Перевірте це

n і k обидва 1 засновані

Розширено:

-> \n, \k { # pointy block lambda with two parameters 「n」 and 「k」

  ( # generate the sequence

    0,         # seed the sequence (this is why 「k」 is 1-based)

    {          # bare block lambda with implicit parameter 「$_」
      |(       # slip this into outer sequence
        $_ + 1 # the next number
        xx n   # repeated 「n」 times (this is why 「n」 is 1-based)
      )
    }

    ...        # keep doing that until

    *          # never stop

  )[ ^k ]      # get the first 「k」 values from the sequence
  .sum         # sum them
}






1

Clojure, 54 байти

#(nth(reductions +(for[i(rest(range))j(range %)]i))%2)

Другий аргумент k0-індексований, так (f 14 20)само 28.


1

APL + WIN, 13 байт

+/⎕↑(⍳n)/⍳n←⎕

Підказки для екранного введення для n, а потім для k. Походження індексу = 1.



1

Japt , 7 6 байт

Спочатку натхненний рішенням ГБ і перетворився на порт!

Приймається kяк перший вхід і nяк другий.

õ1Vn)x

Спробуй це


Пояснення

Неявне введення цілих чисел U=k& V=n. Створіть масив цілих чисел ( õ) від 1до Uз кроком Vнегативу ( n) та зменшіть його додаванням ( x).


1

R , 27 байт

Анонімна функція, яка приймає kі nв тому порядку. Створює список довжини k(третій аргумент до rep), який складається з 1через k(перший аргумент до rep), повторюючи кожен nраз елементи (четвертий аргумент до rep). Потім бере суму цього списку.

nє 1-індексованим і k0-індексованим. Повертає помилку для n<1.

pryr::f(sum(rep(1:k,,k,n)))

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.