Ver Mensaje Individual
  #34 (permalink)  
Antiguo 10/07/2010, 14:54
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: [Desafío PHP] Función reduce()

gary_qwerty
Código PHP:
Ver original
  1. function reduce($string){
  2.  
  3.     if( strlen($string) < 3 ){
  4.         return $string;
  5.     }
  6.  
  7.     $abc = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
  8.  
  9.     $str_arr = array();
  10.     $c = 0;
  11.     while( $c < strlen($string) ){
  12.         $str_arr[] = substr($string, $c, 1);
  13.         $c++;
  14.     }
  15.  
  16.     $str_replace = $str_arr;
  17.     foreach($str_arr as $k=>$letter){
  18.         $val = array_search($letter, $abc);
  19.         if( isset( $str_arr[$k+1] ) ){
  20.             if( isset($abc[$val+1]) && $str_arr[$k+1] ==  $abc[$val+1] ){
  21.                 if( isset($str_arr[$k+2])  && isset($abc[$val+2]) && $str_arr[$k+2] == $abc[$val+2] ){
  22.                     unset($str_replace[$k+1]);
  23.                 }
  24.             }
  25.             else if( isset($abc[$val-1]) && $str_arr[$k+1] ==  $abc[$val-1] ){
  26.                 if( isset($str_arr[$k+2]) && isset($abc[$val-2]) &&  $str_arr[$k+2] == $abc[$val-2]  ){
  27.                     unset($str_replace[$k+1]);
  28.                 }
  29.             }
  30.         }
  31.     }
  32.  
  33.     $keys = array();
  34.     $letters = array();
  35.     foreach($str_replace as $k=>$l){
  36.         $keys[] = $k;
  37.         $letters[] = $l;
  38.     }
  39.  
  40.     $ret = "";
  41.  
  42.     foreach($keys as $k=>$l){
  43.         if( isset($keys[$k+1]) ){
  44.             if( $l+1 == $keys[$k+1] ){
  45.                 $ret .= $letters[$k];
  46.             }
  47.             else{
  48.                 $ret .= $letters[$k]."-";
  49.             }
  50.         }
  51.         else{
  52.             $ret .= $letters[$k]."-";
  53.         }
  54.     }
  55.  
  56.     $ret = substr($ret, 0, strlen($ret)-1 );
  57.     return $ret;
  58. }

Un script de mas de 1000B, y que siendo aún mas corto que otros no es mas veloz.

Haciendo una bella combinación de cadenas, arreglos y bucles consigue pasar las pruebas y aquí lo tenemos. Según se cuenta, una simple corrección y ya tenemos listo todo el algoritmo.

Sin duda códigos como esto demuestra la flexibilidad no del lenguaje, sino de la mente humana. ;)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.