Equilibrium index: Difference between revisions

From Rosetta Code
Content added Content deleted
(new task)
 
(added php)
Line 27: Line 27:


Assume that the sequence may be very long.
Assume that the sequence may be very long.


=={{header|PHP}}==
<lang php><?php
$arr = array(-7, 1, 5, 2, -4, 3, 0);
$res = array();

$sum = 0;
foreach ($arr as $v) $sum += $v;

$left = 0;
$right = $sum;
foreach ($arr as $i => $v)
{
$right -= $v;
if ($left == $right)
{
$res[] = $i;
}
$left += $v;
}

echo "# results:\n";
foreach ($res as $r)
{
echo " $r";
}
echo "\n";
?></lang>

Revision as of 09:16, 23 September 2010

Equilibrium index of a sequence is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes. For example, in a sequence A:

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

3 is an equilibrium index, because:

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

6 is also an equilibrium index, because:

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

(sum of zero elements is zero)

7 is not an equilibrium index, because it is not a valid index of sequence A.

Write a function that, given a sequence, returns its equilibrium index (any) or raises an exception if no equilibrium indexes exist.

Assume that the sequence may be very long.


PHP

<lang php><?php $arr = array(-7, 1, 5, 2, -4, 3, 0); $res = array();

$sum = 0; foreach ($arr as $v) $sum += $v;

$left = 0; $right = $sum; foreach ($arr as $i => $v) {

   $right -= $v;
   if ($left == $right)
   {
       $res[] = $i;
   }
   $left += $v;

}

echo "# results:\n"; foreach ($res as $r) {

   echo " $r";

} echo "\n"; ?></lang>