Diferença do quadrado da soma

37

Encontre a diferença entre o quadrado da soma e a soma dos quadrados.

Esta é a representação matemática:

(n)2n2

Seu programa / método deve receber duas entradas, esses são os limites inferior e superior da faixa e são inclusivos. Os limites serão inteiros inteiros acima de 0.

Seu programa / método deve retornar a resposta.

Você pode usar qualquer base que desejar, mas indique em sua resposta qual base você usou.

Caso de teste (Base 10)

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

Este é o código-golfe habitual, portanto, quanto menor a resposta, melhor.

George
fonte
11
Demorei um pouco para perceber que a entrada era o ponto final de um intervalo.
Brad Gilbert b2gills
@ BradGilbertb2gills editada para maior clareza
george
Isso é mais simples do que parece?
cat
@cat, o que você quer dizer com isso? Sim, a matemática é simples. Mas tudo se resume a como você golf-lo
george
@george A pergunta e muitas das respostas fazer parecer um monte de trabalho, mas é não
cat

Respostas:

23

Python 2, 43 bytes

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

Teste em Ideone .

Como funciona

Chame a função definida na especificação g (a, b) . Nós temos isso

Defina a função f (x, y, s) recursivamente da seguinte maneira.

Aplicando a relação de recorrência de f (a, b, 0) um total de b - a vezes, podemos mostrar isso.

Essa é a função f da implementação. Enquanto b/aretorna um número inteiro diferente de zero, o código a seguir andé executado, implementando a definição recursiva de f .

Uma vez que b/aatinge 0 , temos que b> a e os lambda retorna Falso = 0 , implementando assim o caso base da definição de f .

Dennis
fonte
Ah ok. Você poderia explicar seu método?
george
Vou, mas atualmente estou tentando jogar um pouco mais.
Dennis
obrigado pela fórmula. Acho que nunca vi isso assim, porque não cobrimos somas de séries como essa na escola. Muito interessante!
george
2
@george Eu terminei a explicação.
Dennis
Quer nos contar um pouco mais sobre como no mundo a idéia de definir f veio à sua mente! A motivação! Estou genuinamente interessado.
Musa Al-hassy
15

MATL , 9 bytes

&:&*XRssE

Experimente online!

Explicação

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

Exemplo

Estes são os resultados parciais de cada linha para entradas 5e 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
    
Luis Mendo
fonte
7
Eu realmente gosto de ver os resultados parciais. Eles realmente ajudam a entender o programa. Obrigado por incluí-los!
precisa
10

Geléia, 9 8 bytes

rµS²_²S$

Experimente online!

r         inclusive range from first input to second input
 µ        pass the range to a new monadic chain
  S       the sum
   ²      squared
    _     minus...
     ²S$  the squares summed

Obrigado a FryAmTheEggman por um byte!

Maçaneta da porta
fonte
3
Pela primeira vez, Jelly é realmente muito legível.
Adám
Posso colocar isso na minha resposta?
Leaky Nun
@LeakyNun, o que isso significa?
Maçaneta
Isso .
Leaky Nun
6
Brincos bonitos: S²_²S
Thomas Weller
10

Python 2, 45 bytes

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

Solução de formulário fechado - não a mais curta, mas achei que valeria a pena postar de qualquer maneira.

Explicação

Vamos p(n)ser o n º número piramidal quadrado , e t(n)ser o n º número triangular . Então, para n acima do intervalo a , ..., b :

  • =n = t(b)-t(a-1)e
  • ∑n² = p(b) - p(a-1)
  • Então (∑n) ²-∑n² = (t(b)-t(a-1))² - (p(b) - p(a-1)).

Essa expressão se reduz à do código.

Sp3000
fonte
Oi, você poderia explicar sua equação, se possível. Minha versão python é 16 bytes mais e eu não consigo descobrir como você deriva sua equação
george
11
@george Seja p(n)o número piramidal quadradon th e o número triangular th . Então esta é uma versão simplificada do . t(n)n(t(b)-t(a-1))^2 - (p(b) - p(a-1))
Martin Ender
@MartinEnder Essa é a fórmula exata que eu usei, mas o Sp3000 a simplificou de uma maneira que não consigo entender. Meu script python é: (b * - ~ ba * ~ -a) ** 2/4 (b * - ~ b * (2 * b + 1) -a * ~ -a * (2 * a-1) ) / 6, se isso for útil. Eu tenho golfed tanto quanto eu puder os dois fórmula
george
@george Às vezes, com problemas como esses, a maneira mais fácil é fazer com que o Wolfram | Alpha faça a parte tediosa e depois verifique novamente para garantir que está certo. Para ser sincero, acho que não poderia ter conseguido extrair o (a-b-1)fator (b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6sozinho.
Sp3000
@ Sp3000 é uma ótima maneira de fazer isso. Eu vou tentar isso no futuro #
2113 george
6

05AB1E, 8 bytes

ŸDOnsnO-

Explicado

Ÿ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

Experimente online

Emigna
fonte
05AB1E é uma versão ROT13 do Jelly, talvez? Substitua r por Ÿ, µ por D, S por O, ² por n, _ por s e $ por -.
Thomas Weller
4
@ ThomasWeller: Eles são bem diferentes, na verdade. Um deslocamento comum entre algumas "funções" provavelmente é coincidente. Jelly é uma linguagem tácita sobre funções de encadeamento (afaik), enquanto 05AB1E é uma linguagem baseada em pilha.
Emigna
6

Mathematica, 21 bytes

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

Uma função sem nome, recebendo dois argumentos e retornando a diferença. Uso:

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

Há três pequenos truques de golfe (e bastante padrão) aqui:

  • ##representa os dois argumentos de uma só vez, para que possamos usar a notação de prefixo para Range. Range@##é uma abreviação para a Range[##]qual se expande Range[a, b]e nos fornece um intervalo inclusivo, conforme necessário.
  • Tré para rastreamento, mas usá-lo em um vetor simplesmente soma esse vetor, economizando três bytes Total.
  • x.xé um produto escalar, economizando quatro bytes Tr[x^2].
Martin Ender
fonte
Será que Varianceajuda?
Leaky Nun
@LeakyNun Não vejo como, porque um dos dois termos Varianceé dividido por noutro n^2e não vejo uma maneira fácil de desfazê-los separadamente.
Martin Ender
11
Tr@#^2-#.#&@*Rangetem apenas 18 bytes.
Misha Lavrov #
@MishaLavrov neat! Sinta-se livre para fazer uma resposta separada. :)
Martin Ender
5

Labirinto , 28 24 bytes

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

Experimente online!

Explicação

Como os loops tendem a ser caros no Labirinto, imaginei que a fórmula explícita deveria ser mais curta, pois pode ser expressa como código linear.

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

O ponteiro de instruções atinge um beco sem saída e precisa se virar. Quando encontra agora /, tenta uma divisão por zero (uma vez que a parte inferior da pilha está implicitamente preenchida com zeros), que finaliza o programa.

Martin Ender
fonte
4

Haskell, 34 bytes

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

Exemplo de uso: 91 # 123-> 12087152.

Nada a explicar.

nimi
fonte
3

Matlab, 30 29 28 bytes

Usar a idéia de Suever normnos dá 2 bytes a menos

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

Versão antiga (simples):

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

Oitava, 27 23 bytes

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

Cria uma função anônima chamada ansque aceita duas entradas:ans(lower, upper)

Demo Online

Explicação

Cria um vetor de linha de xpara y(inclusive) e o armazena z. Em seguida, somamos todos os elementos usando sume o usamos ao quadrado ( ^2). Para calcular a soma dos quadrados, realizamos a multiplicação de matrizes entre o vetor de linha e sua transposição. Isso efetivamente quadrará cada elemento e resumirá o resultado. Subtraímos os dois.

Suever
fonte
3

Java, 84 77 caracteres, 84 77 bytes

7 bytes menor devido a Martin Ender e FryAmTheEggMan, obrigado.

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

Usando os três casos de teste na postagem original: 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;
}

Processo é bastante auto-explicativo. Declarei duas variáveis ​​para representar o quadrado das somas e a soma dos quadrados e as incrementei repetidamente de forma apropriada. Finalmente, retorno a diferença calculada.

Mario Ishac
fonte
Bem-vindo ao PPCG! Provavelmente, você pode salvar um byte colocando ++-o f+=b*b++(para deixar o terceiro slot forvazio) e também não precisa ajustar o quadrado eantes de devolvê-lo (ou seja, basta return e*e-f).
Martin Ender
Na verdade, em vez de deixar o terceiro espaço forvazio, mova o f+=b*b++para lá, para economizar tanto o ponto-e-vírgula quanto o aparelho.
Martin Ender
Grande captura @MartinEnder, obrigado :)
Mario Ishac
Também com base no que Martin tinha em mente, isso parece ser um pouco menor.
FryAmTheEggman
11
Aparentemente, meu último comentário estava incorreto. Na verdade, é uma parte especial da gramática Java: a instrução final de a é na verdade um tipo especial de instrução, que é chamado de lista de expressões de instrução. Esta declaração especial pode ter mais de uma declaração unida por vírgula. Veja 14.14.1 (você terá que navegar até lá, não encontrei uma maneira de criar um link mais preciso) da especificação de idioma.
FryAmTheEggman
3

JavaScript (ES6), 46 bytes

f=(x,y,s=0,p=0)=>x<=y?f(x+1,y,s+x,p+x*x):s*s-p
Washington Guedes
fonte
3

JavaScript (ES6), 50 37 bytes

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

Agora, um porto da solução Python de @ Dennis ♦.

Neil
fonte
Tente usarn=>m=>eval(`for(s=t=0;n<=m;t+=n++)s+=n*n;t*t-s`)
Mama Fun Roll
@MamaFunRoll Por outro lado, eu poderia tentar portar a solução Python de Dennis ♦ ...
Neil
3

Fator, 48 bytes

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

Uma função anônima.

[ 
  [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
]
gato
fonte
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

Observe que

(k=mnk)2-k=mnk2==k1 1=mnk2=mk2k1 1nk1 1k2=k1 1=mnk2=k1 1+1 1n2k1 1k2
Rodrigo de Azevedo
fonte
11
Você não precisa de parênteses por aí i+1.
Wheat Wizard
2
Além disso, se você quiser conversar sobre golfe Haskell e Haskell, pode se juntar a nós na sala de bate-papo .
Wheat Wizard
3

Perl 6 ,  36 32  31 bytes

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

Teste-o

Explicação:

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

Teste:

#! /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
Brad Gilbert b2gills
fonte
11
Salvar um byte movendo a atribuição e fugir parênteses:{$_=$^a..$^b;.sum²-[+] $_»²}
Phil H
11
25 bytes:{.sum²-[+] $_»²}o&[..]
nwellnhof 5/11
2

Braquilog , 24 bytes

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

Espera os 2 números em Entrada como uma lista, por exemplo [91:123].

Explicação

: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
Fatalizar
fonte
2

APL, 23 20 bytes

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

Trabalha em NARS2000.

Adão
fonte
2

MATL, 11 bytes

&:ts2^w2^s-

Experimente online!

Explicação:

&:           #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
DJMcMayhem
fonte
2

Pitão, 11 bytes

s*M-F#^}FQ2

Experimente 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.
Freira Furada
fonte
Bom uso do filtro. Embora já exista um build-in para esta tarefa:s*M.P}FQ2
Jakube
2

Japonês, 10 bytes

õV
x²aUx ²

Tente

Shaggy
fonte
1

CJam, 17 bytes

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

Teste aqui.

Explicação

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.

Como alternativa, pode-se somar os produtos de todos os pares distintos (basicamente multiplicando o quadrado da soma e removendo os quadrados), mas isso é um byte mais longo:

q~),>2m*{)-},::*:+
Martin Ender
fonte
1

PowerShell v2 +, 47 bytes

Duas variações

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

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

Nos dois casos, estamos gerando um intervalo com o ..operador, canalizando isso para um loop |%{...}. A cada iteração, estamos acumulando $oe $pcomo a soma ou a soma dos quadrados. Em seguida, calculamos o quadrado das somas com $o*$oe subtraímos $p. A saída é deixada no pipeline e a impressão está implícita.

AdmBorkBork
fonte
1

JavaScript (ES6), 67 bytes

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

Suíte de teste

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

Patrick Roberts
fonte
1

J, 29 bytes

Resposta da Geléia do Porto da Maçaneta .

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

Uso

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

Onde >>está STDIN, <<está STDOUT e xé para maior precisão.

Freira Furada
fonte
1

Pyke, 11 bytes

h1:Ds]MXXs-

Experimente aqui!

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

Julia, 25 bytes

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

Essa é uma função que aceita dois números inteiros e retorna uma matriz inteira 1x1.

A abordagem é simples: construa a UnitRangepartir dos pontos finais ae bchame-a x, depois some x, quadrada e subtraia sua norma, que é calculada como transpose(x) * x.

Experimente online! (inclui todos os casos de teste)

Alex A.
fonte
11
a\b=-(x=a:b)'x+sum(x)^2 salva alguns bytes.
Dennis
1

TI-BASIC, 19 bytes

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

randIntNoRepobtém o intervalo (embaralhado). O resto é bastante auto-explicativo.

Conor O'Brien
fonte
1

Quinto , 52 bytes

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

Essa é uma função anônima que pega os dois números na pilha e deixa um único número.

Explicação:

{
    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
}
bkul
fonte
11
Se você gosta de postfix, e sem ponto de pilha à base de prorgamming funcional que você pode gostar Fator : 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)

Define uma função (provavelmente e(x,y)) que calcula a diferença desejada.
a(x)calcula a soma dos números naturais entre 0e x.
b(x)calcula a soma dos quadrados dos números naturais entre 0e x.
c(x,y)primeiro calcula a soma dos números naturais entre xe y, em seguida, esquadrinha essa soma.
d(x,y)calcula a soma dos quadrados entre b(x)e b(y).
A última linha define uma função multivariável que termina o cálculo. A função recebe um nome automaticamente, economizando alguns bytes.

Joe
fonte
Oi, como chamo a função que isso define? Consegui descobrir a entrada em geogebra.org/classic#cas , mas não consegui descobrir como encontrar ou chamar a função final.
sundar - Restabelece Monica
@ Sundar: A última linha é uma expressão em x e y. Poderíamos acrescentar e(x,y)=um nome a ele, mas, para salvar bytes, não o fazemos aqui. O GeoGebra atribui automaticamente à expressão um nome (provavelmente e, já que essa é a próxima letra disponível). Não tenho o ambiente disponível no momento, mas não usaria o painel CAS. O painel de álgebra e a barra de entrada devem fazer o trabalho corretamente. (Faz um tempo desde que eu usei o GGb online; minha imagem mental dele pode estar desatualizada.)
Joe