서열의 평형 지수


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

(0 원소의 합이 0 임) 7은 시퀀스 A의 유효한 인덱스가 아니기 때문에 평형 인덱스가 아닙니다.

아이디어는 시퀀스 (배열)를 부여하고 평형 지수 (any)를 반환하거나 평형 지수가 존재하지 않으면 -1을 반환하는 프로그램을 만드는 것입니다.

답변:


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

내 칭찬과 함께 @mellamokb.
피터 테일러

멋있는! 이제 GolfScript를 배우는 방법이 더 있습니다.
mellamokb

5

파이썬-72 자

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

쉼표로 구분 된 입력을받습니다.


굉장합니다 ... 이것은 모든 평형 지수를 반환합니다 ... 정말 멋지다.
Cristian

@Christian : 저도 그렇게합니다.
FUZxxl

나는 참조 :) 나는 실제로 haskell 코드를 실행하는 방법을 모른다 ... 공부해야 할 것이다.
Cristian

Christian : 컴파일러 인 ghc가 있고 통역사 인 포옹이 있습니다. 포옹을 다운로드하는 것이 좋습니다 . 포옹은 약 7MiB이고 전체 ghc 배포판은 약 300MiB이기 때문에 ghc를 다운로드하는 것이 좋습니다. 포옹을 사용하면 runhugs FILE.hsprogram을 실행하기 위해 입력 할 수 있습니다 FILE.hs.
FUZxxl

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]

하스켈 스타일의 인덱스 목록을 반환합니다.

[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
: 당신은 첫 번째 줄에 괄호가 필요하지 않습니다, 당신은 합계를 얻기 위해 + 평가를 조인을 사용하여 몇 개의 문자를 저장할 수 있습니다 p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(이 문자열로 문자 리터럴을 사용하기 때문에,이 루비 1.9에 대한 것을 참고)
Ventero 사용자

좋은 제안, 감사합니다! Array # sum이 Ruby 코어에 없다는 것이 짜증납니다.
Lars Haugseth

첫 번째 줄에서 패러 틴을 제거하면 "SyntaxError : (irb) : 17 : 구문 오류, 예기치 않은 tAMPER, $ end가 예상됩니다"
Lars Haugseth

map와 앰퍼샌드 사이에는 공간이 있어야합니다 . 그리고 $<어느 쪽이든 앞에 splat 연산자가 필요하지 않으므로 모든 줄의 모든 것이 다음과 같습니다 a=$<.map &:to_i. ;)
Ventero

아, 다시 한번 감사합니다. 구문을 망친 것은 표시였습니다.
Lars Haugseth

2

자바 스크립트 (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)'
  • +인수를 추가합니다. /는 오른쪽 인수의 멤버 사이에 왼쪽 동사를 삽입하는 부사입니다 (예 : +/ 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)접미사 합계가 접두사 합계와 같거나 평형이 만들어지는 모든 인덱스에 대해 1을 산출합니다.
  • 0과 1 I.로 구성된 벡터의 경우 벡터가 1을 포함하는 인덱스의 벡터를 반환합니다.

1

파이썬 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

파이썬-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은 균형 지수로, 그 이전의 항목은 0으로 합쳐지고 그 이후에는 항목이 없으며 50은 무시되기 때문에 평형 지수입니다.
Joey Adams

아. 명확한 조이 덕분에 x의 값이 무시되어야한다는 것을 알지 못했습니다.
도착

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.