классная безымянная последовательность чтоли

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

Ссылочная реализация

Это написано на Хаскеле .

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

Попробуйте онлайн!

Этот вызов был изолирован.

totallyhuman
источник
Как вы думаете, мое редактирование улучшает форматирование, или это только в моем браузере?
user202729
@ user202729 Хех ... в моем браузере это выглядит неприлично, но я сомневаюсь, что мое форматирование выглядело хорошо в большинстве браузеров ... Я просто сохраню это так, оно не теряет никакого значения. Просто выглядит странно. : P
полностью человек
Нужно ли обрабатывать регистр f_n(0) = 0для k0-index?
Чинаски
9
" крутая безымянная последовательность вещей " Lol, я не единственный, кому трудно придумывать названия для последовательностей, которые я придумал, я вижу ..;)
Кевин Круйссен
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

Попробуйте онлайн!

Спасибо Мартину Эндеру, Нилу и мистеру Кскодеру за помощь.

гигабайт
источник
1
Тебе на самом деле k/nвсе равно не нужно - k-(k/n)*nэто просто k%n. Смотрите мой пакетный ответ.
Нил
28 байтов
г-н Xcoder
Благодарю. Я не думал, что это может быть так просто.
ГБ
8

Шелуха , 4 байта

Σ↑ṘN

Попробуйте онлайн!

объяснение

Это просто заканчивается прямым переводом эталонной реализации задачи:

   N  Start from the infinite sequence of all natural numbers.
  Ṙ   Replicate each element n times.
 ↑    Take the first k values.
Σ     Sum them.
Мартин Эндер
источник
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

Попробуйте онлайн!

dylnan
источник
4

Желе , 4 байта

1-индексированных

Ḷ:‘S

Попробуйте онлайн! или посмотрите набор тестов .

Мистер Xcoder
источник
Вы можете сделать 0 индексации, поэтому я думаю, что Ḷ:Sтакже работает
Dylnan
@dylnan На самом деле я не думаю, что это означает 0-индексированный здесь. Я откатился, и посмотрим
мистер Xcoder
@dylnan Деление на ноль - ошибка.
Эрик Outgolfer
4

JavaScript (ES6),  24  21 байт

Принимает ввод в синтаксисе карри (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 :

лестница

Arnauld
источник
3

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

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

Формула замкнутой формы, которую я нашел. Первый аргумент nиндексируется 1, второй аргумент kиндексируется 0.

Нил
источник
3

Haskell , 28 байт

n#k|m<-k`mod`n=sum[m,m+n..k]

Попробуйте онлайн!

Подход, который я нашел, просто поковырявшись с некоторыми параметрами диапазона. Определенно не самый короткий, но довольно круто, как много разных подходов.

totallyhuman
источник
3

C, 38 34 байта

Рекурсивное определение.

-4 байта благодаря Steadybox .

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

Попробуйте онлайн!


32 байта от Mr. Xcoder , GB

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

Попробуйте онлайн!

Колера Су
источник
1
Используя подход GB, 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.

NofP
источник
1
Вы можете избавиться от брекетов здесь. Если вы используете порядковые аргументы для rep.default, вы можете избавиться [0:k]с помощью, rep(1:k,,k,n)но тогда ваш ответ в основном будет rturnbull, но с базовым R, а неR + pryr
Giuseppe
1
Вы все еще можете избавиться от брекетов! {}
Джузеппе
замена [0: k] досталась мне, и я забыл о скобках :)
NofP
2

C ++, 53 байта

Просто используйте формулу. n1 индексируется и k0 индексируется.

[](int n,int k){return k/n*(k/n+1)/2*n+k%n*(k/n+1);};

Попробуйте онлайн!

Колера Су
источник
Сохраните пару байтов, злоупотребляя ~оператором. [](int n,int k){return-k/n*~(k/n)/2*n-k%n*~(k/n);};
потолок кошка
2

J , 13 байт

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

Как это устроено:

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

i. генерирует список 0..k-1

1+ добавляет один к каждому номеру списка, кричащий 1,2, ..., k

# образует зацепку с вышеперечисленным, поэтому копируются n копий каждого элемента списка.

]{. возьмите первые n из них

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

Попробуйте онлайн!

Гален Иванов
источник
Мне нравится крючок.
Коул
2

Сетчатка , 29 26 байт

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи и заголовок, чтобы переформатировать их в свой предпочтительный ввод (0-индексированный kпервый, 1-индексированный nвторой). Я был вдохновлен ответом Ruby от @ 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

Expanded:

-> \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
}
Брэд Гилберт b2gills
источник
1

05AB1E , 9 байтов

FL`}){I£O

Попробуйте онлайн!

объяснение

F           # n times do
 L`         # pop top of stack (initially k), push 1 ... topOfStack
   }        # end loop
    )       # wrap stack in a list
     {      # sort the list
      I£    # take the first k elements
        O   # sum
Emigna
источник
1

Clojure, 54 байта

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

2-й аргумент kимеет индекс 0, а также (f 14 20)28.

NikoNyrh
источник
1

APL + WIN, 13 байт

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

Запрашивает ввод с экрана для n и затем для k. Индекс происхождения = 1.

Грэхем
источник
1

Japt , 7 6 байт

Первоначально вдохновлен решением GB и превратился в порт!

Принимает kкак первый вход, так и nвторой.

õ1Vn)x

Попытайся


объяснение

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

мохнатый
источник
1

р , 27 байт

Анонимная функция, которая принимает kи nв этом порядке. Создает список длины k(третий аргумент в rep), который состоит из 1сквозного k(первый аргумент в rep), повторяя каждый элементn раз (четвертый аргумент вrep ). Затем берет сумму этого списка.

n1 индексируется и k0 индексируется. Возвращает ошибку для n<1.

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

Попробуйте онлайн!

rturnbull
источник
1

Befunge, 27 байт

&::00p&:10p%+00g10g/1+*2/.@

Попробуйте онлайн

Принимает k затем n в качестве ввода. Использует ответ ГБ в качестве своей математической основы.

Джо Кинг
источник