De_la_Cuesta_13
Código PHP:
Ver originalfunction reduce($str){
$abc = "abcdefghijklmnopqrstuvwxyz";
$ult_str = $l_str - 1;
$salida = "";
$m = 0;
$t = 0;
for($i=0;$i<$l_str;$i++){
if($m==1)
$i--;
/*
$j me indica en que posición del abecedario ($abc) se encuentra el caracter actual ($i), así:
1. Si el caracter que sigue en $abc ($j+1) es igual al que sigue en $str ($i+1), se busca reducir en orden.
2. Si el caracter anterior en $abc ($j-1) es igual al que sigue en $str ($i+1), se busca reducir en reversa.
*/
//busco en orden
if($i<$ult_str && $j<$ult_abc && $abc{$j+1}==$str{$i+1}){
if($m==1)
$m=0;
else
$salida .= $str{$i};
$j++;
$k = $i;
$i++;
//busco hasta que posición $str es igual a $abc, en orden
for($p=$i;$p<$l_str;$p++){
if($j<=$ult_abc && $a[$j]==$s[$p]){
$j++;
continue;
}
else
break;
}
$p--;
$i = $p;
// se debe reducir porque hay 3 o más caracteres en orden
if(($i-$k)>=2)
$salida .= "-".$str{$i};
else
$salida .= $str{$i};
/*
reviso si después del último caracter en order se debe reducir en reversa.
$t = 1, sí
NOTA: Si $t = 1, no se agrega el caracter a la salida en la posición $i, puesto
que ya se ha agregado en orden.
*/
$t=1;
}
if($t==1)
//busco en reversa
if($i<$ult_str && $j>0 && $a{$j-1}==$str{$i+1}){
if($t!=1)
$salida .= $str{$i};
$j--;
$k = $i;
$i++;
//busco hasta que posición $str es igual a $abc, en reversa
for($p=$i;$p<$l_str;$p++){
if($j>=0 && $a[$j]==$s[$p]){
$j--;
continue;
}
else
break;
}
$p--;
$i = $p;
// se debe reducir porque hay 3 o más caracteres en reversa
if(($i-$k)>=2)
$salida .= "-".$str{$i};
else
$salida .= $str{$i};
/*
reviso si después del último caracter en reversa se debe reducir en orden.
$m = 1, sí
NOTA: Si $m = 1, no se agrega el siguiente caracter en la posición $i, puesto
que ya se ha agregado en reversa.
*/
if($i<$ult_str && $abc{$j+1}==$str{$i+1})
$m=1;
}
else{
if($t!=1)
$salida .= $str{$i};
}
$t=0;
}
return $salida;
}
Esta es la viva imagen de que un código largo no necesariamente es lento, sino todo lo contrario.
El código ganador en velocidad bajo las pruebas actuales, el mas rápido, si... sin duda. Que al igual que otros scripts usa cadenas, arreglos auxiliares, y casi imposible de creer mas de un solo bucle.
Excelente.