Índice de equilibrio de una secuencia


10

El índice de equilibrio de una secuencia es un índice tal que la suma de elementos en índices más bajos es igual a la suma de elementos en índices más altos. Por ejemplo, en una secuencia A:

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

3 es un índice de equilibrio, porque:

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

6 también es un índice de equilibrio, porque:

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

(la suma de cero elementos es cero) 7 no es un índice de equilibrio, porque no es un índice válido de secuencia A.

La idea es crear un programa que, dada una secuencia (matriz), devuelva su índice de equilibrio (cualquiera) o -1 si no existen índices de equilibrio.

Respuestas:


6

Golfscript 17 16

Como no se especifica la forma de la entrada, esto toma una cadena en formato de matriz Golfscript de stdin.

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

Entonces corre como eg

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

La idea es muy simple: toma una matriz de A_iy asigna una matriz de A_i + 2 SUM_{j<i} A_jy luego busca el primer índice que es igual a la suma de toda la matriz.


Para el desafío de @ mellamokb ofrezco:

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

por 29 caracteres


Dado que tiene fácilmente la solución más corta, proclamo que debe devolver todos los índices, no solo el primero :)
mellamokb

@mellamokb, con mis cumplidos.
Peter Taylor

¡Frio! Ahora tengo un poco más de aprendizaje GolfScript que hacer ...
mellamokb

5

Python - 72 caracteres

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

Toma una entrada separada por comas


Impresionante ... este devuelve todos los índices de equilibrio ... realmente genial.
Cristian

@Christian: El mío también lo hace.
FUZxxl

Ya veo :) En realidad no sé cómo ejecutar el código haskell ... tendré que estudiar.
Cristian

Christian: Hay ghc, un compilador y abrazos, un intérprete. Sugeriría descargar abrazos . Es mejor que descargar ghc, porque los abrazos son de aproximadamente 7 MiB, mientras que la distribución completa de ghc es de aproximadamente 300 MiB. Usando abrazos, puede escribir runhugs FILE.hspara ejecutar el programa 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

Lee una lista en estilo Haskell de stdin, por ejemplo.

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

y devuelve una lista de estilo de los índices de Haskell, por ejemplo.

[3,6]

El resultado es [], si no hay índice.

Por favor, dime si tu especificación quiere un comportamiento diferente.

Ediciones:

  • (95 → 83): la comprensión de la lista es más breve

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

Tenga en cuenta que esto imprime los índices de equilibrio en orden inverso.

Uso de la muestra:

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

3

Rubí83 77)

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

Editar: versión más corta como lo sugiere Ventero:

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

La entrada es un número por línea, la salida es una lista de índices separados por comas entre corchetes.


1
No necesita los paréntesis en la primera línea, y puede guardar algunos caracteres usando join + eval para obtener las sumas: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(tenga en cuenta que esto es para Ruby 1.9, ya que usa literales de caracteres como cadenas)
Ventero

Grandes sugerencias, gracias! Es un poco molesto que Array # sum no esté en el núcleo de Ruby.
Lars Haugseth

Si elimino las paréntesis en la primera línea, obtengo: "SyntaxError: (irb): 17: error de sintaxis, tAMPER inesperado, esperando $ end"
Lars Haugseth

Tiene que haber un espacio entre mapy el ampersand. Y no es necesario que el operador splat frente al $<bien, así que en general la línea se vería así: a=$<.map &:to_i. ;)
Ventero

Ah, gracias de nuevo, fue el splat que arruinó la sintaxis.
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 caracteres)

Un verbo monádico en notación tácita que devuelve un vector de índices de equilibrio. Espacios insertados solo para legibilidad.

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

Para explicar esto, primero observe su definición explícita; yes el parámetro formal:

3 : 'I. (+/\. y) = (+/\ y)'
  • +agrega sus argumentos. /es un adverbio que inserta el verbo a la izquierda entre los miembros de su argumento derecho, por ejemplo, +/ 1 2 3 4es el mismo que 1 + 2 + 3 + 4.
  • \es un adverbio que aplica el verbo a su izquierda a todos los prefijos prefijos de su argumento derecho. Por ejemplo, al <dibujar un cuadro alrededor de su argumento, <\ 1 2 3 4produce

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • Por lo tanto, +/\calcula para cada prefijo de su argumento correcto la suma.

  • \.es como \pero funciona con sufijos en lugar de prefijos. Por lo tanto, +/\.calcula un vector de sumas de sufijos.
  • =realiza una comparación inteligente de sus argumentos. Por ejemplo, 1 1 3 3 = 1 2 3 4rendimientos 1 0 1 0.
  • Por lo tanto, (+/\. y) = (+/\ y)produce uno para todos los índices en los que la suma del sufijo es igual a la suma del prefijo, o se crea un equilibrio.
  • Para los vectores de ceros y unos, I.devuelve un vector de los índices en los que el vector contiene uno.

1

Pitó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

La idea es hacer un seguimiento de la suma acumulada sy verificar si es la mitad de la suma de la matriz sin el elemento actual y, por lo tanto, es igual a la suma de la matriz después del elemento actual. Si es así, actualizamos el índice de equilibrio al índice actual. Se imprime el último índice de equilibrio, o el valor inicial -1si no hay ninguno.

En realidad, almacenamos el complemento de bits del índice de equilibrio para que podamos inicializarlo a 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)))

Imprime si el índice dado es o no un índice de equilibrio, no imprime las indecisiones enteras en las que la matriz está equilibrada.


¿Qué quieres decir con que se rompe? 6 es un índice de equilibrio porque los elementos antes de sumar a cero, no hay elementos después de él, y se ignora 50.
Joey Adams

AH Gracias por la aclaración, Joey, no me di cuenta de que se suponía que el valor en x debía ignorarse.
llega

0

PHP, 134 caracteres

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

Tengo la picazón de que esto está lejos de ser un golf PHP óptimo, pero se quedó sin vapor (cerebro). Al menos es más corto que con array_sum y 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

Como no se especificó ninguna entrada, esto debe inicializarse con la matriz como variable $a.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.