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

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 .

Мистер Xcoder
источник
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'.

Arnauld
источник
6

Brain-Flak , 36 байт

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

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

# Main algorithm
(                                  )  # Push the sum of:
                {({})({}[()])}{}      #   The square of:
 {                              }     #     0 to i 

# Stuff for the loop
  <(({}[()])())>                      # Push i-1, i without counting it in the sum
                                 {}   # Pop the counter (0)
Райли
источник
Красиво сделано! :) Я придумал ({<(({}))>{({})({}[()])}{}<({}[()])>})для 38
DJMcMayhem
34 байта;)
Пшеничный волшебник
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
источник
@ Райли О, здорово :)
HyperNeutrino
Вместо того, чтобы помещать квадрат в альтернативный стек, вы можете суммировать его напрямую, оценивая и не нажимая его, а затем выталкивая весь цикл. Это изменит вашу вторую половину на ({{({})({}[()])}{}}{})и сэкономит вам 10 байтов. (Если это не имеет смысла, пингуйте меня в третьем стеке )
DJMcMayhem
2

CJam , 10 байтов

ri),{_*+}*

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

ri            e# Input integer n
  )           e# Add 1
   ,          e# Range [0 1 ... n]
    {   }*    e# Fold (reduce)
     _        e# Duplicate
      *       e# Multiply
       +      e# Add
Луис Мендо
источник
Как насчет ri),_.*:+или ri),2f#:+?
Мартин Эндер
@ Мартин Хорошая идея! Я думаю, что вы должны опубликовать это как другой ответ
Луис Мендо
2

APL (Dyalog) , 7 5 байтов

2 байта сохранены благодаря @Mego

+.×⍨⍳

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

Как?

- диапазон

+.× - скалярное произведение

- с собой

Уриэль
источник
@ Уриэль, мой плохой, я думал, что ¨⍳это необходимо
Фелипе Нарди Батиста,
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

Юлия , 16 14 байтов

2 байта сохранены благодаря @MartinEnder

!n=(x=1:n)⋅x

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

Как?

(x=1:n)создает диапазон 1для nи назначить x, точка продукта с x.

Уриэль
источник
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

Giuseppe
источник
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-:*+!

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

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

Emigna
источник
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
5 байт .
Стивен Х.
Исправлено с +1 байтом к каждому ответу, я буду редактировать, как только выйду из мобильного телефона.
Дейв
1

Нейм , 3 байта

𝐈ᛦ𝐬

Это могло быть проблемой, чтобы продемонстрировать встроенные в Neim полигональные числа, но, очевидно, нет.

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

Okx
источник