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

maycolalvarez
Código PHP:
Ver original
  1. function reduce($str)
  2.  {
  3.      $charSequence       = null; // contiene el carácter que inicia una  secuencia:
  4.      $charSequenceDiff   = 0;    // contiene la diferencia con la cual se  identifica la secuencia (+1 ó -1)
  5.      $result             = '';   // cadena donde se vuelcan los  resultados
  6.  
  7.      for ($i = 0; $i < strlen($str); $i++) {
  8.          // extrae el carácter actual y el proximo:
  9.          $current        = $str[$i];
  10.          $next           = isset($str[$i + 1]) ? $str[$i + 1] : null;
  11.          // obtiene su valor ASCII para comparar:
  12.          $currentChar    = ord($current);
  13.          $nextChar       = ord($next);
  14.          // obtiene el valor absoluto para determinar si están en  secuencia
  15.          $absoluteDiff   = abs($currentChar - $nextChar);
  16.  
  17.          if (($absoluteDiff == 0) || ($absoluteDiff > 1)) {
  18.              if (($charSequence != null) &&  (abs(ord($charSequence) - $currentChar) > 1)) {
  19.                  $result .= '-';
  20.              }
  21.              $result.= $current;
  22.              $charSequence   =  null;
  23.          } else {
  24.              // diferencia entre los caracteres consecutivos (-1  incremento, +1 decremento)
  25.              $diff = ($currentChar - $nextChar);
  26.  
  27.              if(($charSequence == null) || ($charSequenceDiff != $diff)) {
  28.                  if(($charSequence != null) &&  (abs(ord($charSequence) - $currentChar) > 1)) {
  29.                      $result .= '-';
  30.                  }
  31.                  $result.= $current;
  32.                  $charSequence       = $current;
  33.                  $charSequenceDiff   = $diff;
  34.              }
  35.          }
  36.      }
  37.      return $result;
  38.  }

Si bien recuerdo, este fue el primer código que recibí.

El comparar un valor absoluto en cuanto a la diferencia en la secuencia a-z es crucial, al momento de implementar la comparación normal e invertida. Si, ya se que no se entiende lo que digo... pero juro que otra clave se encuentra ahí.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.