Wskaźnik równowagi sekwencji


10

Indeks równowagi sekwencji jest indeksem takim, że suma elementów o niższych indeksach jest równa sumie elementów o wyższych indeksach. Na przykład w sekwencji A:

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

3 jest wskaźnikiem równowagi, ponieważ:

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

6 jest również wskaźnikiem równowagi, ponieważ:

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

(suma elementów zerowych wynosi zero) 7 nie jest indeksem równowagi, ponieważ nie jest prawidłowym indeksem sekwencji A.

Chodzi o to, aby stworzyć program, który ma sekwencję (tablicę), zwraca swój wskaźnik równowagi (dowolny) lub -1, jeśli nie istnieją wskaźniki równowagi.

Odpowiedzi:


6

Golfscript 17 16

Ponieważ forma danych wejściowych nie jest określona, ​​pobiera ciąg znaków w formacie tablicy Golfscript ze standardowego wejścia.

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

Więc uruchom jako np

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

Pomysł jest bardzo prosty: pobiera tablicę A_ii odwzorowuje na tablicę, A_i + 2 SUM_{j<i} A_ja następnie szuka pierwszego indeksu, który jest równy sumie całej tablicy.


Za wyzwanie @ mellamokb oferuję:

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

na 29 znaków.


Ponieważ łatwo masz najkrótsze rozwiązanie,
ogłaszam

@mellamokb, z moimi komplementami.
Peter Taylor

Fajne! Teraz mam trochę więcej do nauki gry w GolfScript ...
mellamokb

5

Python - 72 znaki

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

Pobiera dane oddzielone przecinkami


Świetnie ... ten zwraca wszystkie wskaźniki równowagi ... naprawdę fajnie.
Cristian

@Christian: Mine też to robi.
FUZxxl

Rozumiem :) Właściwie nie wiem, jak uruchomić kod haskell ... będę musiał się uczyć.
Cristian

Christian: Jest ghc, kompilator i uściski, tłumacz. Sugeruję pobranie uścisków . Lepiej jest pobierać ghc, ponieważ uściski to około 7 MiB, a cała dystrybucja ghc to około 300 MiB. Używając uścisków, możesz po prostu pisać, runhugs FILE.hsaby uruchomić 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

Czyta listę w stylu Haskell ze standardowego wejścia, np.

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

i zwraca listę indeksów w stylu Haskell, np.

[3,6]

Wynik jest taki [], że jeśli nie ma indeksu.

Powiedz mi, jeśli Twoja specyfikacja chce innego zachowania.

Edycje:

  • (95 → 83): zrozumienie listy jest bardziej zwięzłe

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

Zauważ, że to drukuje wskaźniki równowagi w odwrotnej kolejności.

Przykładowe użycie:

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

3

Rubin (83 77)

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

Edycja: krótsza wersja zgodnie z sugestią Ventero:

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

Dane wejściowe to jedna liczba w wierszu, dane wyjściowe to oddzielona przecinkami lista indeksów w nawiasach kwadratowych.


1
Nie potrzebujesz nawiasów w pierwszym wierszu i możesz zapisać kilka znaków, używając join + eval, aby uzyskać sumy: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(zauważ, że dotyczy to Ruby 1.9, ponieważ używa literałów znaków jako ciągów znaków)
Ventero

Świetne sugestie, dzięki! To trochę irytujące, że Array # sum nie ma w rdzeniu Ruby.
Lars Haugseth

Jeśli usunę nawiasy w pierwszym wierszu, otrzymam: „Błąd składni: (irb): 17: błąd składni, nieoczekiwany ubijak, oczekiwanie końca $”
Lars Haugseth

Musi być odstęp między mapznakiem ampersand. I nie trzeba operatora ikona w przedniej części $<albo, więc w sumie linia będzie wyglądać następująco: a=$<.map &:to_i. ;)
Ventero

Ach, jeszcze raz dzięki, to ikona zniszczyła składnię.
Lars Haugseth,


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 znaków)

Czasownik monadyczny w milczącej notacji, który zwraca wektor wskaźników równowagi. Wstawiono spacje wyłącznie dla czytelności.

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

Aby to wyjaśnić, najpierw przestrzegaj jego wyraźnej definicji; yto parametr formalny:

3 : 'I. (+/\. y) = (+/\ y)'
  • +dodaje swoje argumenty. /to przysłówek, który wstawia lewy czasownik między członami jego prawego argumentu, np. +/ 1 2 3 4jest taki sam jak 1 + 2 + 3 + 4.
  • \to przysłówek, który stosuje czasownik po swojej lewej stronie do wszystkich prefiksów jego prawego argumentu. Na przykład, <rysując ramkę wokół argumentu, <\ 1 2 3 4tworzy

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • W ten sposób +/\oblicza sumę dla każdego prefiksu właściwego argumentu.

  • \.jest jak, \ale działa na sufiksach zamiast prefiksów. W ten sposób +/\.oblicza wektor sum sufiksów.
  • =dokonuje punktowego porównania swoich argumentów. Na przykład 1 1 3 3 = 1 2 3 4daje 1 0 1 0.
  • Zatem (+/\. y) = (+/\ y)daje jeden dla wszystkich wskaźników, przy których suma sufiksu jest równa sumie prefiksu, lub tworzona jest równowaga.
  • W przypadku wektorów zer i jedynek I.zwraca wektor indeksów, przy którym wektor zawiera jeden.

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

Chodzi o to, aby śledzić sumę bieżącą si sprawdzić, czy stanowi ona połowę sumy tablicy bez bieżącego elementu, a zatem jest równa sumie tablicy po bieżącym elemencie. Jeśli tak, aktualizujemy indeks równowagi do bieżącego indeksu. Drukowany jest ostatni wskaźnik równowagi lub wartość początkowa, -1jeśli nie istnieje.

W rzeczywistości przechowujemy uzupełnienie bitowe indeksu równowagi, abyśmy mogli zamiast tego zainicjować wartość 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)))

Python - 72

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

Wyświetla, czy dany indeks jest indeksem równowagi, nie drukuje liczb całkowitych, przy których tablica jest zrównoważona.


Co to znaczy, że się psuje? 6 jest indeksem równowagi, ponieważ elementy przed sumą do zera, po nim nie ma żadnych elementów, a 50 jest ignorowane.
Joey Adams

AH Dzięki za wyjaśnienie joey, nie zdawałem sobie sprawy, że wartość x powinna być ignorowana.
arrdem

0

PHP, 134 znaki

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

Czuję, że jest to dalekie od optymalnej gry w golfa w PHP, ale po prostu zabrakło mi pary (mózgów). Przynajmniej jest krótszy niż w przypadku array_sum i 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

Ponieważ nie określono danych wejściowych, należy je zainicjować za pomocą tablicy jako zmiennej $a.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.