Bir dizinin denge indeksi


10

Bir dizinin denge indeksi, daha düşük indekslerdeki elemanların toplamının, daha yüksek endekslerdeki elemanların toplamına eşit olacağı bir indekstir. Örneğin, A sekansında:

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

3 bir denge indeksidir, çünkü:

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

6 aynı zamanda bir denge indeksidir, çünkü:

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

(sıfır elementin toplamı sıfırdır) 7 bir denge indeksi değildir, çünkü A sekansının geçerli bir indeksi değildir.

Fikir, bir dizi (dizi) verilen, denge indeksini (herhangi bir) veya -1 herhangi bir denge indeksi yoksa -1 döndüren bir program oluşturmaktır.

Yanıtlar:


6

Golf Yazıları 17 16

Girdinin biçimi belirtilmediğinden, bu, stdin'den Golfscript dizi biçiminde bir dize alır.

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

Yani, örneğin

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

Fikir çok basit: bir dizi alır A_ive bir dizi ile eşleşir A_i + 2 SUM_{j<i} A_jve ardından tüm dizinin toplamına eşit olan ilk dizini arar.


@ Mellamokb'un meydan okuması için:

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

29 karakter için.


Kolayca en kısa çözüme sahip olduğunuz için, sadece birincisini değil, tüm indeksleri iade etmeniz gerektiğini ilan ediyorum :)
mellamokb

@mellamokb, övgülerimle.
Peter Taylor

Güzel! Şimdi daha fazla GolfScript yapmayı öğreniyorum ...
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

Virgülle ayrılmış girdi alır


Harika ... bu tüm denge indekslerini döndürüyor ... gerçekten harika.
Cristian

@Christian: Benim de öyle.
FUZxxl

Anlıyorum :) Aslında haskell kodu çalıştırmak için nasıl bilmiyorum ... çalışmak zorunda kalacak.
Cristian

Christian: Ghc, bir derleyici ve sarılmalar, bir tercüman var. Sarılmaları indirmenizi öneririm . Ghc'yi indirmekten daha iyidir, çünkü sarılmalar yaklaşık 7 MiB, tüm ghc dağılımı yaklaşık 300 MiB'dir. Sarılmak kullanarak runhugs FILE.hsprogramı çalıştırmak için yazabilirsiniz 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

Stdin'den Haskell tarzında bir liste okur, örn.

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

ve endekslerin Haskell stil listesini döndürür, örn.

[3,6]

Sonuç [], eğer bir dizin yoksa.

Spesifikasyonunuz farklı bir davranış istiyorsa lütfen bana söyleyin.

Düzenlemeler:

  • (95 → 83): liste kavraması daha ürkütücü

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

Bunun denge indekslerini ters sırada yazdırdığını unutmayın.

Örnek kullanım:

$ ./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(:+)}

Düzenleme: Ventero tarafından önerilen daha kısa sürüm:

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

Giriş satır başına bir sayıdır, çıkış köşeli parantez içindeki virgülle ayrılmış dizin listesidir.


1
İlk satırda parantezlere ihtiyacınız yoktur ve toplamları almak için join + eval komutunu kullanarak birkaç karakter kaydedebilirsiniz: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(dizgiler olarak karakter değişmezlerini kullandığından bunun Ruby 1.9 için olduğunu unutmayın)
Ventero

Harika öneriler, teşekkürler! Dizi # toplamının Ruby çekirdeğinde olmaması biraz can sıkıcı.
Lars Haugseth

İlk satırdaki parantezleri kaldırırsam, şunu elde ederim: "SyntaxError: (irb): 17: sözdizimi hatası, beklenmedik TAMPER, $ end bekleniyor"
Lars Haugseth

mapVe işareti arasında bir boşluk olmalıdır . Ve önünde uyarısı operatörü gerekmez $<tüm tüm satır şu şekilde görünecektir böylece, ya: a=$<.map &:to_i. ;)
Ventero

Ah, tekrar teşekkürler, sözdizimini bozan uyarıydı.
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

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

2

J (12 karakter)

Denge endekslerinin bir vektörünü döndüren zımni gösterimde monadik bir fiil. Yalnızca okunabilirlik için eklenen alanlar.

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

Bunu açıklamak için önce açık tanımını gözlemleyin; yresmi parametredir:

3 : 'I. (+/\. y) = (+/\ y)'
  • +argümanlarını ekler. /fiil örneğin sağ argüman, üyeleri arasında Ondan geriye kalan uçlar olduğu bir zarftır +/ 1 2 3 4aynıdır 1 + 2 + 3 + 4.
  • \fiili, soluna sağ argümanının tüm önek öneklerine uygulayan bir zarftır. Örneğin <, argümanının etrafına bir kutu çizerek <\ 1 2 3 4,

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • Böylece, +/\doğru argümanının her öneki için toplamı hesaplar.

  • \.gibidir \ancak önek yerine soneklerle çalışır. Böylece, +/\.eklerin toplamlarının bir vektörünü hesaplar.
  • =argümanlarının madde bazında karşılaştırmasını yapar. Örneğin, 1 1 3 3 = 1 2 3 4verim 1 0 1 0.
  • Böylece, (+/\. y) = (+/\ y)sonek toplamının önek toplamına eşit olduğu veya bir denge oluşturulduğu tüm endeksler için bir tane verir.
  • Sıfır ve I.bir vektörler için, vektörün bir içerdiği indekslerin bir vektörünü döndürür.

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

Fikir, çalışan toplamı izlemek ve sgeçerli eleman olmadan dizi toplamının yarısı olup olmadığını kontrol etmek ve bu nedenle geçerli elemandan sonraki dizinin toplamına eşit olup olmadığını kontrol etmektir. Eğer öyleyse, denge endeksini mevcut endekse güncelleriz. Son denge endeksi veya yoksa ilk değer yazdırılır -1.

Aslında, denge indeksinin bit tamamlayıcısını saklıyoruz, böylece onu 0 olarak başlatabiliriz.


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

Verilen dizinin bir denge endeksi olup olmadığını yazdırır, dizinin dengelendiği tamsayı indekslerini yazdırmaz.


Ne demek kırılıyor? 6 bir denge endeksidir, çünkü önceki öğeler sıfıra eşitlenir, ondan sonra hiçbir öğe yoktur ve 50 yoksayılır.
Joey Adams

AH. Açıklama joey için teşekkürler, x'deki değerin göz ardı edilmesi gerektiğini fark etmedim.
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";

Bu optimal PHP golf olmaktan uzak, ama sadece buhar (beyin) bitti bir kaşıntı var. En azından array_sum ve array_splice ile olduğundan daha kısa :-)


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

Herhangi bir girdi belirtilmediğinden, bunun değişken olarak dizi ile başlatılması gerekir $a.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.