Ver Mensaje Individual
  #49 (permalink)  
Antiguo 11/07/2010, 20:52
Nisrokh
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: [Desafío PHP] Función reduce()

Pucha llegue tarde

Solo para saber como me fue... @pateketrueke ¿Me tomarías el tiempo de mi reduce()? :D Lo haría yo, pero no se como lo has echo...

Aca dejo mi código, no lo mando por PM porque ya termino el desafío...

Lo hagas o no, gracias de todas formas :D

Utilize: strlen() y ord()

Código PHP:
Ver original
  1. <?php
  2.  
  3. function reduce($text) {
  4.    
  5.     // Tamaño de la cadena
  6.     $length = strlen($text);
  7.    
  8.     // Devolver la misma cadena si hay menos de 3 carácteres
  9.     if ($length < 3)
  10.         return $text;
  11.    
  12.     // Arreglo con el valor ASCII de cada carácter
  13.     $chars = array();
  14.    
  15.     for ($i = 0; $i < $length; $i++)
  16.         $chars[] = ord($text[$i]);
  17.    
  18.     $char = 0; // Carácter a verificar
  19.     $output = ''; // Salida
  20.     $previous = $current = $next = $range_start = $num_range_chars = $order = 0;
  21.    
  22.     do {
  23.        
  24.         $previous = $chars[$char - 1]; // Carácter anterior
  25.         $current = $chars[$char]; // Carácter actual
  26.         $next = $chars[$char + 1]; // Carácter siguiente
  27.        
  28.         // Verificar si ya estamos dentro de un rango
  29.         if ($range_start) {
  30.            
  31.             // Si el carácter anterior es mayor o menor
  32.             // (De acuerdo al orden de los carácteres)
  33.             // es igual al actual, marcar que el carácter actual
  34.             // está dentro de un rango de carácteres
  35.             if (($previous + $order) == $current) {
  36.                 ++$num_range_chars;
  37.             } else {
  38.                
  39.                 // Si hemos encontrado un carácter que no pertenece
  40.                 // al rango que estamos analizando, y el rango actual
  41.                 // tiene menos de 3 carácteres, agregamos el carácter anterior
  42.                 // a salida y continuamos (Ya que si estamos analizando un rango,
  43.                 // y solo encontramos 2 carácteres, el segundo nunca se agregó)
  44.                 if ($num_range_chars == 2)
  45.                     $output.= $text[$char - 1];
  46.                
  47.                 // Si el carácter actual, no esta dentro del rango,
  48.                 // pero pudimos terminar de analizar el rango actual,
  49.                 // agregamos el último carácter a salida
  50.                 if ($num_range_chars > 2)
  51.                     $output.= '-' .$text[$char - 1];
  52.                
  53.                 // Reseteamos las variables de rango
  54.                 $range_start = $num_range_chars = 0;
  55.             }
  56.         }
  57.        
  58.         // Si entre el carácter anterior, actual y el siguiente forman una cadena casi palíndromo
  59.         // Ej.: aba, oao, bab (Pero NO aaa, bbb, ccc, etc.)
  60.         // Nos aseguramos de terminar el rango que estamos analizando correctamente
  61.         // para seguir con el siguiente y detectamos el nuevo orden: decreciente o ascendente
  62.         if ($previous != $current && $next != $current && $previous == $next) {
  63.            
  64.             // Señalar final del rango actual, si estamos en uno
  65.             if ($num_range_chars > 2)
  66.                 $output.= '-';
  67.            
  68.             // Agregar carácter a salida
  69.             $output.= $text[$char];
  70.            
  71.             // Marcar comienzo de nuevo rango
  72.             $range_start = $current;
  73.             $num_range_chars = 1;
  74.            
  75.             // Lo mísmo que en la línea 101
  76.             if ($current < $next)
  77.                 $order = 1;
  78.             if ($current > $next)
  79.                 $order = -1;
  80.             if ($current == $next)
  81.                 $range_start = $num_range_chars = 0;
  82.         }
  83.        
  84.         // Comenzar a analizar un rango de carácteres
  85.         if (!$range_start) {
  86.            
  87.             // Agregar carácter a salida
  88.             $output.= $text[$char];
  89.            
  90.             // Fijar comienzo del rango de carácteres
  91.             $range_start = $current;
  92.            
  93.             // Marcar carácter que comienza el rango
  94.             ++$num_range_chars;
  95.            
  96.             // Si hay un carácter despues del actual,
  97.             // verificamos si es mayor o menor al actual
  98.             // para fijar el orden: decreciente o ascendente
  99.             // Si el siguiente carácter es el mismo,
  100.             // Reseteamos las variables que marcan un rango
  101.             if ($next) {
  102.                 if ($current < $next)
  103.                     $order = 1;
  104.                 if ($current > $next)
  105.                     $order = -1;
  106.                 if ($current == $next)
  107.                     $range_start = $num_range_chars = 0;
  108.             }
  109.         }
  110.        
  111.         // Pasamos al carácter siguiente
  112.         ++$char;
  113.        
  114.         // Si hemos llegado al final de la cadena,
  115.         // completamos la salida correctamente
  116.         if ($char == $length && $num_range_chars > 2)
  117.             $output.= '-' .$text[$char - 1];
  118.        
  119.     } while ($char < $length);
  120.    
  121.     // Devolver salida de carácteres
  122.     return $output;
  123. }
  124.  
  125. ?>

¡Saludos!

Última edición por Nisrokh; 11/07/2010 a las 21:05