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

abimaelrc
Código PHP:
Ver original
  1. function reduce($text)
  2. {
  3. /*
  4.     Variables
  5.  
  6.     $lastChar = número ascii de caracter anterior
  7.     $chars = array temporal que contiene los caracteres posibles a reducir
  8.     $n = número de la llave de la variable $chars
  9.     $tries = número para verificar si es mayor a 3 reducir caracteres
  10.             indicados en la variable chars
  11.     $boolPos = boolean para caracteres que van aumentando
  12.     $boolNeg = boolean para caracteres que van disminuyendo
  13. */
  14.     $lastChar = 1;
  15.     $chars = array();
  16.     $n = 0;
  17.     $tries = 1;
  18.     $boolPos = false;
  19.     $boolNeg = false;
  20.  
  21.     for($i=0; $i<strlen($text); $i++){
  22.         // Obtener el valor ASCII
  23.         $asciiVal = ord($text[$i]);
  24.  
  25.         /*
  26.         Verifica si el valor ASCII corriente es menor al valor ASCII del caracter
  27.         anterior (caracteres de mayor a menor) y si es consecutivo. Si se cumple
  28.         entonces verifica si se había ejecutado anteriormente la segunda condición
  29.         para resetear la variable $tries o continuarla. Si la variable $tries es
  30.         mayor o igual a tres, coloca el guión sino lo contrario y se añade el
  31.         caracter corriente. La variable $chars se sobre-escribe cuando hay más
  32.         de tres caracteres consecutivos. Se verifica si el próximo caracter existe
  33.         y si cambia el proceso (es decir verifica si cambia de mayor -> menor,
  34.         a menor -> mayor el caracter) para aumentar la variable $n y añadir el
  35.         siguiente caracter en un nuevo espacio en la variable $chars. Se
  36.         modifican los valores booleanos para el siguiente caracter.
  37.         */
  38.         if($asciiVal < $lastChar && ($lastChar % $asciiVal) == 1){
  39.             $tries = $boolPos ? 2 : ++$tries;
  40.             $chars[$n] = ($tries >= 3 ? '-' : '') . $text[$i];
  41.             if(!empty($text[$i + 1]) && ord($text[$i + 1]) > $asciiVal){
  42.                 ++$n;
  43.             }
  44.             $boolNeg = true;
  45.             $boolPos = false;
  46.         }
  47.  
  48.         /*
  49.         Es el mismo proceso de la condición anterior pero de menor a mayor
  50.         los caracteres.
  51.         */
  52.         elseif($asciiVal > $lastChar && ($asciiVal % $lastChar) == 1){
  53.             $tries = $boolNeg ? 2 : ++$tries;
  54.             $chars[$n] = ($tries >= 3 ? '-' : '') . $text[$i];
  55.             if(!empty($text[$i + 1]) && ord($text[$i + 1]) < $asciiVal){
  56.                 ++$n;
  57.             }
  58.             $boolPos = true;
  59.             $boolNeg = false;
  60.         }
  61.  
  62.         // Es para los resultados que no son consecutivos y el primer caracter.
  63.         else{
  64.             $chars[$n] = (!empty($chars[$n]) ? $chars[$n] : '') . $text[$i];
  65.             ++$n;
  66.             $tries = 1;
  67.         }
  68.  
  69.         // Almacenar el caracter corriente para usarlo en la siguiente vuelta
  70.         $lastChar = $asciiVal;
  71.     }
  72.  
  73.     // Retornar el valor y unir los caracteres almacenados en la variable $chars
  74.     return implode('',$chars);
  75. }

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

No atiendo por MP nada que no sea personal.