eZakto
Código PHP:
Ver originalfunction reduce($string)
{
// Compruebo que es posible que haya al menos un rango de 3 caracteres
{
return $string;
}
// Lista de carácteres permitidos
$charset = array_flip(array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'));
// Guarda los cambios que se realicen
$cache = $string;
// Indica si la posición actual es dentro de un rango (false) o no (true)
$start = true;
// $position es la posición actual dentro de la cadena,
// $i = -1 hará que se parseen los rangos en orden alfabético, $i = 1 hará que sea al revés
for ($position = 1, $i = -1; $i < 2; ++$position)
{
// Almacena el último carácter tras la posición actual
$last = $string[$position-1];
// Verifico en $charset si $last está inmediatamente antes/después que el carácter actual
// En caso contrario, en la próxima iteración comenzará a buscar un nuevo rango
if ($charset[$last] == ($charset[$string[$position]]+$i))
{
if ($start == true)
{
// Estoy dentro de un rango
$start = false;
}
else
{
// Reemplazo el carácter anterior en $cache
$cache[$position-1] = '-';
}
}
else
{
$start = true;
}
// Una vez completado el recorrido de la cadena, reestabilizo $string, $position e $i
// para comenzar el recorrido nuevamente, pero parseando los rangos en orden inverso
if ($position >= strlen($string)-1) {
$position = 0;
$i = $i + 2;
}
}
// Finalmente reemplazo los '-----' por '-'
}
Con un bucle un tanto extraño, y también haciendo uso de arreglos auxiliares tenemos este otro script.
Omitiendo comentarios se nota que es realmente reducido, y bueno... la implementación si es de las mas atrevidas, un tanto por su
bizarres y otro tanto por su precisión, quedando igualmente cerca de la media en tiempo de ejecución.