Ver Mensaje Individual
  #35 (permalink)  
Antiguo 10/07/2010, 14:57
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()

oso96_2000
Código PHP:
Ver original
  1. function reduce ($text = null) {
  2.     // Revisamos que exista un texto y que sean caracteres permitidos
  3.     if (empty($text) || (bool) preg_match('/[^a-z]+/', $text)) {
  4.         trigger_error('Debes especificar una cadena consistente en caracteres de la "a" a la "z". Cadena enviada: ' . $text, E_USER_ERROR);
  5.     }
  6.  
  7.     // Creamos un arreglo a partir del texto
  8.     $characters = function_exists('str_split') ? str_split($text) : preg_split('@([a-z]{1})@', $text, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY) ;
  9.  
  10.     // Declaramos variables
  11.     $total  = count($characters);
  12.     $result = '';
  13.     $now    = '';
  14.     $prev   = false;
  15.     $next   = false;
  16.  
  17.     //Comenzamos el loop
  18.     for ($i = 0; $i < $total; $i++) {
  19.         // Obtenemos el caracter siguiente
  20.         $next   = isset($characters[$i + 1]) ? $characters[$i + 1] : false ;
  21.  
  22.         //
  23.         if ($characters[$i] == $next || $characters[$i] == $prev) {
  24.             $now = $characters[$i];
  25.         }else{
  26.             $now = '-';
  27.         }
  28.  
  29.         // Si estamos en medio de una secuencia y hay que romperla
  30.         if ($now == '-' && (ord($characters[$i]) + 1 != ord($next) || ord($characters[$i]) - 1 != ord($prev))) {
  31.             $now = $characters[$i];
  32.         }
  33.  
  34.         // Secuencia de reversa
  35.         if (ord($characters[$i]) + 1 == ord($prev) && ord($characters[$i]) - 1 == ord($next)) {
  36.             $now = '-';
  37.         }
  38.  
  39.         // Si es el primero o ultimo
  40.         if ($i == 0 || $i == ($total - 1)) {
  41.             $now = $characters[$i];
  42.         }
  43.  
  44.         // Asignamos el caracter actual
  45.         $result .= $now;
  46.  
  47.         // Guardamos para saber cual era el caracter anterior
  48.         $prev   = $characters[$i];
  49.     }
  50.  
  51.     // Quitamos guiones innecesarios
  52.     $result = preg_replace('/-{2,}/', '-', $result);
  53.     $result = trim($result, '- ');
  54.  
  55.     return $result;
  56. }

Y de ultimo momento nos llegó este otro código para la competición. Sin duda un código claro y controlado, que sin embargo no consigue superar a la mayoría de otros códigos cual fideos parecieran.

Me gusto el uso de un solo bucle e if-then-else especifico y breve.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.