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

GatorV
Código PHP:
Ver original
  1. function reduce($cadena)
  2. {
  3.     if (strlen($cadena) < 3) {
  4.         return $cadena;
  5.     }
  6.  
  7.     $chars = preg_split('//', $cadena, -1, PREG_SPLIT_NO_EMPTY);
  8.     $size = count($chars);
  9.     $out = array();
  10.     $pos = 0;
  11.  
  12.     while($pos < $size) {
  13.         $current = ord($chars[$pos]);
  14.         $next = (isset($chars[($pos + 1)])) ? ord($chars[($pos + 1)]) : 0;
  15.         $onext = (isset($chars[($pos + 2)])) ? ord($chars[($pos + 2)]) : 0;
  16.         $out[] = $chars[$pos];
  17.  
  18.         if (($current + 1) == $next && (($current + 2) == $onext)) {
  19.             $out[] = '-';
  20.             do {
  21.                 $pos++;
  22.                 $current = ord($chars[$pos]);
  23.                 $next = (isset($chars[($pos + 1)])) ? ord($chars[($pos + 1)]) : 0;
  24.                 if (($current + 1) != $next) {
  25.                     break;
  26.                 }
  27.             } while(true);
  28.         } elseif ((($current - 1) == $next) && (($current - 2) == $onext)) {
  29.             $out[] = '-';
  30.             do {
  31.                 $pos++;
  32.                 $current = ord($chars[$pos]);
  33.                 $next = (isset($chars[($pos + 1)])) ? ord($chars[($pos + 1)]) : false;
  34.                 if (($current - 1) != $next) {
  35.                     break;
  36.                 }
  37.             } while(true);
  38.         } else {
  39.             $pos++;
  40.         }
  41.     }
  42.  
  43.     return implode('', $out);
  44. }
He aquí el primer código de un moderador del foro de PHP, que como pueden observar hace un serie de elegantes bucles, muy interesante y sin comentarios. Pero es entendible, y bien, no es lo mas corto... pero que bueno se pone esto!!

La comparación lógica de los números ordinales en la secuencia de caracteres es solo una parte del problema, que como pocos supo resolver de manera efectiva y breve. Además coloca su código dentro de los mas rápidos cerca de la media 0.0050
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.