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

Vallu
Código php:
Ver original
  1. function reduce($text){
  2.     $arr_txt = str_split($text);
  3.     $str='';
  4.     $creciente=false;
  5.     $max_creciente='';
  6.     $decreciente=false;
  7.     $max_decreciente='';
  8.     $max_length=count($arr_txt);
  9.     $contador_cre=0;
  10.     $contador_de=0;
  11. //recorro el array en el qual esta la cadena a compilar
  12.     for($i=0;$i<$max_length;$i++){
  13.         if($i==0){
  14.             $str=$arr_txt[$i];
  15.         }else{
  16.             if($arr_txt[$i]==$arr_txt[$i-1]){ //si la letra la siguente de la anterior
  17.                 if($creciente){
  18.                     if($contador_cre>1){ //y el contador dice que hay 2 o mas
  19.                         $str.="-".$max_creciente; //se acorta con la forma a-c
  20.                     }else{
  21.                         $str.=$max_creciente;
  22.                     }
  23.                     $contador_cre=0;
  24.                     $creciente=false;
  25.                 }elseif($decreciente){ //lo mismo pero en decreciente
  26.                     if($contador_de>1){
  27.                         $str.="-".$max_decreciente;
  28.                     }else{
  29.                         $str.=$max_decreciente;
  30.                     }
  31.                     $contador_de=0;
  32.                     $decreciente=false;
  33.                 }
  34.                 $str.=$arr_txt[$i];
  35.             }elseif((ord($arr_txt[$i])-1)==ord($arr_txt[$i-1])){ //La anterior letra es mas pequeña
  36.                 if($i==$max_length-1){ //Si es la ultima letra de la cadena
  37.                     if($contador_cre>0){ //y el contador no es 0
  38.                         $str.="-".$arr_txt[$i];
  39.                     }else{
  40.                         $str.=$arr_txt[$i-1].$arr_txt[$i];
  41.                     }
  42.                 }else{
  43.                     if($decreciente){ //si no es la ultima letra de la cadena
  44.                         if($contador_de>1){ //y venimos de una cadena decreciente
  45.                             $str.="-".$max_decreciente;
  46.                         }else{
  47.                             $str.=$max_decreciente;
  48.                         }
  49.                         $contador_de=0;
  50.                     }
  51.                     $contador_cre++;
  52.                     $creciente=true;
  53.                     $max_creciente=$arr_txt[$i];
  54.                     $decreciente=false;
  55.                     $max_decreciente='';
  56.                 }
  57.             }elseif((ord($arr_txt[$i])+1)==ord($arr_txt[$i-1])){ //La anterior letra es mas grande
  58.                 if($i==$max_length-1){ //Si es la ultima letra de la cadena
  59.                     if($contador_de>0){
  60.                         $str.="-".$arr_txt[$i];
  61.                     }else{
  62.                         $str.=$arr_txt[$i-1].$arr_txt[$i];
  63.                     }
  64.                 }else{ //si no es la utlima letra de la cadena
  65.                     if($creciente){
  66.                         if($contador_cre>1){
  67.                             $str.="-".$max_creciente;
  68.                         }else{
  69.                             $str.=$max_creciente;
  70.                         }
  71.                         $contador_cre=0;
  72.                     }
  73.                     $contador_de++;
  74.                     $decreciente=true;
  75.                     $max_decreciente=$arr_txt[$i];
  76.                     $creciente=false;
  77.                     $max_creciente='';
  78.                 }
  79.             }else{ //si la letra no viene de creciente o decreciente
  80.                 if($creciente){ //pero la anterior letra si es creciente
  81.                     if($contador_cre>1){
  82.                         $str.="-".$max_creciente;
  83.                     }else{
  84.                         $str.=$max_creciente;
  85.                     }
  86.                     $creciente=false;
  87.                     $contador_cre=0;
  88.                 }elseif($decreciente){ //mismo per en decreciente
  89.                     if($contador_de>1){
  90.                         $str.="-".$max_decreciente;
  91.                     }else{
  92.                         $str.=$max_decreciente;
  93.                     }
  94.                     $decreciente=false;
  95.                     $contador_de=0;
  96.                 }
  97.                 $str.=$arr_txt[$i];
  98.             }
  99.         }
  100.     }
  101.     return $str;
  102. }

Les presento el código mas largo de la competencia, como pueden ver resulta muy claro si se lee poco a poco. Personalmente lo veo complicado con mucho if-then-else, y realmente no lo entiendo del todo.

Sin embargo cabe destacar el uso de arreglos a partir de una cadena, una técnica que veremos a lo largo de las siguientes participaciones.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.