Triby
Código PHP:
Ver originalfunction reduce ($str) {
// Patrón para comparación
$letters = 'abcdefghijklmnopqrstuvwxyz';
// Dirección actual
$dir = 'no';
// Longitud de la cadena original
// Primer caracter directo
$reduce = $str[0];
// Iniciamos desde el segundo
for ($i = 1; $i <= $strlen; $i++):
// Caracter actual y su posición en el patrón
$char = $str[$i];
$pos = strpos($letters, $char); // Caracter anterior en $str y su posición
$lastchar = $str[$i - 1];
$lastpos = strpos($letters, $lastchar);
// Secuencia y dirección?
if ($pos == ($lastpos + 1) && ($dir == 'left' || $dir == 'no')):
// Secuencia izq
$dir = 'left';
if ($i < $strlen):
// Si no es el último caracter
continue;
endif;
elseif ($pos == ($lastpos - 1) && ($dir == 'right' || $dir == 'no')):
// Secuencia der
$dir = 'right';
if ($i < $strlen):
// Si no es el último caracter
continue;
endif;
elseif ($dir == 'no'):
// No hay secuencia
$reduce .= $char;
continue;
endif;
// Por default
$reverse = false;
// Cambio de sentido?
if ($i < $strlen):
// Siguiente caracter y posición para verificar
$newchar = $str[$i + 1];
$newpos = strpos($letters, $newchar); // Cambio de dirección?
$reverse = (($dir == 'left' && $pos == ($newpos + 1) && $lastpos == ($newpos + 2))
|| ($dir == 'right' && $pos == ($newpos - 1) && $lastpos == ($newpos - 2)));
if ($reverse):
// Aplicamos la nueva dirección
$dir = ($pos == ($newpos - 1)) ? 'left' : 'right';
else:
// Cancelamos dirección anterior
$dir = 'no';
endif;
else:
$dir = 'no';
endif;
// Fin de secuencia y/o cambio de dirección
// Posición del último caracter de $reduce
// Verificamos cantidad caracteres
$abs = abs($redpos - $lastpos);
// Último caracter de $str
if ($i == $strlen):
if ($abs == 0):
// No hay secuencia
$reduce .= $char;
elseif (abs($pos - $lastpos) != 1): // No hay secuencia, quedaba pendiente caracter anterior
$reduce .= "-{$lastchar}{$char}";
else:
// Sí hay secuencia
$reduce .= "-{$char}";
endif;
elseif ($abs > 1):
// Secuencia más de 2 caracteres
// ? - Cambio, omite el caracter actual
// : - No cambio, se agregan guión, último y caracter actual
$reduce .= ($reverse) ? "-{$lastchar}" : "-{$lastchar}{$char}";
else:
// Secuencia es de sólo dos caracteres ab
// ? - Cambio, se omite el caracter actual
// : - No cambio, se agregan último y caracter actual
$reduce .= ($reverse) ? $lastchar : "{$lastchar}{$char}";
endif;
endfor;
return $reduce;
}
Otro script que usa cadenas auxiliares para comprobar el rango, y que tampoco entiendo del todo.
Cabe mencionar que realmente es complicado traducir un algoritmo mental en código claro, esto es cierto también pero comprender el proceso inverso es realmente complicado, sino hasta difícil. (:
Es interesante la sintaxis que se utiliza en este script, desde versiones alternativas de
keywords para control de flujo, aka.
endif,
endfor, etc.. así como también un uso correcto y casi magistral de variables, comparaciones, comillas y comentarios.