Różnica kwadratu sumy


37

Znajdź różnicę między kwadratem sum a sumą kwadratów.

To matematyczne przedstawienie:

(n)2n2

Twój program / metoda powinna przyjmować dwa dane wejściowe, są to dolne i górne granice zakresu i są włącznie. Limity będą pełnymi liczbami całkowitymi powyżej 0.

Twój program / metoda powinna zwrócić odpowiedź.

Możesz użyć dowolnej bazy, którą chcesz, ale w odpowiedzi podaj, której bazy użyłeś.

Walizka testowa (podstawa 10)

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

Jest to zwykle kod-golf, więc im krótsza odpowiedź, tym lepiej.


11
Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że dane wejściowe były punktami końcowymi zakresu.
Brad Gilbert b2gills

@ BradGilbertb2gills zredagowany dla przejrzystości
George

To jest prostsze niż się wydaje?
kot

@cat, co przez to rozumiesz? Tak, matematyka to proste rzeczy Alevel. Ale wszystko zależy od tego, jak grasz w golfa
George

@george Pytanie i wiele odpowiedzi sprawiają, że wygląda to na dużo pracy, ale tak nie jest
kot

Odpowiedzi:


23

Python 2, 43 bajty

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

Przetestuj na Ideone .

Jak to działa

Wywołaj funkcję zdefiniowaną w specyfikacji g (a, b) . Mamy to

Zdefiniuj rekurencyjnie funkcję f (x, y, s) w następujący sposób.

Stosując relację powtarzalności f (a, b, 0) w sumie b - a , możemy to pokazać.

To jest funkcja f implementacji. Podczas gdy b/azwraca niezerową liczbę całkowitą, andwykonywany jest następujący kod , implementując w ten sposób rekurencyjną definicję f .

Gdy b/aosiągnie wartość 0 , mamy b> a, a lambda zwraca False = 0 , implementując w ten sposób podstawowy przypadek definicji f .


Ah, dobrze. Czy mógłbyś jednak wyjaśnić swoją metodę?
George

Zrobię to, ale obecnie próbuję trochę pograć w golfa.
Dennis

dzięki za wzór. Chyba nigdy tak nie widziałem, ponieważ nie omawiamy takich seriali w szkole. Całkiem interesujące!
George

2
@george Skończyłem wyjaśnienie.
Dennis,

Chcielibyśmy powiedzieć trochę więcej o tym, jak na świecie wpadł na pomysł zdefiniowania f! Motywacja! Jestem naprawdę zainteresowany.
Musa Al-hassy

15

MATL , 9 bajtów

&:&*XRssE

Wypróbuj online!

Wyjaśnienie

&:   % 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

Przykład

Są to częściowe wyniki każdego wiersza dla danych wejściowych 5i 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
Naprawdę lubię widzieć częściowe wyniki. Naprawdę pomagają zrozumieć program. Dzięki za ich włączenie!
DanTheMan


10

Python 2, 45 bajtów

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

Rozwiązanie w formie zamkniętej - nie najkrótsze, ale pomyślałem, że i tak warto je opublikować.

Wyjaśnienie

Pozwolić p(n)być n th kwadratowy liczby piramidalnej , a t(n)być n th Liczba trójkątna . Następnie dla n powyżej zakresu a , ..., b :

  • =n = t(b)-t(a-1)i
  • ²n² = p(b) - p(a-1)
  • Więc (∑n) ²-∑n² = (t(b)-t(a-1))² - (p(b) - p(a-1)).

To wyrażenie ogranicza się do tego w kodzie.


Cześć, czy możesz wyjaśnić swoje równanie, jeśli to możliwe. Moja wersja Pythona jest o 16 bajtów dłuższa i nie mogę zrozumieć, jak wyprowadziłeś swoje równanie
George

1
@george Pozwolić p(n)być nth kwadrat numer piramidalny , a t(n)być nth Liczba trójkątna . To jest uproszczona wersja (t(b)-t(a-1))^2 - (p(b) - p(a-1)).
Martin Ender

@MartinEnder Więc to jest dokładnie ta formuła, której użyłem, ale Sp3000 uprościł ją w sposób, którego nie rozumiem. Mój skrypt Pythona to: (b * - ~ ba * ~ -a) ** 2 / 4- (b * - ~ b * (2 * b + 1) -a * ~ -a * (2 * a-1) ) / 6, jeśli ma to jakiekolwiek zastosowanie. Grałem w golfa tak bardzo, jak tylko mogłem, w dwie formuły
George

@george Czasami przy takich problemach najłatwiej jest zmusić Wolfram | Alpha do wykonania żmudnej części, a następnie dwukrotnie sprawdzić, aby upewnić się, że wszystko jest w porządku. Szczerze mówiąc, nie sądzę, żebym sam mógł wyciągnąć ten (a-b-1)czynnik (b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6.
Sp3000,

@ Sp3000 to świetny sposób, aby to zrobić. Spróbuję tego w przyszłości
George

6

05AB1E, 8 bajtów

ŸDOnsnO-

Wyjaśnił

Ÿ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

Wypróbuj online


Czy 05AB1E może być galaretką w wersji ROT13? Zastąp r przez Ÿ, µ przez D, S przez O, ² przez n, _ przez s i $ przez -.
Thomas Weller,

4
@ThomasWeller: W rzeczywistości są zupełnie inne. Wspólne przesunięcie między niektórymi „funkcjami” najprawdopodobniej jest zbieżne. Jelly jest milczącym językiem na temat funkcji łańcuchowych (afaik), podczas gdy 05AB1E jest językiem stosowym.
Emigna,

6

Mathematica, 21 bajtów

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

Funkcja bez nazwy, która bierze dwa argumenty i zwraca różnicę. Stosowanie:

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

Są tutaj trzy małe (i dość standardowe) sztuczki golfowe:

  • ##reprezentuje oba argumenty jednocześnie, dzięki czemu możemy użyć zapisu prefiksu dla Range. Range@##jest skrótem, dla Range[##]którego rozszerza się Range[a, b]i daje nam zakres obejmujący zgodnie z wymaganiami.
  • Trsłuży do śledzenia, ale użycie go na wektorze po prostu sumuje ten wektor, oszczędzając trzy bajty Total.
  • x.xjest produktem kropkowym, co pozwala zaoszczędzić cztery bajty Tr[x^2].

Pomógłby Variance?
Leaky Nun

@LeakyNun Nie wiem jak, ponieważ jeden z dwóch terminów Variancejest podzielony przez, na drugi przez n^2i nie widzę łatwego sposobu na ich oddzielenie.
Martin Ender,

1
Tr@#^2-#.#&@*Rangema tylko 18 bajtów.
Misza Ławrow

@MishaLavrov schludny! Uczyń go osobną odpowiedzią. :)
Martin Ender

5

Labirynt , 28 24 bajtów

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

Wypróbuj online!

Wyjaśnienie

Ponieważ pętle są zwykle drogie w Labiryncie, pomyślałem, że wyraźna formuła powinna być najkrótsza, ponieważ może być wyrażona jako kod liniowy.

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.                      [ | ]

Wskaźnik instrukcji następnie uderza w ślepy zaułek i musi się odwrócić. Gdy napotka teraz /, próbuje podzielić przez zero (ponieważ spód stosu jest domyślnie wypełniony zerami), co powoduje zakończenie programu.


4

Haskell, 34 bajty

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

Przykład użycia: 91 # 123-> 12087152.

Nic do wyjaśnienia.


3

Matlab, 30 29 28 bajtów

Wykorzystanie pomysłu Suever normdaje nam 2 bajty mniej

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

Stara (prosta) wersja:

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

3

Oktawa, 27 23 bajtów

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

Tworzy anonimową funkcję o nazwie, ansktóra akceptuje dwa dane wejściowe:ans(lower, upper)

Demo online

Wyjaśnienie

Tworzy wektor wiersza od xdo y(włącznie) i zapisuje go w z. Następnie sumujemy wszystkie elementy za pomocą sumi kwadrat (it ^2). Aby obliczyć sumę kwadratów, wykonujemy mnożenie macierzy między wektorem wiersza a jego transpozycją. To skutecznie wyrówna każdy element i zsumuje wynik. Następnie odejmujemy dwa.


3

Java, 84 77 znaków, 84 77 bajtów

7 bajtów mniejszych dzięki Martinowi Enderowi i FryAmTheEggMan, dziękuję.

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

Wykorzystując trzy przypadki testowe w oryginalnym poście: http://ideone.com/q9MZSZ

Nie golfowany:

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

Proces jest dość oczywisty. Zadeklarowałem dwie zmienne do reprezentowania kwadratu sum i sumy kwadratów i wielokrotnie odpowiednio je zwiększałem. Na koniec zwracam obliczoną różnicę.


Witamy w PPCG! Prawdopodobnie możesz zapisać bajt, wkładając ++go f+=b*b++(dzięki czemu możesz zostawić trzeci slot z forpustym miejscem), a także nie musisz kwadratować eprzed zwróceniem (tj. Po prostu zrób return e*e-f).
Martin Ender

Właściwie zamiast pozostawiać trzeci otwór forpustego, przenieś go f+=b*b++tam, abyś mógł zapisać zarówno średnik, jak i nawiasy klamrowe.
Martin Ender

Świetny połów @MartinEnder, dziękuję :)
Mario Ishac

Również na podstawie tego, co Martin miał na myśli, to wydaje się być nieco krótszy.
FryAmTheEggman

1
Najwyraźniej mój ostatni komentarz był niepoprawny. W rzeczywistości jest to specjalna część gramatyki Java: końcowa instrukcja for jest tak naprawdę specjalnym rodzajem instrukcji, który nazywa się listą wyrażeń instrukcji. Ta specjalna instrukcja może zawierać więcej niż jedną instrukcję przecinek. Zobacz 14.14.1 (będziesz musiał sam tam nawigować, nie mogłem znaleźć bardziej precyzyjnego linku) specyfikacji języka.
FryAmTheEggman


3

JavaScript (ES6), 50 37 bajtów

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

Teraz port rozwiązania Python @ Dennis ♦.


Spróbuj użyćn=>m=>eval(`for(s=t=0;n<=m;t+=n++)s+=n*n;t*t-s`)
Mama Fun Roll

@MamaFunRoll Z drugiej strony mogłem spróbować przenieść rozwiązanie Pythona Dennisa ♦ ...
Neil

3

Współczynnik, 48 bajtów

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

Anonimowa funkcja.

[ 
  [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 bajtów

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

Zauważ, że

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

1
Nie potrzebujesz parenów i+1.
Wheat Wizard

2
Również, jeśli chcesz porozmawiać z Haskell i Haskell golfem, możesz dołączyć do nas na czacie .
Wheat Wizard

3

Perl 6 ,  36 32  31 bajtów

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

Sprawdź to

Wyjaśnienie:

{ # 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 )
    $_»²
}

Test:

#! /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
Zaoszczędź bajt, przenosząc przydział i unikając parens:{$_=$^a..$^b;.sum²-[+] $_»²}
Phil H

1
25 bajtów:{.sum²-[+] $_»²}o&[..]
nwellnhof,

2

Brachylog , 24 bajty

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

Oczekuje 2 liczb na wejściu jako listy, np [91:123].

Wyjaśnienie

: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 20 bajtów

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

Działa w NARS2000.


2

MATL, 11 bajtów

&:ts2^w2^s-

Wypróbuj online!

Wyjaśnienie:

&:           #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 bajtów

s*M-F#^}FQ2

Wypróbuj 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.

Ładne użycie filtra. Chociaż istnieje już wbudowana s*M.P}FQ2
funkcja


1

CJam, 17 bajtów

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

Sprawdź to tutaj.

Wyjaśnienie

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.

Alternatywnie można po prostu zsumować iloczyny wszystkich odrębnych par (w zasadzie pomnożenie kwadratu sumy i usunięcie kwadratów), ale jest to bajt dłuższy:

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

1

PowerShell v2 +, 47 bajtów

Dwie odmiany

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

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

W obu przypadkach generujemy zasięg z ..operatorem, przesyłając go do pętli |%{...}. Każdą iterację kumulujemy $oi $pjako sumę lub sumę kwadratów. Następnie obliczamy kwadrat sum za pomocą $o*$oi odejmujemy $p. Dane wyjściowe pozostają w potoku, a drukowanie jest niejawne.


1

JavaScript (ES6), 67 bajtów

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

Pakiet testowy

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 bajtów

Odpowiedź Galaretki Portu Doorknob .

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

Stosowanie

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

Gdzie >>jest STDIN, <<jest STDOUT i xsłuży do zwiększonej precyzji.


1

Pyke, 11 bajtów

h1:Ds]MXXs-

Wypróbuj tutaj!

h1:         - inclusive_range(input)
   Ds]      -     [^, sum(^)]
      MX    -    deep_map(^, <--**2)
         s  -   ^[1] = sum(^[1])
          - -  ^[0]-^[1]

1

Julia, 25 bajtów

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

Jest to funkcja, która akceptuje dwie liczby całkowite i zwraca tablicę liczb całkowitych 1x1.

Podejście jest proste: zbuduj a UnitRangez punktów końcowych ai bwywołaj go x, a następnie zsumuj x, wyprostuj i odejmij jego normę, która jest obliczana jako transpose(x) * x.

Wypróbuj online! (obejmuje wszystkie przypadki testowe)


1
a\b=-(x=a:b)'x+sum(x)^2oszczędza kilka bajtów.
Dennis,

1

TI-BASIC, 19 bajtów

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

randIntNoRepdostaje zasięg (potasowane). Reszta jest dość oczywista.


1

Po 52 bajty

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

Jest to anonimowa funkcja, która pobiera dwie liczby ze stosu i pozostawia jedną liczbę.

Wyjaśnienie:

{
    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
Jeśli podoba Ci się postfix, prorgamming funkcjonalny bez punktów i stosu, może ci się spodobać Factor : D
cat

1

GeoGebra, 91 bajtów

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)

Definiuje funkcję (prawdopodobnie e(x,y)), która oblicza pożądaną różnicę.
a(x)oblicza sumę liczb naturalnych między 0i x.
b(x)oblicza sumę kwadratów liczb naturalnych między 0i x.
c(x,y)najpierw oblicza sumę liczb naturalnych między xi y, a następnie kwadraty tej sumy.
d(x,y)oblicza sumę kwadratów między b(x)i b(y).
Ostatni wiersz definiuje funkcję wielu zmiennych, która kończy obliczenia. Funkcja ma automatycznie przypisaną nazwę, oszczędzając kilka bajtów.


Cześć, jak mogę wywołać funkcję, którą to określa? Udało mi się znaleźć dane wejściowe na stronie geogebra.org/classic#cas , ale nie mogłem dowiedzieć się, jak znaleźć lub wywołać ostateczną funkcję.
Sundar - Przywróć Monikę

@sundar: Ostatni wiersz jest wyrażeniem xiy. Moglibyśmy e(x,y)=nadać temu nazwę, ale żeby zaoszczędzić bajty, nie ma nas tutaj. GeoGebra automatycznie przypisuje wyrażeniu nazwę (prawdopodobnie e, ponieważ jest to następna dostępna litera). Obecnie nie mam dostępnego środowiska, ale nie użyłbym panelu CAS. Panel algebry i pasek wprowadzania powinny poprawnie wykonać zadanie. (Minęło trochę czasu, odkąd korzystałem z GGb online; moje wyobrażenie o tym może być nieaktualne.)
Joe
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.