Ver Mensaje Individual
  #43 (permalink)  
Antiguo 11/07/2010, 11:19
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: [Desafío PHP] Función reduce()

eZakto
Código PHP:
Ver original
  1. function reduce($string)
  2. {
  3.     // Compruebo que es posible que haya al menos un rango de 3 caracteres
  4.     if(strlen($string) < 3)
  5.     {
  6.         return $string;
  7.     }
  8.  
  9.     // Lista de carácteres permitidos
  10.     $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'));
  11.  
  12.     // Guarda los cambios que se realicen
  13.     $cache   = $string;
  14.  
  15.     // Indica si la posición actual es dentro de un rango (false) o no (true)
  16.     $start   = true;
  17.  
  18.     // $position es la posición actual dentro de la cadena,
  19.     // $i = -1 hará que se parseen los rangos en orden alfabético, $i = 1 hará que sea al revés
  20.     for ($position = 1, $i = -1; $i < 2; ++$position)
  21.     {
  22.         // Almacena el último carácter tras la posición actual
  23.         $last = $string[$position-1];
  24.  
  25.         // Verifico en $charset si $last está inmediatamente antes/después que el carácter actual
  26.         // En caso contrario, en la próxima iteración comenzará a buscar un nuevo rango
  27.         if ($charset[$last] == ($charset[$string[$position]]+$i))
  28.         {
  29.             if ($start == true)
  30.             {
  31.                 // Estoy dentro de un rango
  32.                 $start = false;
  33.             }
  34.             else
  35.             {
  36.                 // Reemplazo el carácter anterior en $cache
  37.                 $cache[$position-1] = '-';
  38.             }
  39.         }
  40.         else
  41.         {
  42.             $start = true;
  43.         }
  44.  
  45.         // Una vez completado el recorrido de la cadena, reestabilizo $string, $position e $i
  46.         // para comenzar el recorrido nuevamente, pero parseando los rangos en orden inverso
  47.         if ($position >= strlen($string)-1)
  48.         {
  49.             $position = 0;
  50.             $i        = $i + 2;
  51.         }
  52.     }
  53.  
  54.     // Finalmente reemplazo los '-----' por '-'
  55.     return preg_replace('/-+/', '-', $cache);
  56. }

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.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.