Chỉ số cân bằng của một chuỗi


10

Chỉ số cân bằng của chuỗi là một chỉ số sao cho tổng các phần tử ở các chỉ số thấp hơn bằng tổng các phần tử ở các chỉ mục cao hơn. Ví dụ: trong chuỗi A:

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

3 là một chỉ số cân bằng, bởi vì:

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

6 cũng là một chỉ số cân bằng, bởi vì:

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

(tổng các phần tử bằng 0) 7 không phải là chỉ số cân bằng, bởi vì nó không phải là chỉ số hợp lệ của chuỗi A.

Ý tưởng là tạo ra một chương trình đưa ra một chuỗi (mảng), trả về chỉ số cân bằng của nó (bất kỳ) hoặc -1 nếu không có chỉ số cân bằng tồn tại.

Câu trả lời:


6

Golfscript 17 16

Vì hình thức đầu vào không được chỉ định, nên chuỗi này có một chuỗi ở định dạng mảng Golfscript từ stdin.

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

Vì vậy, chạy như vd

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

Ý tưởng rất đơn giản: nó lấy một mảng A_ivà ánh xạ tới một mảng A_i + 2 SUM_{j<i} A_jvà sau đó tìm chỉ mục đầu tiên bằng tổng của toàn bộ mảng.


Đối với thử thách của @ mellamokb, tôi đưa ra:

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

cho 29 ký tự.


Vì bạn dễ dàng có giải pháp ngắn nhất, tôi tuyên bố bạn phải trả lại tất cả các chỉ mục, không chỉ là chỉ số đầu tiên :)
mellamokb

@mellamokb, với lời khen của tôi.
Peter Taylor

Mát mẻ! Bây giờ tôi đã có thêm một số cách học GolfScript để làm ...
mellamokb

5

Python - 72 ký tự

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

Có đầu vào được phân tách bằng dấu phẩy


Tuyệt vời ... cái này trả về tất cả các chỉ số cân bằng ... thực sự tuyệt vời.
Cristian

@Christian: Của tôi cũng vậy.
FUZxxl

Tôi hiểu rồi :) Tôi thực sự không biết cách chạy mã haskell ... sẽ phải học.
Cristian

Christian: Có ghc, một trình biên dịch và những cái ôm, một thông dịch viên. Tôi đề nghị tải về những cái ôm . Tốt hơn hết là tải xuống ghc, vì ôm khoảng 7 MiB, trong khi toàn bộ phân phối ghc là khoảng 300 MiB. Sử dụng những cái ôm, bạn chỉ có thể gõ runhugs FILE.hsđể chạy chương trình FILE.hs.
FUZxxl

5

Haskell ( 95 83)

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

Đọc một danh sách theo kiểu Haskell từ stdin, vd.

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

và trả về một danh sách kiểu Haskell của các chỉ số, vd.

[3,6]

Kết quả là [], nếu không có chỉ số.

Xin vui lòng cho tôi biết, nếu spec của bạn muốn một hành vi khác.

Chỉnh sửa:

  • (95 → 83): danh sách hiểu được nhiều hơn

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);}

Lưu ý rằng điều này in các chỉ số cân bằng theo thứ tự ngược lại.

Sử dụng mẫu:

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

3

Ruby (83 77)

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

Chỉnh sửa: Phiên bản ngắn hơn theo đề xuất của Ventero:

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

Đầu vào là một số trên mỗi dòng, đầu ra là danh sách chỉ mục được phân tách bằng dấu phẩy trong ngoặc vuông.


1
Bạn không cần dấu ngoặc đơn trong dòng đầu tiên và bạn có thể lưu một vài ký tự bằng cách sử dụng phép nối + eval để lấy các khoản tiền: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(lưu ý rằng đây là cho Ruby 1.9, vì nó sử dụng ký tự bằng ký tự làm chuỗi)
Ventero

Gợi ý tuyệt vời, cảm ơn! Loại phiền toái mà Array # sum không có trong lõi Ruby.
Lars Haugseth

Nếu tôi loại bỏ các dấu hiệu trong dòng đầu tiên, tôi nhận được: "Cú pháp: (irb): 17: lỗi cú pháp, tAMPER bất ngờ, mong đợi $ end"
Lars Haugseth

Phải có một khoảng trống giữa mapvà ký hiệu. Và bạn không cần toán tử splat ở phía trước $<, vì vậy tất cả trong tất cả các dòng sẽ trông như thế này : a=$<.map &:to_i. ;)
Ventero

À, cảm ơn lần nữa, chính cái splat đã phá hỏng cú pháp.
Lars Haugseth

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

J (12 ký tự)

Một động từ đơn âm trong ký hiệu ngầm trả về một vectơ của các chỉ số cân bằng. Không gian chèn chỉ cho mức độ dễ đọc.

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

Để giải thích điều này, trước tiên hãy quan sát định nghĩa rõ ràng của nó; ylà tham số chính thức:

3 : 'I. (+/\. y) = (+/\ y)'
  • +thêm các đối số của nó. /là một trạng từ chèn động từ bên trái của nó vào giữa các thành viên của đối số bên phải của nó, ví dụ như +/ 1 2 3 4giống như 1 + 2 + 3 + 4.
  • \là một trạng từ áp dụng động từ ở bên trái cho tất cả các tiền tố của tiền tố bên phải của nó. Ví dụ, với <việc vẽ một hộp xung quanh đối số của nó, sẽ <\ 1 2 3 4tạo ra

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • Do đó, +/\tính toán cho mỗi tiền tố của đối số đúng của nó tổng.

  • \.giống như \nhưng hoạt động trên hậu tố thay vì tiền tố. Do đó, +/\.tính một vectơ tổng các hậu tố.
  • =thực hiện so sánh mục khôn ngoan của các đối số của nó. Ví dụ, 1 1 3 3 = 1 2 3 4sản lượng 1 0 1 0.
  • Do đó, (+/\. y) = (+/\ y)mang lại một cho tất cả các chỉ số mà tại đó tổng hậu tố bằng tổng tiền tố hoặc, một trạng thái cân bằng được tạo ra.
  • Đối với các vectơ số 0 và số 0, I.trả về một vectơ của các chỉ số mà vectơ chứa một vectơ.

1

Con trăn 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

Ý tưởng là theo dõi tổng chạy svà kiểm tra xem nó có phải là một nửa tổng của mảng không có phần tử hiện tại hay không, và do đó bằng tổng của mảng sau phần tử hiện tại. Nếu vậy, chúng tôi cập nhật chỉ số cân bằng thành chỉ số hiện tại. Chỉ số cân bằng cuối cùng được in hoặc giá trị ban đầu -1nếu không có.

Trên thực tế, chúng tôi lưu trữ phần bù bit của chỉ số cân bằng để thay vào đó chúng tôi có thể khởi tạo nó thành 0.


0

Con trăn - 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)))

Con trăn - 72

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

In xem chỉ mục đã cho có phải là chỉ số cân bằng hay không, không in các phần tử nguyên mà tại đó mảng được cân bằng.


Bạn có ý nghĩa gì nó phá vỡ? 6 là một chỉ số cân bằng vì các mục trước nó bằng 0, không có mục nào sau nó và 50 được bỏ qua.
Joey Adams

AH. Cảm ơn đã làm rõ joey, tôi đã không nhận ra rằng giá trị tại x đáng lẽ bị bỏ qua.
arrdem

0

PHP, 134 ký tự

<?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";

Tôi có một sự ngứa ngáy rằng điều này khác xa với việc chơi golf tối ưu của PHP, nhưng lại hết hơi (não). Ít nhất là nó ngắn hơn với Array_sum và 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

Vì không có đầu vào nào được chỉ định, nên điều này cần được khởi tạo với mảng là biến $a.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.