序列的平衡指数


10

序列的平衡索引是这样的索引,即较低索引处的元素之和等于较高索引处的元素之和。例如,在序列A中:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3是均衡指数,因为:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6也是一个均衡指数,因为:

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

(零元素的总和为零)7不是均衡索引,因为它不是序列A的有效索引。

想法是创建一个给定序列(数组)的程序,并返回其平衡指数(任意);如果不存在平衡指数,则返回-1。

Answers:


6

高尔夫脚本17 16

由于未指定输入形式,因此它将取自stdin的Golfscript数组格式的字符串。

~0\{1$+.@+\}/])?

所以像

golfscript.ry eqindex.gs <<<"[-7 1 5 2 -4 3 0]"

这个想法很简单:它需要一个数组A_i并映射到数组,A_i + 2 SUM_{j<i} A_j然后寻找等于整个数组之和的第一个索引。


对于@mellamokb的挑战,我提供:

~0\{1$+.@+\}/:S;]:A,,{A=S=},`

为29个字符。


由于您很容易找到最短的解决方案,因此我宣布您必须返回所有索引,而不仅仅是第一个:)
mellamokb 2011年

@mellamokb,谢谢我。
彼得·泰勒

凉!现在,我还有更多的GolfScript学习要做...
mellamokb 2011年

5

Python-72个字符

A=input()
print[i for i in range(len(A))if sum(A[:i])==sum(A[i+1:])]or-1

接受逗号分隔的输入


太棒了...这个返回所有平衡指标...真的很酷。
克里斯蒂安(Cristian)

@克里斯蒂安:我的也是。
FUZxxl 2011年

我知道了:)我实际上不知道如何运行haskell代码...将不得不学习。
克里斯蒂安(Cristian)

克里斯蒂安:有ghc,一个编译器,一个拥抱,一个解释器。我建议下载拥抱。最好下载ghc,因为拥抱约为7 MiB,而整个ghc发行版约为300 MiB。使用拥抱,您只需键入runhugs FILE.hs即可运行program FILE.hs
FUZxxl 2011年

5

哈斯克尔(95 83)

e l=[n|n<-[0..length l-1],sum(take n l)==sum(drop(n+1)l)]
main=interact$show.e.read

例如,从stdin读取Haskell样式的列表。

[-7,1,5,2,-4,3,0]

并返回索引的Haskell样式列表,例如。

[3,6]

[]如果没有索引,则结果为。

如果您的规格想要其他行为,请告诉我。

编辑:

  • (95→83):列表理解更简洁

4

C-96

a[99],*p=a,s;main(){for(;scanf("%d",p)>0;s+=*p++
);for(;p>a;s-=*p)(s-=*--p)||printf("%d\n",p-a);}

请注意,这将以相反的顺序打印平衡指数。

用法示例:

$ ./equilibrium <<< "-7 1 5 2 -4 3 0"
6
3

3

红宝石(83 77)

a=*$<.map(&:to_i)
p (0...a.size).select{|x|a[0..x].reduce(:+)==a[x..-1].reduce(:+)}

编辑:Ventero建议的较短版本:

a=$<.map &:to_i
p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}

输入是每行一个数字,输出是用逗号分隔的方括号中的索引列表。


1
您不需要第一行的括号,并且可以通过使用join + eval来获取总和以节省一些字符:(p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}请注意,这是针对Ruby 1.9的,因为它使用字符文字作为字符串)
Ventero

很好的建议,谢谢!有点烦人的是Array#sum不在Ruby核心中。
拉尔斯·豪格斯

如果我在第一行中删除了括号,则会得到:“ SyntaxError:(irb):17:语法错误,意外的tAMPER,期望$ end”
Lars Haugseth 2011年

map与符号之间必须有一个空格。而且您不需要splat运算符放在$<任何一个的前面,因此所有代码行看起来都是这样的:a=$<.map &:to_i。;)
Ventero's

嗯,再次感谢您,是因为splat破坏了语法。
拉尔斯·豪格斯

2

的JavaScript(161)

P=parseInt;L=prompt().split(',');S=function(A)A.reduce(function(a,b)P(a)+P(b),0);R=[i for(i in L)if(S(L.slice(0,i))==S(L.slice(P(i)+1)))];alert(R.length>0?R:-1);

http://jsfiddle.net/6qYQv/1/


2

斯卡拉108

val l=readline().split(" ").map(w=>w.toInt)
for(i<-0 to l.length-1
if l.take(i).sum==l.drop(i+1).sum)yield i

2

J(12个字符)

隐含符号的单子动词,返回平衡索引的向量。插入的空格仅供参考。

[: I. +/\. = +/\

为了解释这一点,首先要观察它的明确定义。y是形式参数:

3 : 'I. (+/\. y) = (+/\ y)'
  • +添加其参数。/是一个副词,它在它的right参数的成员之间插入其左侧的动词,例如+/ 1 2 3 4与相同1 + 2 + 3 + 4
  • \是一个副词,将其左侧的动词应用于其右侧参数的所有前缀。例如,通过<在其参数周围绘制一个框,可以<\ 1 2 3 4产生

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • 因此,+/\为其右参数的每个前缀计算总和。

  • \.就像,\但是使用后缀而不是前缀。因此,+/\.计算后缀和的向量。
  • =对参数进行逐项比较。例如,1 1 3 3 = 1 2 3 4yields 1 0 1 0
  • 因此,(+/\. y) = (+/\ y)对于后缀总和等于前缀总和或创建平衡的所有索引,均得出一个。
  • 对于零和I.一的向量,返回索引包含该向量的向量。

1

Python 2,70

A=input()
e=i=s=0
for x in A:e=[e,~i][s*2==sum(A)-x];s+=x;i+=1
print~e

这个想法是跟踪运行总和,s并检查它是否是不包含当前元素的数组之和的一半,因此等于当前元素之后的数组之和。如果是这样,我们将平衡指数更新为当前指数。最后一个平衡指数被打印,-1如果没有,则显示初始值。

实际上,我们存储平衡指数的位补码,以便可以将其初始化为0。


0

Python-114

i=map(lambda x:int(x),raw_input().split(" "));x=0
print map(lambda x:(sum(i[0:x])==sum(i[x+1::])),range(0,len(i)))

蟒蛇-72

i=input()
print map(lambda x:sum(i[0:x])==sum(i[x+1::]),range(0,len(i)))

打印给定索引是否为平衡索引,不显示数组平衡处的整数指标。


你是什​​么意思坏了?6是平衡指数,因为它之前的项目总和为零,之后的项目没有总和,而50被忽略。
乔伊·亚当斯

啊。感谢乔伊的澄清,我没有意识到应该忽略x处的值。
2011年

0

PHP,134个字符

<?for($a=explode(",",fgets(STDIN));++$i<($c=count($a));$o.=$s==0?$i:"")for($n=$s=0;$n<$c;)$s+=$n<$i?$a[$n++]:-$a[++$n];echo$o?$o:"-1";

我很想知道这远非最佳的PHP高尔夫运动,但是用光了(大脑)。至少比array_sum和array_splice短:-)


0

PHP(81)

for($i=count($a)-1,$c=0;$i+1&&$c!=(array_sum($a)-$a[$i])/2;$c+=$a[$i--]);echo $i;

http://3v4l.org/qJvhO

由于未指定任何输入,因此需要使用数组作为变量来初始化$a

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.