AlvaroG
Código PHP:
Ver originalfunction reduce($cadena) {
$continuar = true;
$pos = 0;
$nueva = "";
// si la cadena es vacía o de largo 1, no continuar
if ($max_pos < 1) {
return $cadena;
}
while ($continuar) {
// agrego a $nueva el caracter actual
$nueva .= $cadena{$pos};
$diferencia = ord($cadena{$pos}) - ord($cadena{$pos+1});
// con esto se determina si el intervalo es creciente o decreciente (abc o cba)
if (abs($diferencia) == 1 ) { $signo_diferencia = ($diferencia > 0) ? 1 : -1;
$i = 2;
// busco el último caracter del intervalo
while( ($pos+$i <= $max_pos) && ((ord($cadena{$pos}) - ord($cadena{$pos+$i})) == $signo_diferencia*$i) ) { $i++;
}
// si el intervalo es de más de 2 caracteres (abc en vez de ab), agrego el - para separar
if ($i > 2) {
$nueva .= '-';
}
// para la vuelta siguiente, empiezo a buscar un intervalo después del que acabo de encontrar
$pos += $i-1;
} else {
$pos++;
}
// si no llegué al final de $cadena, seguir recorriéndola
$continuar = ($pos < $max_pos);
}
// el último caracter de la cadena nunca es procesado por el while anterior. Devolver entonces lo que había
// juntado en $nueva + el último caracter
return $nueva.$cadena{$max_pos};
}
Un código con dos bucles, y también dos diferencias notables.
Al menos, el problema nos indicaba un parte de la solución... el primer y último carácter permanecen intactos, además de que me fascinan los bucles lógicos.
¿ya se los había dicho?