Gustavo72
Código PHP:
Ver originalfunction reduce($text) {
//La función recorre la cadena comparando cada caracter con el anterior.
//Los caracteres solo se agregan al resultado final si no hay secuencia.
//Cuando una secuencia termina se agrega el caracter anterior al resultado; si la secuencia es de más de dos letras se agrega antes un guión.
$res=""; //En esta cadena construyo el resultado.
$carAnt=""; //Esta variable guardará el caracter anterior.
$codAnt=0; //Esta variable guardará el código ASCII del caracter anterior.
$secuencia=0; //Esta variable contará la cantidad de caracteres en secuencia menos 1. Su signo indicará el sentido ascendente (+) o descendente (-).
$text.=" ";
for ($a=0; $a<strlen($text); $a++) { //Recorro la cadena: $sinSecuencia=true;
$nuevaSecuencia=0;
if (ord($text[$a])==$codAnt+1) { //Compara caracter con el anterior y detecta secuencia ascendente: if ($secuencia<0)
$nuevaSecuencia=1; //Se inicia secuencia ascendente en sentido contrario al actual
else {
$secuencia++;
$sinSecuencia=false;
}
}
elseif (ord($text[$a])==$codAnt-1) { //Compara caracter con el anterior y detecta secuencia descendente: if ($secuencia>0)
$nuevaSecuencia=-1; //Se inicia secuencia descendente en sentido contrario al actual
else {
$secuencia--;
$sinSecuencia=false;
}
}
if ($sinSecuencia) { //No hay secuencia o se inició una en sentido opuesto:
$res.=$carAnt; //Secuencia rota de solo dos letras. Agrego caracter anterior sin guión
elseif (abs($secuencia)>1) $res.="-$carAnt"; // Cierro secuencia de más de dos letras con guión y caracter anterior
if (!$nuevaSecuencia) { //No se inicio nueva secuencia:
$res.=$text[$a]; //Agrega el aactual
$secuencia=0; //No secuencia
}
else
$secuencia=$nuevaSecuencia; //Seteo secuencia en sentido contrario
}
$carAnt=$text[$a];
}
}
Otro lindo y corto script.
A diferencia de otras implementaciones, este código no hace uso de comparaciones con el siguiente carácter, o el siguiente del siguiente, etc..
Sabiendo la lógica impuesta, el uso razonable tan solo del carácter anterior de la secuencia actual es importante. Así, de una buena ves se evitan errores de
undefined offset, etc..