Квадратные пирамидальные числа


28

A000330 - OEIS

задача

Ваша задача проста - сгенерировать последовательность, которая, учитывая индекс i, значение в этой позиции является суммой квадратов от 0до, iгде i >= 0.

Пример:

Input: 0
Output: 0           (0^2)

Input: 4
Output: 30          (0^2 + 1^2 + 2^2 + 3^2 + 4^2)

Input: 5
Output: 55          (0^2 + 1^2 + 2^2 + 3^2 + 4^2 + 5^2)

Спецификация:

  • Вы не можете вводить и выводить последовательность бесконечно;
  • Вы можете принимать Nи выводить Nthэлемент последовательности;
  • Вы можете взять Nи вывести первые Nэлементы последовательности.

2
Забавное наблюдение из OEIS: эта последовательность содержит ровно два идеальных квадрата:, f(1) == 1 * 1 (1)и f(24) == 70 * 70 (4900).
DJMcMayhem

Можем ли мы начать последовательность в f(1) = 1?
Emigna

@ Emigna извините, но нет, вам нужно начать с f(0) = 0. я указал, что на несколько ответов, которые не соответствовали этому требованию,
Фелипе Нарди Батиста,

f(0) = 0Требование разрушила несколько моих решений :(
Ataco

Ответы:



22

Python 2 , 22 байта

lambda n:n*~n*~(n*2)/6

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

При этом используется формула замкнутой формы n * (n + 1) * (2 * n + 1) / 6 . Код выполняет следующие операции:

  • Умножается на n ( n*):

    • Побитовое дополнение n ( ~n), что по существу означает -1-n .
    • И с помощью побитового дополнения 2n ( *~(n*2)), что означает -1-2n .
  • Делит на 6 ( /6).

Python 2 , 27 байт

f=lambda n:n and f(n-1)+n*n

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

Сохранено 1 байт благодаря Rod и 1 благодаря GB .


1
Это очень умно!
Скайлер


14

JavaScript (ES6), 16 байт

n=>n*(n+++n)*n/6

демонстрация

Как?

Выражение n+++nанализируется как n++ + n(1) . Не то чтобы это действительно n + ++nимело значение, потому что в этом случае тоже сработало бы.

Следовательно:

n*(n+++n)*n/6 =
n * (n + (n + 1)) * (n + 1) / 6 =
n * (2 * n + 1) * (n + 1) / 6

который оценивается как сумма (k = 0 ... n) (k²) .


(1) Это можно проверить, выполнив n='2';console.log(n+++n)которое дает целое число 5, тогда как n + ++nдаст строку '23'.




6

Brain-Flak , 34 байта

({(({}[()])()){({}[()])({})}{}}{})

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

Как это работает?

Изначально у меня была та же идея, что и у Райли 1, но было неправильно использовать нольер. Затем я понял, что

{({}[()])({})}{}

Вычисляет n 2 - n.

Зачем? Ну мы знаем

{({})({}[()])}{}

Вычисляет n 2 и повторяет n раз. Это означает, что если мы поменяем порядок двух нажатий, мы перейдем от увеличения суммы на n + (n-1) каждый раз к увеличению суммы на (n-1) + (n-1) каждый раз. Это уменьшит результат на единицу за цикл, делая наш результат n 2 - n. На верхнем уровне эта -n отменяется с помощью n, сгенерированного толчком, который мы обнуляли, облегчая необходимость обнуления и экономя нам два байта.

Brain-Flak , 36 байт

({({})(({}[()])){({})({}[()])}{}}{})

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

Вот еще одно решение: оно не такое уж и гольфовое, но довольно странное, поэтому я подумал, что оставлю это как вызов, чтобы выяснить, как это работает.

Если вы не в Brain-Flak, но вы все еще хотите, чтобы задача здесь, это как суммирование.

Картина


1: я придумал свое решение прежде, чем я посмотрел на ответы здесь. Так что никакого плагиата здесь нет.


Я знал, что должен быть способ сделать это, и у меня было чувство, что именно вы будете вычислять для этого математику.
Райли




2

Brain-Flak , 46 байтов

{(({})[()])}{}{({({})({}[()])}{}<>)<>}<>({{}})

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



@ Райли О, здорово :)
HyperNeutrino

Вместо того, чтобы помещать квадрат в альтернативный стек, вы можете суммировать его напрямую, оценивая и не нажимая его, а затем выталкивая весь цикл. Это изменит вашу вторую половину на ({{({})({}[()])}{}}{})и сэкономит вам 10 байтов. (Если это не имеет смысла, пингуйте меня в третьем стеке )
DJMcMayhem





2

R, 17 байт

sum((0:scan())^2)

Довольно просто, он использует тот факт , что ^(возведение в степень) является векторизованную в R .


1
(x=0:scan())%*%xкороче на байт, но я считаю, что вам нужно, catчтобы получить вывод.
Джузеппе

@ Giuseppe Я только что попробовал, и ваш код работает без cat, он выводит матрицу 1x1.
Руи Баррадас

@RuiBarradas Текущий мета-консенсус - это то, что catнеобходимо для того, чтобы квалифицироваться как полная программа. Если вы хотите изменить это, ответьте на этот вопрос и получите некоторую популярность среди других R людей на сайте.
Джузеппе

2

CJam , 9 байт

ri),_.*:+

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

объяснение

ri        e# Read input and convert to integer N.
  ),      e# Get range [0 1 2 ... N].
    _     e# Duplicate.
     .*   e# Pairwise products, giving [0 1 4 ... N^2].
       :+ e# Sum.

В качестве альтернативы:

ri),2f#:+

Это возводит в квадрат каждый элемент путем сопоставления 2#вместо использования попарных произведений. И просто для удовольствия другая альтернатива, которая становится неточной для больших входных данных, потому что она использует арифметику с плавающей точкой:

ri),:mh2#


2

Лабиринт , 11 байт

:!\
+ :
*:#

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

Печатает последовательность бесконечно.

объяснение

Указатель инструкции просто продолжает бегать вокруг квадрата кода снова и снова:

:!\    Duplicate the last result (initially zero), print it and a linefeed.
:      Duplicate the result again, which increases the stack depth.
#      Push the stack depth (used as a counter variable).
:*     Square it.
+      Add it to the running total.

2

Cubix , 15 байтов

Iu):^\+*p*6u@O,

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

Мой код немного грустный ):

Вычисляет n*(n+1)*(2n+1)/6

    I u
    ) :
^ \ + * p * 6 u
@ O , . . . . .
    . .
    . .

^Iu : read in input, u-turn
    : stack  n
:)\ : dup, increment, go right..oh, hey, it cheered up!
    : stack: n, n+1
+   : sum
    : stack: n, n+1, 2*n+1
*   : multiply
    : stack: n, n+1, 2*n+1, (n+1)*(2*n+1)
p   : move bottom of stack to top
    : stack: n+1, 2*n+1, (n+1)*(2*n+1), n
*   : multiply
6   : push 6
u   : right u-turn
,   : divide
O   : output
@   : terminate





2

Гексагония , 23 байта

?'+)=:!@/*"*'6/{=+'+}/{

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

объяснение

Развернутая:

   ? ' + )
  = : ! @ /
 * " * ' 6 /
{ = + ' + } /
 { . . . . .
  . . . . .
   . . . .

Это действительно просто линейная программа, /используемая для некоторого перенаправления. Линейный код:

?'+){=+'+}*"*'6{=:!@

Который вычисляет n (n + 1) (2n + 1) / 6 . Он использует следующие края памяти:

введите описание изображения здесь

Где точка памяти (MP) начинается с края, обозначенного n , указывающего на север.

?   Read input into edge labelled 'n'.
'   Move MP backwards onto edge labelled 'n+1'.
+   Copy 'n' into 'n+1'.
)   Increment the value (so that it actually stores the value n+1).
{=  Move MP forwards onto edge labelled 'temp' and turn around to face
    edges 'n' and 'n+1'.
+   Add 'n' and 'n+1' into edge 'temp', so that it stores the value 2n+1.
'   Move MP backwards onto edge labelled '2n+1'.
+   Copy the value 2n+1 into this edge.
}   Move MP forwards onto 'temp' again.
*   Multiply 'n' and 'n+1' into edge 'temp', so that it stores the value
    n(n+1).
"   Move MP backwards onto edge labelled 'product'.
*   Multiply 'temp' and '2n+1' into edge 'product', so that it stores the
    value n(n+1)(2n+1).
'   Move MP backwards onto edge labelled '6'.
6   Store an actual 6 there.
{=  Move MP forwards onto edge labelled 'result' and turn around, so that
    the MP faces edges 'product' and '6'.
:   Divide 'product' by '6' into 'result', so that it stores the value
    n(n+1)(2n+1)/6, i.e. the actual result.
!   Print the result.
@   Terminate the program.

Теоретически может быть возможно вписать эту программу в длину стороны 3, потому что /они не нужны для вычислений, :могут быть повторно использованы для завершения программы, а некоторые из них также '"=+*{могут быть многократно использованы, принося необходимое количество Команды ниже 19 (максимум для длины стороны 3). Я сомневаюсь, что можно найти такое решение вручную, если оно вообще существует.


2

> <> , 15 13 11 байт

Сохранено 2 байта благодаря Не дерево

0:n:l1-:*+!

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

Выводит последовательность бесконечно.


1
14 байтов (12 + 2 для -vфлага): ::1+:}+**6,n( Попробуйте онлайн! )
Не дерево

1
Или 11 байт (печатает всегда, начиная с N=1): попробуйте онлайн!
Не дерево

@Notatree: Очень хорошая идея использования l. Проверка с помощью OP, можно ли начинать с 1.
Emigna

@Notatree: К сожалению, нам не разрешено начинать с 1, но это все же экономит 2 байта. Благодарность!
Emigna

1
(Я должен упомянуть, что я получил lидею из ответа Лабиринта Мартина Эндера .)
Не дерево

2

Pyth , 7 5 байтов благодаря Стивену Н

s^R2h

Объяснение:

s^R2h       Full program - inputs from stdin and outputs to stdout
s           output the sum of
    h       range(input), with
 ^R2         each element squared

Мое первое решение

sm*ddUh

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

Объяснение:

sm*ddUh    Full program - inputs from stdin and outputs to stdout
s          sum of
 m   Uh    each d in range(input)
  *dd      squared

Разве в Пите нет встроенной площади?
Кэрд coinheringaahing

Не настолько, насколько я знаю ...
Дейв

Нет, там нет квадратного встроенного Pyth. Также 6 байтов
г-н Xcoder


Исправлено с +1 байтом к каждому ответу, я буду редактировать, как только выйду из мобильного телефона.
Дейв




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