abimaelrc
Código PHP:
Ver originalfunction reduce($text)
{
/*
Variables
$lastChar = número ascii de caracter anterior
$chars = array temporal que contiene los caracteres posibles a reducir
$n = número de la llave de la variable $chars
$tries = número para verificar si es mayor a 3 reducir caracteres
indicados en la variable chars
$boolPos = boolean para caracteres que van aumentando
$boolNeg = boolean para caracteres que van disminuyendo
*/
$lastChar = 1;
$n = 0;
$tries = 1;
$boolPos = false;
$boolNeg = false;
for($i=0; $i<strlen($text); $i++){ // Obtener el valor ASCII
$asciiVal = ord($text[$i]);
/*
Verifica si el valor ASCII corriente es menor al valor ASCII del caracter
anterior (caracteres de mayor a menor) y si es consecutivo. Si se cumple
entonces verifica si se había ejecutado anteriormente la segunda condición
para resetear la variable $tries o continuarla. Si la variable $tries es
mayor o igual a tres, coloca el guión sino lo contrario y se añade el
caracter corriente. La variable $chars se sobre-escribe cuando hay más
de tres caracteres consecutivos. Se verifica si el próximo caracter existe
y si cambia el proceso (es decir verifica si cambia de mayor -> menor,
a menor -> mayor el caracter) para aumentar la variable $n y añadir el
siguiente caracter en un nuevo espacio en la variable $chars. Se
modifican los valores booleanos para el siguiente caracter.
*/
if($asciiVal < $lastChar && ($lastChar % $asciiVal) == 1){
$tries = $boolPos ? 2 : ++$tries;
$chars[$n] = ($tries >= 3 ? '-' : '') . $text[$i];
if(!empty($text[$i + 1]) && ord($text[$i + 1]) > $asciiVal){ ++$n;
}
$boolNeg = true;
$boolPos = false;
}
/*
Es el mismo proceso de la condición anterior pero de menor a mayor
los caracteres.
*/
elseif($asciiVal > $lastChar && ($asciiVal % $lastChar) == 1){
$tries = $boolNeg ? 2 : ++$tries;
$chars[$n] = ($tries >= 3 ? '-' : '') . $text[$i];
if(!empty($text[$i + 1]) && ord($text[$i + 1]) < $asciiVal){ ++$n;
}
$boolPos = true;
$boolNeg = false;
}
// Es para los resultados que no son consecutivos y el primer caracter.
else{
$chars[$n] = (!empty($chars[$n]) ?
$chars[$n] : '') . $text[$i]; ++$n;
$tries = 1;
}
// Almacenar el caracter corriente para usarlo en la siguiente vuelta
$lastChar = $asciiVal;
}
// Retornar el valor y unir los caracteres almacenados en la variable $chars
}
Es un código corto, los comentarios no se cuenta lo aseguro. Esta es la primera participación en la que me encuentro una comparación con módulos.
Bastante claro y muy bien expresado, felicitaciones!!