Ver Mensaje Individual
  #44 (permalink)  
Antiguo 11/07/2010, 11:22
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()

AlvaroG
Código PHP:
Ver original
  1. function reduce($cadena) {
  2.     $continuar = true;
  3.     $pos = 0;
  4.     $nueva = "";
  5.     $max_pos = strlen($cadena)-1;
  6.  
  7.     // si la cadena es vacía o de largo 1, no continuar
  8.     if ($max_pos < 1) {
  9.         return $cadena;
  10.     }
  11.  
  12.     while ($continuar) {
  13.         // agrego a $nueva el caracter actual
  14.         $nueva .= $cadena{$pos};
  15.         $diferencia = ord($cadena{$pos}) - ord($cadena{$pos+1});
  16.  
  17.         // con esto se determina si el intervalo es creciente o decreciente (abc o cba)
  18.         if (abs($diferencia) == 1 ) {
  19.             $signo_diferencia = ($diferencia > 0) ? 1 : -1;
  20.  
  21.             $i = 2;
  22.             // busco el último caracter del intervalo
  23.             while( ($pos+$i <= $max_pos) && ((ord($cadena{$pos}) - ord($cadena{$pos+$i})) == $signo_diferencia*$i) ) {
  24.                 $i++;
  25.             }
  26.             // si el intervalo es de más de 2 caracteres (abc en vez de ab), agrego el - para separar
  27.             if ($i > 2) {
  28.                 $nueva .= '-';
  29.             }
  30.             // para la vuelta siguiente, empiezo a buscar un intervalo después del que acabo de encontrar
  31.             $pos += $i-1;
  32.  
  33.         } else {
  34.             $pos++;
  35.         }
  36.  
  37.         // si no llegué al final de $cadena, seguir recorriéndola
  38.         $continuar = ($pos < $max_pos);
  39.     }
  40.     // el último caracter de la cadena nunca es procesado por el while anterior. Devolver entonces lo que había
  41.     // juntado en $nueva + el último caracter
  42.     return $nueva.$cadena{$max_pos};
  43. }

Un código con dos bucles, y también dos diferencias notables.

Al menos, el problema nos indicaba un parte de la solución... el primer y último carácter permanecen intactos, además de que me fascinan los bucles lógicos.

¿ya se los había dicho?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.