Quadratische Pyramidenzahlen


28

A000330 - OEIS

Aufgabe

Ihre Aufgabe ist einfach: Generieren Sie eine Sequenz, bei der ider Wert für diese Position bei gegebenem Index die Summe der Quadrate von 0bis zu iwo ist i >= 0.

Beispiel:

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)

Spezifikation:

  • Sie können keine Eingabe vornehmen und die Sequenz auf unbestimmte Zeit ausgeben.
  • Sie können Ndas NthElement der Sequenz eingeben und ausgeben .
  • Sie können Ndie ersten NElemente der Sequenz eingeben und ausgeben .

2
Spaßbeobachtung von OEIS: Diese Sequenz enthält genau zwei perfekte Quadrate:, f(1) == 1 * 1 (1)und f(24) == 70 * 70 (4900).
DJMcMayhem

Dürfen wir die Sequenz um beginnen f(1) = 1?
Emigna

@Emigna sorry aber nein, du musst bei anfangen f(0) = 0. Ich habe darauf hingewiesen, dass auf die wenigen Antworten, die diese Anforderung nicht erfüllten
Felipe Nardi Batista

Die f(0) = 0Anforderung hat einige meiner Lösungen ruiniert :(
ATaco

Antworten:



22

Python 2 , 22 Bytes

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

Probieren Sie es online!

Dies verwendet die geschlossene Formel n * (n + 1) * (2 * n + 1) / 6 . Der Code führt die folgenden Vorgänge aus:

  • Multipliziert n mit ( n*):

    • Das bitweise Komplement von n ( ~n), was im Wesentlichen -1-n bedeutet .
    • Und durch das bitweise Komplement von 2n ( *~(n*2)), was -1-2n bedeutet .
  • Dividiert durch 6 ( /6).

Python 2 , 27 Bytes

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

Probieren Sie es online!

1 Byte dank Rod und 1 dank GB gespeichert .


1
Das ist sehr schlau!
Skyler


14

JavaScript (ES6), 16 Byte

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

Demo

Wie?

Der Ausdruck n+++nwird als n++ + n(1) analysiert . Nicht, dass es wirklich darauf ankommt, denn das n + ++nwürde auch in diesem Fall funktionieren.

Deshalb:

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

die auswertet , um sum (k = 0 ... n) (K²) .


(1) Dies kann überprüft werden, indem getan wird n='2';console.log(n+++n), was die ganze Zahl ergibt 5, wohingegen n + ++ndie Zeichenfolge ergeben würde '23'.




6

Brain-Flak , 34 Bytes

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

Probieren Sie es online!

Wie funktioniert es?

Anfangs hatte ich die gleiche Idee wie Riley 1, aber es fühlte sich falsch an, einen Nuller zu verwenden. Das habe ich dann gemerkt

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

Berechnet n 2 - n.

Warum? Nun, wir wissen es

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

Berechnet n 2 und schleift n-mal. Das heißt, wenn wir die Reihenfolge der beiden Schübe ändern, erhöhen wir die Summe jedes Mal um n + (n-1) und erhöhen die Summe jedes Mal um (n-1) + (n-1). Dies verringert das Ergebnis um eins pro Schleife, wodurch unser Ergebnis n 2 - n wird. Auf der obersten Ebene hebt dieses -n das durch den Push erzeugte n auf, den wir auf Null gesetzt haben, wodurch die Notwendigkeit eines Nullstellers verringert und uns zwei Bytes erspart wurden.

Brain-Flak , 36 Bytes

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

Probieren Sie es online!

Hier ist eine andere Lösung, es ist nicht so golfen, aber es ist ziemlich seltsam, also dachte ich, ich würde es als Herausforderung belassen, herauszufinden, wie es funktioniert.

Wenn Sie nicht auf Brain-Flak stehen, aber dennoch die Herausforderung suchen, ist dies eine Summe.

Bild


1: Ich habe mir eine Lösung ausgedacht, bevor ich mir die Antworten hier angesehen habe. Also hier kein Plagiat.


Ich wusste, dass es einen Weg geben musste, dies zu tun, und ich hatte das Gefühl, dass Sie derjenige sein würden, der die Mathematik dafür herausfinden würde.
Riley




2

Brain-Flak , 46 Bytes

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

Probieren Sie es online!



@ Riley Ooh schön :)
HyperNeutrino

Anstatt das Quadrat auf den alternativen Stapel zu schieben, können Sie es direkt summieren, indem Sie es auswerten und nicht schieben und stattdessen die gesamte Schleife schieben. Dies ändert Ihre zweite Hälfte in ({{({})({}[()])}{}}{})und spart Ihnen 10 Bytes. (Wenn das keinen Sinn ergibt, ping mich in den dritten Stapel )
DJMcMayhem





2

R, 17 Bytes

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

Ziemlich einfach, es nutzt die Tatsache, dass ^(Potenzierung) in R vektorisiert ist .


1
(x=0:scan())%*%xist um ein Byte kürzer, aber ich glaube, Sie brauchen eine cat, um die Ausgabe zu bekommen.
Giuseppe

@ Giuseppe Ich habe es gerade ausprobiert und dein Code funktioniert auch ohne cat, er gibt eine 1x1 Matrix aus.
Rui Barradas

@RuiBarradas Derzeitiger Metakonsens ist, dass dies caterforderlich ist, um sich als vollständiges Programm zu qualifizieren. Wenn Sie das ändern möchten, beantworten Sie diese Frage und finden Sie eine gewisse Unterstützung bei den anderen R-Leuten auf der Site.
Giuseppe

2

CJam , 9 Bytes

ri),_.*:+

Probieren Sie es online!

Erläuterung

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.

Alternative:

ri),2f#:+

Dies quadriert jedes Element durch Mapping, 2#anstatt paarweise Produkte zu verwenden. Und nur zum Spaß eine weitere Alternative, die bei großen Eingaben ungenau wird, weil sie Gleitkomma-Arithmetik verwendet:

ri),:mh2#


2

Labyrinth , 11 Bytes

:!\
+ :
*:#

Probieren Sie es online!

Druckt die Sequenz auf unbestimmte Zeit.

Erläuterung

Der Befehlszeiger läuft immer und immer wieder um das Quadrat des Codes:

:!\    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 Bytes

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

Probieren Sie es online!

Mein Code ist ein bisschen traurig ):

Berechnet 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

Hexagony , 23 Bytes

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

Probieren Sie es online!

Erläuterung

Entfaltet:

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

Dies ist eigentlich nur ein lineares Programm mit der /für einige Umleitungen verwendeten Funktion. Der lineare Code lautet:

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

Was berechnet n (n + 1) (2n + 1) / 6 . Es verwendet die folgenden Speicherflanken:

Bildbeschreibung hier eingeben

Wo der Speicherpunkt (MP) an der mit n bezeichneten Kante beginnt und nach Norden zeigt.

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

Theoretisch könnte es möglich sein, dieses Programm in die Seitenlänge 3 einzufügen, da /sie für die Berechnung nicht benötigt :werden, zum Beenden des Programms wiederverwendet werden können und einige '"=+*{davon auch wiederverwendbar sind, was die Anzahl der erforderlichen Programme mit sich bringt Befehle unter 19 (das Maximum für Seitenlänge 3). Ich bezweifle, dass es möglich ist, eine solche Lösung von Hand zu finden, wenn überhaupt eine existiert.


2

> <> , 15 13 11 Bytes

2 Bytes gespart dank Not a tree

0:n:l1-:*+!

Probieren Sie es online!

Gibt die Sequenz auf unbestimmte Zeit aus.


1
14 Bytes (12 + 2 für -vFlagge): ::1+:}+**6,n( Versuchen Sie es online! )
Kein Baum

1
Oder 11 Bytes (druckt für immer ab N=1): Probieren Sie es online!
Kein Baum

@Notatree: Sehr nette Idee mit l. Erkundigen Sie sich bei OP, ob es in Ordnung ist, um 1
Uhr

@Notatree: Leider dürfen wir nicht bei 1 beginnen, aber es werden trotzdem 2 Bytes eingespart. Vielen Dank!
Emigna

1
(Ich sollte erwähnen, dass ich die lIdee von Martin Enders Labyrinth-Antwort erhalten habe .)
Kein Baum

2

Pyth , 7 5 Bytes dank Steven H.

s^R2h

Erläuterung:

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

Meine erste Lösung

sm*ddUh

Probieren Sie es online!

Erläuterung:

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

Ist in Pyth kein Platz eingebaut?
Caird Coinheringaahing

Soweit ich weiß nicht ...
Dave

Nein, es gibt kein Quadrat eingebautes Pyth. Auch 6 Bytes
Mr. Xcoder


Fixierbar mit +1 Byte für jede Antwort. Ich bearbeite sie, sobald ich das Handy verlasse.
Dave




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.