John McKay wrote:
As far as I can see, the code in  the answer does not add the values 
together.
...
C specs
    sorta acc;
    for x = 1 to 3;
      y = *zeros;
      z = x  + 1;
      y = %lookup(acc(x): acc: z);
      if y > *zeros;
        sum$(x) += sum$(y);
        sum$(y) = *zeros;
        acc(y) = *blanks;
      endif;
    endfor;
John, I think your solution would work for the exact data that David 
showed, but I don't think it would work if there were more than two 
values the same.  Say the acc values were A B B B, then it would add 
sum(3) to sum(2), but it should also add sum(4) to sum(2).
But also, I don't think it would work more than once, since it would 
have blank "unused" acc values that would get sorted to the beginning of 
the array.
Here's my attempt at a solution, completely untested ...
Since the number of "real" elements in the array is not fixed (starts 
with 4 elements, ends up with 3 elements), we need a variable to keep 
track, say num_elems.
   // sort the array by acc.  If there is more than one element
   // for any one acc, they will now be together in the array
   sorta %subarr(acc : 1 : num_elems);
   // merge the sum values for elements with the same acc value
   i = 1;
   remove_elems = 0;
   dow i < num_elems;
      // loop through the subsequent elements with the same
      // acc value, and add all the sums to sum(i)
      for j = (i + 1) to num_elems;
         if acc(j) = acc(i);
            sum(i) += sum(j);
            // now that sum(j) is added to sum(i)
            // we want to get rid of element j
            // (but just mark it to be removed later)
            acc(j) = *hival;
            remove_elems += 1;
         else;
            // we have a new acc
            leave;
         endif;
         // continue with the element after the
         // last one we merged
         i = j;
      endfor;
   enddo;
   // re-sort the array to put the discarded ones
   // at the end (they were set to *hival),
   // then adjust the number of actual elements
   sorta %subarr(acc : 1 : num_elems);
   num_elems -= remove_elems;
As an Amazon Associate we earn from qualifying purchases.