sclass MountainsAndValleys { double[] values; new IntBuffer highs; new IntBuffer lows; run { int n = l(values); if (n == 0) ret; highs.add(0); lows.add(0); int i = 1; while (i < n) { // find plateau var value = values[i]; int j = i+1; while (j < n && values[j] == value) ++j; // are we going up or down? var last = values[i-1]; var list = value > last ? highs : lows; //if (list.last() == i-1) if (values[list.last()] == last) list.popLast(); list.add(i); i = j; } } }