和的平方差


37

求和与平方和之差。

这是数学表达式:

(n)2n2

您的程序/方法应采用两个输入,这是范围的上限和下限,包括上限和下限。限制将是大于0的整数。

您的程序/方法应返回答案。

您可以使用任何基准,但是请在答案中说明使用的基准。

测试案例(基础10)

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

这是通常的代码高尔夫球,因此答案越短越好。


11
我花了一段时间才意识到输入是范围的终点。
布拉德·吉尔伯特b2gills

为清晰起见,@ BradGilbertb2gills编辑
乔治

这比看起来简单吗?

@cat是什么意思?是的,数学是简单的Alevel知识。但这完全
取决于

@george这个问题和许多答案使它看起来像很多工作,但事实并非如此
cat

Answers:


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> a,并且lambda返回False = 0,从而实现了f定义的基本情况。


啊好吧。你能解释一下你的方法吗?
乔治,

我会的,但是我目前正在尝试打更多的球。
丹尼斯

谢谢你的配方。我想我从来没有像那样看过它,因为我们在学校里不涵盖像这样的系列作品。虽然很有趣!
乔治,

2
@乔治我已经完成了解释。
丹尼斯

想要告诉我们更多关于世界上如何定义f的想法!动力!我真的很感兴趣
Musa Al-hassy

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

这些是输入59以下内容的每一行的部分结果:

  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

Python 2,45个字节

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

封闭式解决方案-不是最短的,但是我认为还是值得发布。

说明

p(n)n方形金字塔数t(n)n三角形数。然后,ñ在范围,...,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)n四角锥数,并且t(n)n三角形的数量。然后,这是的简化版本(t(b)-t(a-1))^2 - (p(b) - p(a-1))
Martin Ender

@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可能是Jelly的ROT13版本吗?将r替换为Ÿ,将µ替换为D,将S替换为O,将²替换为n,_替换为s,将$替换为-。
Thomas Weller

4
@ThomasWeller:它们实际上是完全不同的。一些“功能”之间的共同偏移很可能是巧合。Jelly是关于链接功能的默认语言(afaik),而05AB1E是基于堆栈的语言。
Emigna '16

6

Mathematica,21个字节

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

一个带有两个参数并返回差值的未命名函数。用法:

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

这里有三种小型(相当标准的)高尔夫技巧:

  • ##一次代表两个参数,因此我们可以对使用前缀表示法RangeRange@##是它的简写,Range[##]可以扩展到Range[a, b]所需的范围。
  • Tr用于跟踪,但在向量上使用它只是将向量求和,从而节省了三个字节Total
  • x.x是点积,在上节省了四个字节Tr[x^2]

Variance帮助吗?
Leaky Nun

@LeakyNun我不知道怎么做,因为其中的两个术语之一Variance被除以,n另一个被除,n^2而且我看不到一种简单的方法来分别撤消这些术语。
Martin Ender

1
Tr@#^2-#.#&@*Range只有18个字节。
Misha Lavrov

@MishaLavrov整洁!随时将其作为单独的答案。:)
Martin Ender

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字节

使用Suever的想法减少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)

在线演示

说明

从创建一个行向量xy(包括)并将其存储在中z。然后,我们使用sum和求和所有元素(^2)。为了计算平方和,我们在行向量及其转置之间执行矩阵乘法。这将有效地平方每个元素并汇总结果。然后,我们将两者相减。


3

Java,84 77个字符,84 77个字节

由于马丁·恩德(Martin Ender)和FryAmTheEggMan而少了7个字节,谢谢。

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

取消高尔夫:

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)。
Martin Ender

实际上,不要将第三个插槽for留空,而是将第三个插槽移到f+=b*b++那里,这样就可以节省分号和花括号。
Martin Ender

精彩@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另一方面,我可以尝试移植Dennis♦的Python解决方案...
Neil

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
节省一个字节来移动任务并逃避parens:{$_=$^a..$^b;.sum²-[+] $_»²}
Phil H

1
25个字节:{.sum²-[+] $_»²}o&[..]
nwellnhof

2

Brachylog,24个字节

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

期望Input中的2个数字作为列表,例如[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

2

APL,23 20字节

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

可在NARS2000中使用。


2

MATL,11个字节

&:ts2^w2^s-

在线尝试!

说明:

&:           #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个字节

s*M-F#^}FQ2

在线尝试!

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.

过滤器的用法很好。尽管已经有此任务的s*M.P}FQ2
内置插件


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

在这两种情况下,我们都是通过..运算符生成一个范围,并将其管道传递给loop |%{...}。每次迭代,我们都在累积$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

J,29个字节

诺布的果冻港。

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

用法

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

>>STDIN 在哪里,<<STDOUT 在哪里,x用于扩展精度。


1

Pyke,11个字节

h1:Ds]MXXs-

在这里尝试!

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

1

朱莉娅,25个字节

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

这是一个接受两个整数并返回1x1整数数组的函数。

方法很简单:构造一个UnitRange从端点ab并调用它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
如果你喜欢的后缀,点自由和基于栈的功能prorgamming你可能会喜欢的因素: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)计算和之间的自然数之0x
b(x)计算和之间的自然数的平方0x
c(x,y)首先计算和之间的自然数之xy,然后求和。
d(x,y)计算和之间的平方b(x)b(y)
最后一行定义了完成计算的多变量函数。该功能会自动分配一个名称,节省几个字节。


嗨,我怎么调用这个定义的函数?我能够在geogebra.org/classic#cas上找到输入,但无法找出如何查找或调用最终函数。
sundar-恢复莫妮卡

@sundar:最后一行是x和y中的表达式。我们可以e(x,y)=给它起一个名字,但是为了保存字节,我们不在这里。GeoGebra自动为表达式分配一个名称(可能是e,因为这是下一个可用的字母)。我现在没有可用的环境,但是我不会使用CAS窗格。代数窗格和输入栏应正确执行此工作。(自从我在线使用GGb以来已经有一段时间了;我对它的心理印象可能已经过时了。)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.