Nombres pyramidaux carrés


28

A000330 - OEIS

Tâche

Votre tâche est simple, générez une séquence qui, étant donné l'index i, la valeur à cette position est la somme des carrés de 0jusqu'à ii >= 0.

Exemple:

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)

Spécification:

  • Vous ne pouvez prendre aucune entrée et sortir la séquence indéfiniment;
  • Vous pouvez entrer Net sortir l' Nthélément de la séquence;
  • Vous pouvez entrer Net sortir les premiers Néléments de la séquence.

2
Observation amusante d'OEIS: Cette séquence contient exactement deux carrés parfaits:, f(1) == 1 * 1 (1)et f(24) == 70 * 70 (4900).
DJMcMayhem

Pouvons-nous commencer la séquence à f(1) = 1?
Emigna

@Emigna désolé mais non, vous devez commencer f(0) = 0. je l'ai souligné que pour les quelques réponses qui ont échoué à cette exigence
Felipe Nardi Batista

L' f(0) = 0exigence a ruiné quelques-unes de mes solutions :(
ATaco

Réponses:



22

Python 2 , 22 octets

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

Essayez-le en ligne!

Il utilise la formule fermée n * (n + 1) * (2 * n + 1) / 6 . Le code effectue les opérations suivantes:

  • Multiplie n par ( n*):

    • Le complément au niveau du bit de n ( ~n), ce qui signifie essentiellement -1-n .
    • Et par le complément au niveau du bit de 2n ( *~(n*2)), ce qui signifie -1-2n .
  • Divise par 6 ( /6).

Python 2 , 27 octets

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

Essayez-le en ligne!

Enregistré 1 octet grâce à Rod et 1 grâce à GB .


1
C'est très intelligent!
Skyler


14

JavaScript (ES6), 16 octets

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

Démo

Comment?

L'expression n+++nest analysée comme n++ + n(1) . Ce n'est pas vraiment important car n + ++ncela fonctionnerait également dans ce cas.

Par conséquent:

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

qui évalue à additionner (k = 0 ... n) (k²) .


(1) Cela peut être vérifié en faisant n='2';console.log(n+++n)ce qui donne l'entier 5, alors n + ++nque donnerait la chaîne '23'.



6

Brain-Flak , 36 octets

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

Essayez-le en ligne!

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

Bien fait! :) Je suis venu avec ({<(({}))>{({})({}[()])}{}<({}[()])>})38
DJMcMayhem


6

Brain-Flak , 34 octets

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

Essayez-le en ligne!

Comment ça marche?

Au départ, j'avais la même idée que Riley 1, mais je me sentais mal d'utiliser un zéro. J'ai alors réalisé que

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

Calcule n 2 - n.

Pourquoi? Eh bien, nous savons

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

Calcule n 2 et boucle n fois. Cela signifie que si nous inversons l'ordre des deux poussées, nous passons de l'augmentation de la somme de n + (n-1) à chaque fois à l'augmentation de la somme de (n-1) + (n-1) à chaque fois. Cela diminuera le résultat d'une par boucle, faisant ainsi notre résultat n 2 - n. Au niveau supérieur, ce -n s'annule avec le n généré par la poussée que nous étions en train de mettre à zéro, réduisant ainsi le besoin d'un zéro et nous économisant deux octets.

Brain-Flak , 36 octets

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

Essayez-le en ligne!

Voici une autre solution, ce n'est pas aussi golfique mais c'est assez étrange alors j'ai pensé que je laisserais comme un défi de comprendre comment cela fonctionne.

Si vous n'êtes pas dans Brain-Flak mais que vous voulez toujours le défi ici, c'est comme une sommation.

Picture


1: J'ai trouvé ma solution avant de regarder les réponses ici. Donc pas de plagiat ici.


Je savais qu'il devait y avoir un moyen de le faire, et j'avais le sentiment que vous seriez le seul à comprendre les mathématiques.
Riley




2

Brain-Flak , 46 octets

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

Essayez-le en ligne!



@Riley Ooh nice :)
HyperNeutrino

Plutôt que de pousser le carré sur la pile alternative, vous pouvez le résumer directement en l'évaluant et non en le poussant, puis en poussant la boucle entière à la place. Cela change votre seconde moitié en ({{({})({}[()])}{}}{})et vous fait économiser 10 octets. (Si cela n'a pas de sens, envoyez-moi un ping dans la troisième pile )
DJMcMayhem

2

CJam , 10 octets

ri),{_*+}*

Essayez-le en ligne!

ri            e# Input integer n
  )           e# Add 1
   ,          e# Range [0 1 ... n]
    {   }*    e# Fold (reduce)
     _        e# Duplicate
      *       e# Multiply
       +      e# Add

Que diriez-vous ri),_.*:+ou ri),2f#:+?
Martin Ender

@Martin Bonne idée! Je pense que vous devriez le poster comme une réponse différente
Luis Mendo


2

En fait , 3 octets

R;*

Essayez-le en ligne!

Prend N en entrée et sort le Ne élément de la séquence.

Explication:

R;*
R    range(1, N+1) ([1, 2, ..., N])
 ;*  dot product with self


2

R, 17 octets

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

Assez simple, il profite du fait que ^(exponentiation) est vectorisé dans R .


1
(x=0:scan())%*%xest plus court d'un octet, mais je pense que vous avez besoin d'un catpour obtenir la sortie.
Giuseppe

@Giuseppe Je viens de l'essayer et votre code fonctionne sans cat, il génère une matrice 1x1.
Rui Barradas du

@RuiBarradas Le méta-consensus actuel est qu'il catest nécessaire pour que cela soit considéré comme un programme complet. Si vous souhaitez changer cela, répondez à cette question et obtenez une certaine traction parmi les autres personnes R sur le site.
Giuseppe

2

CJam , 9 octets

ri),_.*:+

Essayez-le en ligne!

Explication

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.

Alternativement:

ri),2f#:+

Cela place chaque élément en correspondance 2#au lieu d'utiliser des produits par paire. Et juste pour le plaisir, une autre alternative qui devient inexacte pour les grandes entrées car elle utilise l'arithmétique à virgule flottante:

ri),:mh2#

2

Julia , 16 ans 14 octets

2 octets enregistrés grâce à @MartinEnder

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

Essayez-le en ligne!

Comment?

(x=1:n)crée une gamme de 1à net attribue à x, produit scalaire avec x.


2

Labyrinthe , 11 octets

:!\
+ :
*:#

Essayez-le en ligne!

Imprime la séquence indéfiniment.

Explication

Le pointeur d'instruction continue de tourner autour du carré de code encore et encore:

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

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

Essayez-le en ligne!

Mon code est un peu triste ):

Calcule 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

Hexagonie , 23 octets

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

Essayez-le en ligne!

Explication

Déplié:

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

C'est vraiment juste un programme linéaire avec la /redirection utilisée. Le code linéaire est:

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

Qui calcule n (n + 1) (2n + 1) / 6 . Il utilise les bords de mémoire suivants:

enter image description here

Où le point mémoire (MP) commence sur le bord étiqueté n , pointant vers le nord.

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

En théorie, il pourrait être possible d'adapter ce programme à la longueur de côté 3, car /ils ne sont pas nécessaires pour le calcul, ils :peuvent être réutilisés pour terminer le programme, et certains '"=+*{peuvent également être réutilisables, ce qui porte le nombre de commandes inférieures à 19 (le maximum pour la longueur latérale 3). Je doute qu'il soit possible de trouver une telle solution à la main, s'il en existe une.


2

> <> , 15 13 11 octets

Enregistré 2 octets grâce à Pas un arbre

0:n:l1-:*+!

Essayez-le en ligne!

Sort la séquence indéfiniment.


1
14 octets (12 + 2 pour le -vdrapeau): ::1+:}+**6,n( Essayez-le en ligne! )
Pas un arbre

1
Ou 11 octets (imprime pour toujours, à partir de N=1): Essayez-le en ligne!
Pas un arbre du

@Notatree: Très belle idée d'utilisation l. Vérifier avec OP s'il est correct de commencer à 1.
Emigna

@Notatree: Malheureusement, nous ne sommes pas autorisés à commencer à 1, mais cela économise toujours 2 octets. Merci!
Emigna

1
(Je dois mentionner que j'ai eu l' lidée de la réponse Labyrinthe de Martin Ender .)
Pas un arbre

2

Pyth , 7 5 octets grâce à Steven H

s^R2h

Explication:

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

Ma première solution

sm*ddUh

Essayez-le en ligne!

Explication:

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

N'y a-t-il pas de carré intégré en Pyth?
caird coinheringaahing

Pas autant que je sache ...
Dave

Non, il n'y a pas de Pyth carré intégré. Aussi 6 octets
M. Xcoder


Fixable avec +1 octet à chaque réponse, je modifierai une fois que je serai hors du mobile.
Dave




En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.