求和与平方和之差。
这是数学表达式:
您的程序/方法应采用两个输入,这是范围的上限和下限,包括上限和下限。限制将是大于0的整数。
您的程序/方法应返回答案。
您可以使用任何基准,但是请在答案中说明使用的基准。
测试案例(基础10)
5,9 970
91,123 12087152
1,10 2640
这是通常的代码高尔夫球,因此答案越短越好。
求和与平方和之差。
这是数学表达式:
您的程序/方法应采用两个输入,这是范围的上限和下限,包括上限和下限。限制将是大于0的整数。
您的程序/方法应返回答案。
您可以使用任何基准,但是请在答案中说明使用的基准。
测试案例(基础10)
5,9 970
91,123 12087152
1,10 2640
这是通常的代码高尔夫球,因此答案越短越好。
Answers:
f=lambda a,b,s=0:b/a and 2*a*s+f(a+1,b,s+a)
调用规范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定义的基本情况。
&:&*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
以下内容的每一行的部分结果:
&:
5 6 7 8 9
&:&*
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
&:&*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
&:&*XRss
485
&:&*XRssE
970
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一个字节!
lambda a,b:(a+~b)*(a-b)*(3*(a+b)**2+a-b-2)/12
封闭式解决方案-不是最短的,但是我认为还是值得发布。
设p(n)
第n个方形金字塔数,t(n)
第n个三角形数。然后,ñ在范围一,...,b:
t(b)-t(a-1)
和p(b) - p(a-1)
(t(b)-t(a-1))² - (p(b) - p(a-1))
。该表达式简化为代码中的表达式。
(a-b-1)
摆脱这一因素(b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6
。
Ÿ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
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
帮助吗?
Variance
被除以,n
另一个被除,n^2
而且我看不到一种简单的方法来分别撤消这些术语。
Tr@#^2-#.#&@*Range
只有18个字节。
?:?:}+=-:(:(#{:**+**#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. [ | ]
指令指针然后陷入死胡同,必须转身。现在遇到/
它时,它将尝试除以零(因为堆栈的底部隐含了零),这将终止程序。
由于马丁·恩德(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;
}
过程是不言自明的。我声明了两个变量来表示总和的平方和平方和,并适当地反复增加它们。最后,我返回计算出的差异。
++
上f+=b*b++
(这样你就可以离开的第三个插槽for
为空),你也不必方e
返回之前(即只是做return e*e-f
)。
for
留空,而是将第三个插槽移到f+=b*b++
那里,这样就可以节省分号和花括号。
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`)
[ [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
]
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
注意
i+1
。
{([+] $_=@_[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
{$_=$^a..$^b;.sum²-[+] $_»²}
{.sum²-[+] $_»²}o&[..]
: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
&: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
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*{)-},::*:+
两种变化
param($n,$m)$n..$m|%{$o+=$_;$p+=$_*$_};$o*$o-$p
$args-join'..'|iex|%{$o+=$_;$p+=$_*$_};$o*$o-$p
在这两种情况下,我们都是通过..
运算符生成一个范围,并将其管道传递给loop |%{...}
。每次迭代,我们都在累积$o
,$p
即为总和或平方和。然后,我们使用$o*$o
和减去求和的平方$p
。输出留在管道上,并且打印是隐式的。
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 + 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
}
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)
。
最后一行定义了完成计算的多变量函数。该功能会自动分配一个名称,节省几个字节。
e(x,y)=
给它起一个名字,但是为了保存字节,我们不在这里。GeoGebra自动为表达式分配一个名称(可能是e,因为这是下一个可用的字母)。我现在没有可用的环境,但是我不会使用CAS窗格。代数窗格和输入栏应正确执行此工作。(自从我在线使用GGb以来已经有一段时间了;我对它的心理印象可能已经过时了。)