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


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..]

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

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


Как вы думаете, мое редактирование улучшает форматирование, или это только в моем браузере?
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. Смотрите мой пакетный ответ.
Нил


Благодарю. Я не думал, что это может быть так просто.
ГБ





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 Деление на ноль - ошибка.
Эрик 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 :

лестница


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]

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

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


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.


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

1
Вы все еще можете избавиться от брекетов! {}
Джузеппе

замена [0: k] досталась мне, и я забыл о скобках :)
NofP


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
}






1

Clojure, 54 байта

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

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


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)))

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.