Indeks keseimbangan urutan

10

Indeks keseimbangan urutan adalah indeks sedemikian rupa sehingga jumlah elemen pada indeks yang lebih rendah sama dengan jumlah elemen pada indeks yang lebih tinggi. Misalnya, dalam urutan A:

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

3 adalah indeks keseimbangan, karena:

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

6 juga merupakan indeks kesetimbangan, karena:

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

(jumlah elemen nol adalah nol) 7 bukan indeks kesetimbangan, karena itu bukan indeks urutan A. yang valid

Idenya adalah untuk membuat program yang diberi urutan (array), mengembalikan indeks keseimbangannya (ada) atau -1 jika tidak ada indeks keseimbangan.

Cristian
sumber

Jawaban:

6

Golfscript 17 16

Karena bentuk input tidak ditentukan, ini mengambil string dalam format array Golfscript dari stdin.

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

Jadi jalankan seperti misalnya

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

Idenya sangat sederhana: dibutuhkan array A_idan peta ke array A_i + 2 SUM_{j<i} A_jdan kemudian mencari indeks pertama yang sama dengan jumlah seluruh array.


Untuk tantangan @ mellamokb, saya menawarkan:

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

selama 29 karakter.

Peter Taylor
sumber
Karena Anda dengan mudah memiliki solusi terpendek, saya menyatakan Anda harus mengembalikan semua indeks, bukan hanya yang pertama :)
mellamokb
@ellamokb, dengan pujian saya.
Peter Taylor
Keren! Sekarang saya punya beberapa GolfScript lagi yang harus dilakukan ...
mellamokb
5

Python - 72 karakter

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

Mengambil input yang dipisahkan koma

gnibbler
sumber
Luar biasa ... yang ini mengembalikan semua indeks keseimbangan ... sangat keren.
Cristian
@Christian: Milik saya juga begitu.
FUZxxl
Begitu ya :) Sebenarnya saya tidak tahu cara menjalankan kode haskell ... harus belajar.
Cristian
Christian: Ada ghc, kompiler dan pelukan, penerjemah. Saya sarankan mengunduh pelukan . Lebih baik mengunduh ghc, karena pelukan sekitar 7 MiB, sedangkan keseluruhan distribusi ghc sekitar 300 MiB. Menggunakan pelukan, Anda cukup mengetik runhugs FILE.hsuntuk menjalankan program 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

Membaca daftar dalam gaya Haskell dari stdin, mis.

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

dan mengembalikan daftar gaya indeks Haskell, misalnya.

[3,6]

Hasilnya [], jika tidak ada indeks.

Tolong beritahu saya, jika spec Anda ingin perilaku yang berbeda.

Suntingan:

  • (95 → 83): Pemahaman daftar lebih cepat
FUZxxl
sumber
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);}

Perhatikan bahwa ini mencetak indeks ekuilibrium dalam urutan terbalik.

Penggunaan sampel:

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

Ruby (83 77)

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

Sunting: Versi lebih pendek seperti yang disarankan oleh Ventero:

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

Input adalah satu nomor per baris, output adalah daftar indeks yang dipisahkan koma dalam tanda kurung.

Lars Haugseth
sumber
1
Anda tidak memerlukan tanda kurung di baris pertama, dan Anda dapat menyimpan beberapa karakter dengan menggunakan join + eval untuk mendapatkan jumlah: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(perhatikan bahwa ini untuk Ruby 1.9, karena menggunakan karakter literal sebagai string)
Ventero
Saran yang bagus, terima kasih! Agak menyebalkan bahwa # jumlah Array tidak ada di dalam inti Ruby.
Lars Haugseth
Jika saya menghapus paranthes di baris pertama, saya mendapatkan: "SyntaxError: (irb): 17: kesalahan sintaks, tAMPER tak terduga, mengharapkan $ end"
Lars Haugseth
Harus ada ruang antara mapdan ampersand. Dan Anda tidak perlu operator percikan di depan $<baik, jadi semuanya baris akan terlihat seperti ini: a=$<.map &:to_i. ;)
Ventero
Ah, terima kasih lagi, itu percikan yang merusak sintaksis.
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/

mellamokb
sumber
2

scala, 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
Pengguna tidak diketahui
sumber
2

J (12 karakter)

Kata kerja monadik dalam notasi diam-diam yang mengembalikan vektor indeks ekuilibrium. Ruang yang dimasukkan hanya untuk keterbacaan.

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

Untuk menjelaskan ini, pertama-tama perhatikan definisi eksplisitnya; yadalah parameter formal:

3 : 'I. (+/\. y) = (+/\ y)'
  • +menambahkan argumennya. /adalah kata keterangan yang menyisipkan kata kerja di sebelah kiri di antara anggota argumen yang benar, misalnya +/ 1 2 3 4sama dengan 1 + 2 + 3 + 4.
  • \adalah kata keterangan yang menggunakan kata kerja di sebelah kirinya untuk semua awalan, awalan dari argumen yang benar. Misalnya, dengan <menggambar kotak di sekitar argumennya, <\ 1 2 3 4menghasilkan

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • Jadi, +/\hitung untuk setiap awalan dari argumen yang tepat jumlahnya.

  • \.seperti \tetapi beroperasi pada sufiks alih-alih awalan. Jadi, +/\.hitung vektor jumlah sufiks.
  • =melakukan perbandingan item-wise argumennya. Misalnya, 1 1 3 3 = 1 2 3 4hasil 1 0 1 0.
  • Dengan demikian, (+/\. y) = (+/\ y)menghasilkan satu untuk semua indeks di mana jumlah suffix sama dengan jumlah awalan, atau, keseimbangan dibuat.
  • Untuk vektor nol dan satu, I.kembalikan vektor indeks di mana vektor berisi satu.
FUZxxl
sumber
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

Idenya adalah untuk melacak jumlah yang berjalan sdan memeriksa apakah itu setengah dari jumlah array tanpa elemen saat ini, dan karena itu sama dengan jumlah array setelah elemen saat ini. Jika demikian, kami memperbarui indeks keseimbangan ke indeks saat ini. Indeks keseimbangan terakhir dicetak, atau nilai awal -1jika tidak ada.

Sebenarnya, kita menyimpan bit-melengkapi indeks keseimbangan sehingga kita dapat menginisialisasi ke 0 sebagai gantinya.

Tidak
sumber
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)))

Python - 72

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

Mencetak apakah indeks yang diberikan adalah indeks keseimbangan, tidak mencetak indek bilangan bulat di mana array seimbang.

arrdem
sumber
Apa maksudmu itu rusak? 6 adalah indeks ekuilibrium karena item sebelum dijumlahkan ke nol, tidak ada item setelahnya, dan 50 diabaikan.
Joey Adams
AH. Terima kasih atas klarifikasi joey, saya tidak menyadari bahwa nilai pada x seharusnya diabaikan.
arrdem
0

PHP, 134 karakter

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

Saya memiliki rasa gatal bahwa ini jauh dari golf PHP yang optimal, tetapi hanya kehabisan tenaga (otak). Setidaknya lebih pendek dari dengan array_sum dan array_splice :-)

Samuli K
sumber
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

Karena tidak ada input yang ditentukan, ini perlu diinisialisasi dengan array sebagai variabel $a.

Stephen
sumber