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.
Python - 72 caracteres
Toma una entrada separada por comas
fuente
runhugs FILE.hs
para ejecutar el programaFILE.hs
.Haskell (
9583)Lee una lista en estilo Haskell de stdin, por ejemplo.
y devuelve una lista de estilo de los índices de Haskell, por ejemplo.
El resultado es
[]
, si no hay índice.Por favor, dime si tu especificación quiere un comportamiento diferente.
Ediciones:
fuente
C - 96
Tenga en cuenta que esto imprime los índices de equilibrio en orden inverso.
Uso de la muestra:
fuente
Rubí
8377)Editar: versión más corta como lo sugiere Ventero:
La entrada es un número por línea, la salida es una lista de índices separados por comas entre corchetes.
fuente
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)map
y 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
. ;)JavaScript (161)
http://jsfiddle.net/6qYQv/1/
fuente
scala, 108
fuente
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.
Para explicar esto, primero observe su definición explícita;
y
es el parámetro formal:+
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 4
es el mismo que1 + 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 4
producePor 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 4
rendimientos1 0 1 0
.(+/\. 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.I.
devuelve un vector de los índices en los que el vector contiene uno.fuente
Pitón 2, 70
La idea es hacer un seguimiento de la suma acumulada
s
y 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-1
si no hay ninguno.En realidad, almacenamos el complemento de bits del índice de equilibrio para que podamos inicializarlo a 0.
fuente
Python - 114
Python - 72
Imprime si el índice dado es o no un índice de equilibrio, no imprime las indecisiones enteras en las que la matriz está equilibrada.
fuente
PHP, 134 caracteres
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 :-)
fuente
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
.fuente