Differenz des Quadrats der Summe


37

Finden Sie die Differenz zwischen dem Quadrat der Summen und der Summe der Quadrate.

Dies ist die mathematische Darstellung:

(n)2n2

Ihr Programm / Ihre Methode sollte zwei Eingaben annehmen, dies sind Ihre unteren und oberen Grenzen des Bereichs und sind inklusive. Limits sind ganze Zahlen über 0.

Ihr Programm / Ihre Methode sollte die Antwort zurückgeben.

Sie können jede Basis verwenden, die Sie möchten, aber geben Sie in Ihrer Antwort an, welche Basis Sie verwendet haben.

Testfall (Basis 10)

5,9      970
91,123   12087152
1,10     2640

Dies ist übliches Code-Golf. Je kürzer die Antwort, desto besser.


11
Es dauerte eine Weile, bis mir klar wurde, dass es sich bei der Eingabe um die Endpunkte eines Bereichs handelte.
Brad Gilbert b2gills

@ BradGilbertb2gills für Klarheit bearbeitet
George

Das ist einfacher als es aussieht?
Katze

@cat was meinst du damit? Ja, die Mathematik ist einfaches Alevel-Zeug. Aber es hängt alles davon ab, wie Sie Golf spielen
George

@ George Die Frage und viele der Antworten lassen es wie viel Arbeit aussehen, aber es ist nicht
Katze

Antworten:


23

Python 2, 43 Bytes

f=lambda a,b,s=0:b/a and 2*a*s+f(a+1,b,s+a)

Teste es auf Ideone .

Wie es funktioniert

Rufen Sie die in der Spezifikation g (a, b) definierte Funktion auf . Wir haben das

Definieren Sie die Funktion f (x, y, s) rekursiv wie folgt.

Indem wir die Wiederholungsrelation von f (a, b, 0) insgesamt b - a mal anwenden , können wir das zeigen.

Dies ist die Funktion f der Implementierung. Während b/aeine Ganzzahl ungleich Null zurückgegeben wird, wird der folgende Code andausgeführt, wodurch die rekursive Definition von f implementiert wird .

Einmal b/aerreicht 0 , haben wir , dass b> ein und die Lambda - Renditen Falsch = 0 , so dass der Basisfalles der Definition der Umsetzung f .


ach okay Können Sie uns Ihre Methode erklären?
George

Das werde ich, aber ich versuche gerade, ein bisschen mehr Golf zu spielen.
Dennis

danke für die formel. Ich schätze, ich habe das nie so gesehen, weil wir in der Schule so viele Serien nicht behandeln. Ziemlich interessant!
George

2
@george Ich habe die Erklärung beendet.
Dennis

Wollen Sie uns ein bisschen mehr darüber erzählen, wie in der Welt die Idee, f zu definieren, in Ihren Sinn gekommen ist? Die Motivation! Ich bin wirklich interessiert.
Musa Al-hassy

15

MATL , 9 Bytes

&:&*XRssE

Probieren Sie es online!

Erläuterung

&:   % Inclusive range between the two implicit inputs
&*   % Matrix of all pair-wise products
XR   % Upper triangular part of matrix, without the diagonal
ss   % Sum of all elements of the matrix
E    % Multiply by 2. Implicit display

Beispiel

Dies sind die Teilergebnisse jeder Zeile für Eingaben 5und 9:

  1. &:

    5 6 7 8 9
    
  2. &:&*

    25 30 35 40 45
    30 36 42 48 54
    35 42 49 56 63
    40 48 56 64 72
    45 54 63 72 81
    
  3. &:&*XR

    0 30 35 40 45
    0  0 42 48 54
    0  0  0 56 63
    0  0  0  0 72
    0  0  0  0  0
    
  4. &:&*XRss

    485
    
  5. &:&*XRssE

    970
    

7
Ich mag es wirklich, die Teilergebnisse zu sehen. Sie helfen wirklich beim Verständnis des Programms. Danke, dass du sie aufgenommen hast!
DanTheMan


10

Python 2, 45 Bytes

lambda a,b:(a+~b)*(a-b)*(3*(a+b)**2+a-b-2)/12

Closed-Form-Lösung - nicht die kürzeste, aber ich dachte, es lohnt sich trotzdem, sie zu veröffentlichen.

Erläuterung

Sei p(n)die n- te quadratische Pyramidenzahl und t(n)sei die n- te dreieckige Zahl . Dann gilt für n über den Bereich a , ..., b :

  • ∑n = t(b)-t(a-1)und
  • ∑n² = p(b) - p(a-1)
  • Also (∑n) ²-∑n² = (t(b)-t(a-1))² - (p(b) - p(a-1)).

Dieser Ausdruck reduziert sich auf den im Code.


Hi könntest du deine Gleichung erklären, wenn möglich. Meine Python - Version ist 16 Bytes mehr und ich kann nicht herausfinden , wie Sie Ihre Gleichung abgeleitet
george

1
@george Lassen Sie p(n)das sein nth Platz Pyramidenzahl , und t(n)die sein nth Dreieckszahl . Dann ist dies eine vereinfachte Version von (t(b)-t(a-1))^2 - (p(b) - p(a-1)).
Martin Ender

@MartinEnder Das ist also die exakte Formel, die ich verwendet habe, aber Sp3000 hat sie auf eine Weise vereinfacht, die ich nicht verstehen kann. Mein Python-Skript lautet: (b * - ~ ba * ~ -a) ** 2 / 4- (b * - ~ b * (2 * b + 1) -a * ~ -a * (2 * a-1) ) / 6 wenn das von Nutzen ist. Ich habe so viel Golf gespielt wie ich kann
George,

@george Bei solchen Problemen ist es manchmal am einfachsten, Wolfram | Alpha dazu zu bringen, den mühsamen Teil zu erledigen, und dann zu überprüfen, ob er richtig ist. Um ehrlich zu sein, glaube ich nicht, dass ich den (a-b-1)Faktor (b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6alleine hätte herausholen können .
Sp3000

@ Sp3000 das ist eine tolle möglichkeit. Ich werde es in Zukunft versuchen
George

6

05AB1E, 8 Bytes

ŸDOnsnO-

Erklärt

ŸD       # range from a to b, duplicate
  On     # sum and square first range
    s    # swap top 2 elements
     nO  # square and sum 2nd range
       - # take difference

Probieren Sie es online aus


Ist 05AB1E vielleicht eine ROT13-Version von Jelly? Ersetze r durch Ÿ, µ durch D, S durch O, ² durch n, _ durch s und $ durch -.
Thomas Weller

4
@ ThomasWeller: Sie sind eigentlich ganz anders. Ein gemeinsamer Versatz einiger "Funktionen" ist höchstwahrscheinlich ein Zufall. Jelly ist eine implizite Sprache für Verkettungsfunktionen (afaik), während 05AB1E eine stapelbasierte Sprache ist.
Emigna

6

Mathematica, 21 Bytes

Tr[x=Range@##]^2-x.x&

Eine unbenannte Funktion, die zwei Argumente verwendet und die Differenz zurückgibt. Verwendung:

Tr[x=Range@##]^2-x.x&[91, 123]
(* 12087152 *)

Hier gibt es drei kleine (und ziemlich übliche) Golf-Tricks:

  • ##repräsentiert beide Argumente gleichzeitig, so dass wir die Präfixnotation für verwenden können Range. Range@##ist eine Abkürzung, Range[##]die erweitert wird Range[a, b]und uns je nach Bedarf ein umfassendes Angebot bietet.
  • Trist für die Verfolgung, aber wenn Sie es für einen Vektor verwenden, addieren Sie einfach diesen Vektor und sparen Sie drei Bytes mehr Total.
  • x.xist ein Skalarprodukt, bei dem vier Bytes eingespart werden Tr[x^2].

Würde Variancehelfen?
Undichte Nonne

@LeakyNun Ich verstehe nicht, wie, weil einer der beiden Begriffe in Variancedurch nund der andere durch geteilt wird n^2und ich keine einfache Möglichkeit sehe, diese getrennt voneinander rückgängig zu machen.
Martin Ender

1
Tr@#^2-#.#&@*Rangeist nur 18 Bytes.
Mischa Lawrow

@ Mischa Lawrow ordentlich! Fühlen Sie sich frei, eine separate Antwort zu geben. :)
Martin Ender

5

Labyrinth , 28 24 Bytes

?:?:}+=-:(:(#{:**+**#2/!

Probieren Sie es online!

Erläuterung

Da Schleifen im Labyrinth oft teuer sind, sollte die explizite Formel die kürzeste sein, da sie als linearer Code ausgedrückt werden kann.

Cmd Explanation                 Stacks [ Main | Aux ]
?   Read M.                     [ M | ]
:   Duplicate.                  [ M M | ]
?   Read N.                     [ M M N | ]
:   Duplicate.                  [ M M N N | ]
}   Move copy to aux.           [ M M N | N ]
+   Add.                        [ M (M+N) | N ]
=   Swap tops of stacks.        [ M N | (M+N) ]
-   Subtract.                   [ (M-N) | (M+N) ]
:   Duplicate.                  [ (M-N) (M-N) | (M+N) ]
(   Decrement.                  [ (M-N) (M-N-1) | (M+N) ]
:   Duplicate.                  [ (M-N) (M-N-1) (M-N-1) | (M+N) ]
(   Decrement.                  [ (M-N) (M-N-1) (M-N-2) | (M+N) ]
#   Push stack depth.           [ (M-N) (M-N-1) (M-N-2) 3 | (M+N) ]
{   Pull (M+N) over from aux.   [ (M-N) (M-N-1) (M-N-2) 3 (M+N) | ]
:   Duplicate.                  [ (M-N) (M-N-1) (M-N-2) 3 (M+N) (M+N) | ]
*   Multiply.                   [ (M-N) (M-N-1) (M-N-2) 3 ((M+N)^2) | ]
*   Multiply.                   [ (M-N) (M-N-1) (M-N-2) (3*(M+N)^2) | ]
+   Add.                        [ (M-N) (M-N-1) (3*(M+N)^2 + M - N - 2) | ]
*   Multiply.                   [ (M-N) ((M-N-1)*(3*(M+N)^2 + M - N - 2)) | ]
*   Multiply.                   [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) | ]
#   Push stack depth.           [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) 1 | ]
2   Multiply by 10, add 2.      [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) 12 | ]
/   Divide.                     [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)/12) | ]
!   Print.                      [ | ]

Der Befehlszeiger stößt dann auf eine Sackgasse und muss sich umdrehen. Wenn es nun auf etwas stößt /, versucht es eine Division durch Null (da der Boden des Stapels implizit mit Nullen gefüllt ist), wodurch das Programm beendet wird.


4

Haskell, 34 Bytes

a#b=sum[a..b]^2-sum(map(^2)[a..b])

Anwendungsbeispiel: 91 # 123-> 12087152.

Nichts zu erklären.


3

Matlab, 30 29 28 Bytes

Die Verwendung von Suevers Idee von normergibt 2 Bytes weniger

@(x,y)sum(x:y)^2-norm(x:y)^2

Alte (einfache) Version:

@(x,y)sum(x:y)^2-sum((x:y).^2)

3

Oktave, 27 23 Bytes

@(x,y)sum(z=x:y)^2-z*z'

Erstellt eine anonyme Funktion mit dem Namen, ansdie zwei Eingaben akzeptiert:ans(lower, upper)

Online Demo

Erläuterung

Erstellt einen Zeilenvektor von xbis y(einschließlich) und speichert ihn in z. Wir addieren dann alle Elemente mit sumund quadrieren es ( ^2). Um die Summe der Quadrate zu berechnen, führen wir eine Matrixmultiplikation zwischen dem Zeilenvektor und seiner Transponierung durch. Dies wird effektiv jedes Element quadrieren und das Ergebnis zusammenfassen. Wir subtrahieren dann die beiden.


3

Java, 84 77 Zeichen, 84 77 Bytes

7 Bytes kleiner dank Martin Ender und FryAmTheEggMan, danke.

public int a(int b,int c){int e=0,f=0;for(;b<=c;e+=b,f+=b*b++);return e*e-f;}

Verwenden der drei Testfälle im Originalbeitrag: http://ideone.com/q9MZSZ

Ungolfed:

public int g(int b, int c) {
    int e = 0, f = 0;
    for (; b <= c; e += b, f += b * b++);
    return e*e-f;
}

Der Prozess ist ziemlich selbsterklärend. Ich habe zwei Variablen deklariert, um das Quadrat der Summen und die Summe der Quadrate darzustellen, und habe sie wiederholt entsprechend inkrementiert. Schließlich gebe ich die berechnete Differenz zurück.


Willkommen bei PPCG! Sie können sich wahrscheinlich speichern ein Byte , indem sie das ++auf f+=b*b++(so dass Sie den dritten Schlitz des hinterlassen forleer) und Sie auch nicht auf Platz brauchen , ebevor es (dh nur tun Rückkehr return e*e-f).
Martin Ender

Anstatt den dritten freien Platz zu belassen for, schieben Sie den f+=b*b++dort hinein, damit Sie sowohl ein Semikolon als auch die geschweiften Klammern einsparen können.
Martin Ender

Großartiger Fang @MartinEnder, danke :)
Mario Ishac

Auch auf dem, was Martin im Sinne hatte, dies scheint ein wenig kürzer zu sein.
FryAmTheEggman

1
Anscheinend war mein letzter Kommentar falsch. Tatsächlich ist es ein besonderer Teil der Java-Grammatik: Die letzte Anweisung eines for ist eine besondere Art von Anweisung, die als Anweisungsausdrucksliste bezeichnet wird. Bei dieser speziellen Anweisung kann mehr als eine Anweisung durch ein Komma verbunden sein. Siehe 14.14.1 (Sie müssen selbst dorthin navigieren, ich konnte keinen genaueren Link finden) der Sprachspezifikation.
FryAmTheEggman


3

JavaScript (ES6), 50 37 Bytes

f=(n,m,s=0)=>n>m?0:2*n*s+f(n+1,m,n+s)

Nun ein Port von @ Dennis ♦ 's Python-Lösung.


Versuchen Sie es mitn=>m=>eval(`for(s=t=0;n<=m;t+=n++)s+=n*n;t*t-s`)
Mama Fun Roll

@ MamaFunRoll Auf der anderen Seite könnte ich versuchen, Dennis ♦ 's Python-Lösung zu portieren ...
Neil

3

Faktor 48 Bytes

[ [a,b] [ [ sq ] map sum ] [ sum sq ] bi - abs ]

Eine anonyme Funktion.

[ 
  [a,b] ! a range from a to b 
  [ 
    [ sq ] map sum ! anonymous function: map sq over the range and sum the result 
  ] 
  [ sum sq ] ! the same thing, in reverse order
  bi - abs   ! apply both anon funcs to the range, subtract them and abs the result
]

3

Haskell, 36 Bytes

m#n=sum[2*i*j|i<-[m..n],j<-[i+1..n]]

λ> m # n = sum [ 2*i*j | i <- [m..n], j <- [i+1..n] ]
λ> 5 # 9
970
λ> 91 # 123
12087152
λ> 1 # 10
2640

Beachten Sie, dass

(k=mnk)2k=mnk2==k1=mnk2=mk2k1nk1k2=k1=mnk2=k1+1n2k1k2

1
Sie brauchen nicht die Eltern herum i+1.
Weizen-Assistent

2
Auch wenn Sie über Haskell und Haskell Golf sprechen möchten, können Sie sich uns im Chatroom anschließen .
Weizen-Assistent

3

Perl 6 ,  36 32  31 Bytes

{([+] $_=@_[0]..@_[1])²-[+] $_»²}
{([+] $_=$^a..$^b)²-[+] $_»²}
{[+]($_=$^a..$^b)²-[+] $_»²}

Probier es aus

Erläuterung:

{ # bare block with placeholder parameters $a and $b

  [+](# reduce with &infix:<+>
      # create a range, and store it in $_
      $_ = $^a .. $^b
  
  -
  [+] # reduce with &infix:<+>
    # square each element of $_ ( possibly in parallel )
    $_»²
}

Prüfung:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @tests = (
  (5,9) => 970,
  (91,123) => 12087152,
  (1,10) => 2640,
);

plan +@tests;

my &diff-sq-of-sum = {[+]($_=$^a..$^b)²-[+] $_»²}

for @tests -> $_ ( :key(@input), :value($expected) ) {
  is diff-sq-of-sum(|@input), $expected, .gist
}
1..3
ok 1 - (5 9) => 970
ok 2 - (91 123) => 12087152
ok 3 - (1 10) => 2640

1
Speichern Sie ein Byte, indem Sie die Zuweisung verschieben und Parens umgehen:{$_=$^a..$^b;.sum²-[+] $_»²}
Phil H

1
25 Bytes:{.sum²-[+] $_»²}o&[..]
Nwellnhof

2

Brachylog , 24 Bytes

:efL:{:2^.}a+S,L+:2^:S-.

Erwartet die 2 Zahlen in Input als Liste, z [91:123].

Erläuterung

:efL                     Find the list L of all integers in the range given in Input
    :{:2^.}a             Apply squaring to each element of that list
            +S,          Unify S with the sum of the elements of that list
               L+:2^     Sum the elements of L, then square the result
                    :S-. Unify the Output with that number minus S

2

APL, 23 bis 20 Bytes

-/+/¨2*⍨{(+/⍵)⍵}⎕..⎕

Funktioniert in NARS2000.


2

MATL, 11 Bytes

&:ts2^w2^s-

Probieren Sie es online!

Erläuterung:

&:           #Create a range from the input
  t          #Duplicate it
   s2^       #Sum it and square it
      w      #swap the two ranges
       2^s   #Square it and sum it
          -  #Take the difference

2

Pyth, 11 Bytes

s*M-F#^}FQ2

Probieren Sie es online!

s*M-F#^}FQ2
       }FQ    Compute the range
      ^   2   Generate all pairs
   -F#        Remove those pairs who have identical elements
 *M           Product of all pairs
s             Sum.

Schöne Verwendung von Filter. Für diese Aufgabe gibt es bereits einen Build:s*M.P}FQ2
Jakube 20.06.16


1

CJam, 17 Bytes

q~),>_:+2#\2f#:+-

Teste es hier.

Erläuterung

q~       e# Read and evaluate input, dumping M and N on the stack.
),       e# Increment, create range [0 1 ... N].
>        e# Discard first M elements, yielding [M M+1 ... N].
_        e# Duplicate.
:+2#     e# Sum and square.
\2f#:+   e# Swap with other copy. Square and sum.
-        e# Subtract.

Alternativ kann man einfach die Produkte aller unterschiedlichen Paare summieren (im Grunde genommen das Quadrat der Summe multiplizieren und Quadrate entfernen), aber das ist ein Byte länger:

q~),>2m*{)-},::*:+

1

PowerShell v2 +, 47 Byte

Zwei Variationen

param($n,$m)$n..$m|%{$o+=$_;$p+=$_*$_};$o*$o-$p

$args-join'..'|iex|%{$o+=$_;$p+=$_*$_};$o*$o-$p

In beiden Fällen generieren wir mit dem ..Operator einen Bereich und leiten diesen an eine Schleife weiter |%{...}. Bei jeder Iteration akkumulieren wir $ound $pentweder als Summe oder als Quadratsumme. Wir berechnen dann das Summenquadrat mit $o*$ound subtrahieren $p. Die Ausgabe bleibt in der Pipeline und das Drucken ist implizit.


1

JavaScript (ES6), 67 Byte

a=>b=>([s=q=0,...Array(b-a)].map((_,i)=>q+=(s+=(n=i+a),n*n)),s*s-q)

Test Suite

f=a=>b=>([s=q=0,...Array(b-a)].map((_,i)=>q+=(s+=(n=i+a),n*n)),s*s-q)
e=s=>`${s} => ${eval(s[0])}` // template tag format for tests
console.log(e`f(5)(9)`)
console.log(e`f(91)(123)`)
console.log(e`f(1)(10)`)


1

J, 29 Bytes

Antwort von Port of Doorknob's Jelly .

[:(+/@(^&2)-~2^~+/)[}.[:i.1+]

Verwendung

>> f = [:(+/@(^&2)-~2^~+/)[}.[:i.1+]
>> 91 f 123x
<< 12087152

Wo >>ist STDIN, <<ist STDOUT und xist für erweiterte Präzision.



1

Julia, 25 Bytes

f(a,b,x=a:b)=sum(x)^2-x'x

Dies ist eine Funktion, die zwei Ganzzahlen akzeptiert und ein 1x1-Ganzzahl-Array zurückgibt.

Der Ansatz ist einfach: Erstellen Sie eine UnitRangevon den Endpunkten aund bund es nennt x, dann summieren x, quadratisch es, und seine Norm subtrahieren, die als berechnet transpose(x) * x.

Probieren Sie es online! (beinhaltet alle Testfälle)


1
a\b=-(x=a:b)'x+sum(x)^2spart ein paar Bytes.
Dennis

1

TI-BASIC, 19 Bytes

Prompt N,M
randIntNoRep(N,M
sum(Ans)2-sum(Ans2

randIntNoRepRuft die Reichweite ab (gemischt). Der Rest ist ziemlich selbsterklärend.


1

Fünftens 52 Bytes

{ 1 + range dup sum 2 pow swap { 2 pow } map sum - }

Dies ist eine anonyme Funktion, die die beiden Zahlen auf dem Stapel aufnimmt und eine einzelne Zahl hinterlässt.

Erläuterung:

{
    1 + range dup      2 ranges from a to b inclusive
    sum 2 pow          Sum one and square it
    swap               Bring a fresh range to the top
    { 2 pow } map sum  Square every element and sum the list
    -                  Subtract
}

1
Wenn Sie postfixes, punktfreies und stapelbasiertes funktionales Programmieren mögen, könnte Ihnen Factor : D
cat

1

GeoGebra, 91 Bytes

a(x)=(x²+x)/2
b(x)=x³/3+x²/2+x/6
c(x,y)=(a(y)-a(x))²
d(x,y)=b(y)-b(x)
c(x-1,y)-d(x-1,y)

Definiert (wahrscheinlich e(x,y)) eine Funktion , die die gewünschte Differenz berechnet.
a(x)berechnet die Summe der natürlichen Zahlen zwischen 0und x.
b(x)berechnet die Summe der Quadrate der natürlichen Zahlen zwischen 0und x.
c(x,y)Berechnet zuerst die Summe der natürlichen Zahlen zwischen xund yund quadriert dann diese Summe.
d(x,y)berechnet die Summe der Quadrate zwischen b(x)und b(y).
Die letzte Zeile definiert eine Funktion mit mehreren Variablen, die die Berechnung beendet. Der Funktion wird automatisch ein Name zugewiesen, der einige Bytes spart.


Hallo, wie rufe ich die Funktion auf, die dies definiert? Ich konnte die Eingabe unter geogebra.org/classic#cas herausfinden , konnte aber nicht herausfinden, wie die endgültige Funktion gefunden oder aufgerufen werden kann.
Sundar - Reinstate Monica

@sundar: Die letzte Zeile ist ein Ausdruck in x und y. Wir könnten vorziehen e(x,y)=, ihm einen Namen zu geben, aber um Bytes zu sparen, sind wir nicht hier. GeoGebra weist dem Ausdruck automatisch einen Namen zu (wahrscheinlich e, da dies der nächste verfügbare Buchstabe ist). Ich habe die Umgebung momentan nicht verfügbar, aber ich würde den CAS-Bereich nicht verwenden. Das Algebra-Fenster und die Eingabeleiste sollten den Job richtig machen. (Es ist eine Weile her, seit ich GGb online verwendet habe; mein geistiges Bild davon ist möglicherweise veraltet.)
Joe
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.