fran86   
Código PHP:
Ver originalfunction reduce($cadena)
{
    // Solo aplica a cadenas de 3 o mas caracteres
        // Agrega el extremo izquierdo
        $cadenaReducida = $cadena[0];
        // Recorre la cadena omitiendo el primer y ultimo caracter
        for ($i=1; $i<strlen($cadena)-1; $i++) {             $iInicial = $i;
            // Avanza la posicion del caracter si es el medio de un rango
            while (   ($i+1 < strlen($cadena))                    && ($cadena[$i-1] != $cadena[$i+1])
                   && ((ord($cadena[$i-1])+ord($cadena[$i+1]))/2 == ord($cadena[$i]))             ) {
                $i++;
            }
            // Agrega en $cadenaReducida de acuerdo a si se omitieron o no caracteres
            if ($iInicial != $i) {
                $cadenaReducida .= "-";
                $i--;
            } else {
                $cadenaReducida .= $cadena[$i];
            }
        }
        // Agrega el extremo derecho
        $cadenaReducida .= $cadena[strlen($cadena)-1];         return $cadenaReducida;
    } else {
        return $cadena;
    }
}
  
Un código honesto y magnifico, resulta muy halagador a la lectura la participación de este usuario. 
Aunque claro, no supera con creces el tiempo de ejecución de sus oponentes si cumple su cometido, y lo realiza de manera ejemplar. Ya aquí se pone en practica el descarte del primer y último carácter, luego un bucle como 
scanner... presto!!