Разница квадрата суммы


37

Найдите разницу между квадратом сумм и суммой квадратов.

Это математическое представление:

(n)2n2

Ваша программа / метод должны принимать два входа, это ваш нижний и верхний пределы диапазона, и они включены. Пределы будут целыми числами выше 0.

Ваша программа / метод должен вернуть ответ.

Вы можете использовать любую базу, которую пожелаете, но, пожалуйста, укажите в своем ответе, какую базу вы использовали.

Тестовый пример (база 10)

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

Это обычный код-гольф, поэтому чем короче ответ, тем лучше.


11
Мне потребовалось некоторое время, чтобы понять, что входные данные были конечными точками диапазона.
Брэд Гилберт b2gills

@ BradGilbertb2gills отредактировано для ясности
Джордж

Это проще, чем выглядит?
кошка

@cat что ты имеешь в виду под этим? Да, математика - это простая вещь Алевел. Но все зависит от того, как вы играете в гольф
Джордж

@george Вопрос и многие ответы делают его похожим на большую работу, но это не так
кошка

Ответы:


23

Python 2, 43 байта

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

Проверьте это на Ideone .

Как это работает

Вызовите функцию, определенную в спецификации g (a, b) . У нас есть это

Определите функцию f (x, y, s) рекурсивно следующим образом.

Применяя рекуррентное соотношение f (a, b, 0) к сумме b - a , мы можем показать это.

Это функция f реализации. Хотя b/aвозвращает ненулевое целое число, выполняется следующий код and, тем самым реализуя рекурсивное определение f .

После того, как b/aдостигает 0 , то есть , что B> и возвращает лямбда Ложные = 0 , таким образом , реализует базовый случай определения е .


Ах хорошо. Не могли бы вы объяснить свой метод?
Георгий

Я буду, но в настоящее время я пытаюсь играть в гольф немного больше.
Деннис

спасибо за формулу. Я думаю, я никогда не видел это так, потому что мы не покрываем суммы подобных серий в школе. Довольно интересно, хотя!
Георгий

2
@ Джордж, я закончил объяснение.
Деннис

Хочу рассказать нам немного больше о том, как в мире пришла в голову идея определить f! Мотивация! Я искренне заинтересован.
Муса Аль-Хасси

15

MATL , 9 байт

&:&*XRssE

Попробуйте онлайн!

объяснение

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

пример

Это частичные результаты каждой строки для входов 5и 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
Мне действительно нравится видеть частичные результаты. Они действительно помогают с пониманием программы. Спасибо, что включили их!
DanTheMan

10

Желе, 9 8 байт

rµS²_²S$

Попробуйте онлайн!

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

Спасибо FryAmTheEggman за байт!


3
На этот раз желе на самом деле очень читабельно.
Адам

Могу ли я раскошелиться на мой ответ?
Дрянная Монахиня

@ LeakyNun, что это значит?
Дверная ручка


6
Красивые серьги: S²_²S
Thomas Weller

10

Python 2, 45 байт

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

Решение для закрытой формы - не самое короткое, но я подумал, что в любом случае стоит опубликовать.

объяснение

Пусть p(n)будет п - го квадратного пирамидального числа , а t(n)быть п е треугольным числом . Тогда для n в диапазоне a , ..., b :

  • ∑n = t(b)-t(a-1)и
  • ²n² = p(b) - p(a-1)
  • Итак (∑n) ²-∑n² = (t(b)-t(a-1))² - (p(b) - p(a-1)).

Это выражение сводится к тому, что в коде.


Привет, не могли бы вы объяснить ваше уравнение, если это возможно. Моя версия на Python на 16 байт длиннее, и я не могу понять, как вы вывели свое уравнение
Джордж

1
@george Позвольте p(n)быть nth квадратным пирамидальным числом , и t(n)будет nth треугольным числом . Тогда это упрощенная версия (t(b)-t(a-1))^2 - (p(b) - p(a-1)).
Мартин Эндер

@MartinEnder Так что это точная формула, которую я использовал, но Sp3000 упростила ее так, что я не могу понять. Мой скрипт на python: (b * - ~ ba * ~ -a) ** 2 / 4- (b * - ~ b * (2 * b + 1) -a * ~ -a * (2 * a-1) ) / 6, если это имеет какое-либо значение. Я играл в гольф столько, сколько смогу, две формулы
Джордж

@george Иногда, с такими проблемами, самый простой способ - заставить Wolfram | Alpha выполнить утомительную часть, а затем дважды проверить, чтобы убедиться, что это правильно. Честно говоря, я не думаю, что мог бы вытащить (a-b-1)фактор сам (b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6по себе.
Sp3000

@ Sp3000 это отличный способ сделать это. Я попробую это в будущем
Джордж

6

05AB1E, 8 байтов

ŸDOnsnO-

Разъяснения

Ÿ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

Попробуйте онлайн


Может быть, 05AB1E - это версия желе ROT13? Замените r на Ÿ, µ на ​​D, S на O, ² на n, _ на s и $ на -.
Томас Уэллер

4
@ThomasWeller: На самом деле они совершенно разные. Общее смещение между некоторыми «функциями», скорее всего, совпадение. Jelly - это молчаливый язык о функциях связывания (afaik), а 05AB1E - это язык, основанный на стеке.
Эминья,

6

Mathematica, 21 байт

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

Безымянная функция, принимающая два аргумента и возвращающая разницу. Использование:

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

Здесь есть три небольших (и довольно стандартных) трюка для игры в гольф:

  • ##представляет оба аргумента одновременно, так что мы можем использовать префиксную нотацию для Range. Range@##является сокращением, для Range[##]которого расширяется Range[a, b]и дает нам широкий диапазон по мере необходимости.
  • Trдля трассировки, но использование его для вектора просто суммирует этот вектор, сохраняя три байта Total.
  • x.xявляется точечным произведением, сохраняющим четыре байта Tr[x^2].

Поможет Variance?
Утренняя монахиня

@LeakyNun Я не понимаю, как, потому что один из двух терминов Varianceразделен на, nа другой на, n^2и я не вижу простой способ отменить их по отдельности.
Мартин Эндер

1
Tr@#^2-#.#&@*Rangeтолько 18 байтов.
Миша Лавров

@ МишаЛавров аккуратно! Не стесняйтесь сделать это отдельным ответом. :)
Мартин Эндер

5

Лабиринт , 28 24 байта

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

Попробуйте онлайн!

объяснение

Поскольку в Лабиринте циклы, как правило, дороги, я решил, что явная формула должна быть кратчайшей, поскольку она может быть выражена в виде линейного кода.

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

Указатель инструкции затем попадает в тупик и должен развернуться. Когда он теперь сталкивается, /он пытается делить на ноль (поскольку дно стека неявно заполнено нулями), что завершает программу.


4

Haskell, 34 байта

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

Пример использования: 91 # 123-> 12087152.

Нечего объяснять.


3

Matlab, 30 29 28 байт

Использование идеи Сьювера normдает нам на 2 байта меньше

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

Старая (простая) версия:

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

3

Октава, 27 23 байта

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

Создает анонимную функцию с именем, ansкоторая принимает два входа:ans(lower, upper)

Демо онлайн

объяснение

Создает вектор строки от xдо y(включительно) и сохраняет его в z. Затем мы суммируем все элементы, используя sumквадраты ( ^2). Чтобы вычислить сумму квадратов, мы выполняем умножение матриц между вектором-строкой и его транспонированием. Это эффективно возведет в квадрат каждый элемент и подведет итоги. Затем мы вычитаем два.


3

Java, 84 77 символов, 84 77 байтов

Спасибо, на 7 байтов меньше благодаря Мартину Эндеру и FryAmTheEggMan.

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

Используя три контрольных примера в оригинальном посте: 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;
}

Процесс довольно очевиден. Я объявил две переменные для представления квадрата сумм и суммы квадратов и многократно увеличивал их соответственно. Наконец, я возвращаю вычисленную разницу.


Добро пожаловать в PPCG! Вы, вероятно , сохранить байт, полагая , что ++на f+=b*b++(так что вы можете оставить третий слот forпустой) , и вы также не должны площади eперед возвратом его (т.е. просто сделать return e*e-f).
Мартин Эндер

На самом деле, вместо того, чтобы оставить третий слот forпустым, переместите f+=b*b++туда, чтобы вы могли сэкономить как на точке с запятой, так и на скобках.
Мартин Эндер

Отличный улов @MartinEnder, спасибо :)
Mario Ishac

Также основанный на том, что имел в виду Мартин, это кажется немного короче.
FryAmTheEggman

1
Видимо, мой последний комментарий был неверным. На самом деле это особая часть грамматики Java: последний оператор for на самом деле является особым видом операторов, который называется списком выражений операторов. Это специальное утверждение может содержать несколько операторов, соединенных запятой. См. 14.14.1 (вам придется самостоятельно перемещаться туда, я не смог найти способ сделать более точную ссылку) спецификации языка.
FryAmTheEggman


3

JavaScript (ES6), 50 37 байт

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

Теперь порт решения @ Dennis ♦ Python.


Попробуйте использоватьn=>m=>eval(`for(s=t=0;n<=m;t+=n++)s+=n*n;t*t-s`)
Mama Fun Roll

@MamaFunRoll С другой стороны, я мог бы попробовать перенести решение Python Дениса ♦ ...
Нил

3

Фактор, 48 байтов

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

Анонимная функция.

[ 
  [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 байт

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

Обратите внимание, что

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

1
Вам не нужны парены вокруг i+1.
Волшебник Пшеницы

2
Также, если вы хотите поговорить о игре в гольф на Haskell и Haskell, вы можете присоединиться к нам в чате .
Пшеничный волшебник

3

Perl 6 ,  36 32  31 байт

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

Попробуй это

Объяснение:

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

Тест:

#! /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
Сохраните байт, перемещая назначение и уклоняясь от паренов:{$_=$^a..$^b;.sum²-[+] $_»²}
Фил Х

1
25 байтов:{.sum²-[+] $_»²}o&[..]
nwellnhof

2

Брахилог , 24 байта

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

Ожидает 2 числа в Input в виде списка, например [91:123].

объяснение

: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





1

CJam, 17 байт

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

Проверьте это здесь.

объяснение

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.

В качестве альтернативы можно просто сложить произведения всех различных пар (в основном умножив квадрат суммы и удалив квадраты), но это на байт длиннее:

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

1

PowerShell v2 +, 47 байт

Две вариации

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

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

В обоих случаях мы генерируем диапазон с помощью ..оператора, передавая его в цикл |%{...}. Каждая итерация, мы накапливая $oи $pлибо как сумма или сумма-квадратов. Затем мы вычисляем квадрат сумм с $o*$oи вычитаем $p. Вывод остается на конвейере и печать неявная.


1

JavaScript (ES6), 67 байт

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

Тестирование

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

Юлия, 25 байт

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

Это функция, которая принимает два целых числа и возвращает массив целых чисел 1x1.

Подход прост: создайте a UnitRangeиз конечных точек aи bназовите его x, затем суммируйте x, возведите в квадрат и вычтите его норму, которая вычисляется как transpose(x) * x.

Попробуйте онлайн! (включает все тестовые случаи)


1
a\b=-(x=a:b)'x+sum(x)^2сохраняет несколько байтов.
Деннис

1

TI-BASIC, 19 байтов

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

randIntNoRepполучает диапазон (тасуется). Остальное довольно понятно.


1

Fith , 52 байта

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

Это анонимная функция, которая берет два числа в стеке и оставляет одно число.

Объяснение:

{
    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
Если вам нравится постфикс, бессмысленное и основанное на стеке функциональное проргаммирование, вам может понравиться Фактор : D
кошка

1

GeoGebra, 91 байт

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)

Определяет функцию (возможно e(x,y)), которая вычисляет желаемую разницу.
a(x)вычисляет сумму натуральных чисел между 0и x.
b(x)вычисляет сумму квадратов натуральных чисел между 0и x.
c(x,y)сначала вычисляется сумма натуральных чисел между xи y, затем возводится в квадрат этой суммы.
d(x,y)вычисляет сумму квадратов между b(x)и b(y).
Последняя строка определяет функцию с несколькими переменными, которая завершает расчет. Функция автоматически присваивает имя, сохраняя несколько байтов.


Привет, как я могу вызвать функцию, которая это определяет? Я смог выяснить входные данные на geogebra.org/classic#cas , но не смог выяснить, как найти или вызвать финальную функцию.
sundar - Восстановить Монику

@sundar: последняя строка является выражением в x и y. Мы могли бы попытаться e(x,y)=дать ему имя, но, чтобы сохранить байты, мы не здесь. GeoGebra автоматически присваивает выражению имя (возможно, e, поскольку это следующая доступная буква). Сейчас у меня нет доступной среды, но я бы не использовал панель CAS. Панель алгебры и строка ввода должны работать правильно. (Прошло довольно много времени с тех пор, как я использовал GGb в сети; мой психологический образ может устареть.)
Джо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.