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

santris
Código PHP:
Ver original
  1. function reduce($texto){
  2. $resultado = $nuevo_resultado = $sub_trozo = $trozo2 = $sub_trozo2 = '';
  3. //creamos la cadena contra la que realizaremos las comparaciones
  4. $cadena_comp="abcdefghijklmnopqrstuvwxyz";
  5. //asignamos la longitudud de la cadena $texto a la variable $longitud_cadena
  6. $longitud_cadena=strlen($texto);
  7. $nuevo_texto=$texto.substr($texto,-1);//arreglo
  8. //creamos un bucle en el cual el número de iteraciones es igual al valor de $longitud_cadena
  9. $i=0;
  10. for ($i=0; $i<=$longitud_cadena; $i++){
  11.     $sub_trozo.=substr($nuevo_texto,$i,1);
  12.     //comparamos al valor de la variable $sub_trozo con la cadena de comparación $cadena_comp, si es cierto asignamos el valor de $sub_trozo a la variable $trozo
  13.     if(preg_match("/$sub_trozo/",$cadena_comp))
  14.         $trozo=$sub_trozo;
  15.     //en caso contrario evaluamos las variables $trozo y sub_trozo
  16.     else{
  17.         if(strlen($trozo)>0){
  18.             if(strlen($trozo)>2){
  19.                 $str_reducido=substr($trozo,0,1)."-".substr($trozo,-1);
  20.                 $resultado.=$str_reducido;
  21.             }
  22.             else
  23.                 $resultado.=$trozo;
  24.         $sub_trozo = '';//vaciamos
  25.         $trozo = '';//vaciamos
  26.         $i=$i-1;//descontamos un incremento por la letra que ocasionó la comparación negativa
  27.         }
  28.         else{
  29.             if(strlen($sub_trozo)>2){
  30.                 $str_reducido=substr($sub_trozo,0,1)."-".substr($sub_trozo,-1);
  31.                 $resultado.=$str_reducido;
  32.             }
  33.             else
  34.                 $resultado.=$sub_trozo;
  35.         $sub_trozo = '';
  36.         $trozo = '';
  37.         $i=$i-1;
  38.         }
  39.     }
  40. }
  41. //invertimos la cadena de comparación y realizamos el mismo procedimiento anterior
  42. $nueva_cadena_comp=strrev($cadena_comp);
  43. $longitud_cadena2=strlen($resultado);
  44. $nuevo_texto2=$resultado.substr($resultado,-1);
  45. $i=0;
  46. for ($i=0; $i<=$longitud_cadena2; $i++){
  47.     $sub_trozo2.=substr($nuevo_texto2,$i,1);
  48.     if(preg_match("/$sub_trozo2/",$nueva_cadena_comp))
  49.         $trozo2=$sub_trozo2;
  50.     else{
  51.         if(strlen($trozo2)>0){
  52.             if(strlen($trozo2)>2){
  53.                 $str_reducido2=substr($trozo2,0,1)."-".substr($trozo2,-1);
  54.                 $nuevo_resultado.=$str_reducido2;
  55.             }
  56.             else
  57.                 $nuevo_resultado.=$trozo2;
  58.         if($trozo2!="-")
  59.             $i=$i-1;
  60.         $sub_trozo2 ='';
  61.         $trozo2 = '';
  62.         }
  63.         else{
  64.             if(strlen($sub_trozo2)>2){
  65.                 $str_reducido2=substr($sub_trozo2,0,1)."-".substr($sub_trozo2,-1);
  66.                 $nuevo_resultado.=$str_reducido2;
  67.             }
  68.             else
  69.                 $nuevo_resultado.=$sub_trozo2;
  70.         if($sub_trozo2!="-")
  71.             $i=$i-1;
  72.         $sub_trozo2 = '';
  73.         $trozo2 = '';
  74.         }
  75.     }
  76. }
  77. return $nuevo_resultado;
  78. }

Siguiendo el sendero de los scripts largos les presento este código. Aquí, lo curioso es el uso de cadenas auxiliares para comprobar la pertenencia del conjunto a-z

También debo mencionar un detalle que me encontré en la etapa de evaluación: el uso de unset(), en algunas secuencias de código hacía uso de unset($foo); en lugar de solo $foo='';

El problema radicaba en que a la siguiente vuelta del bucle, si antes fue unseteada alguna variable esta ya no existe -realmente- en el contexto, además del proceso de concatenación por variables indefinidas, etc...

Es un buen trabajo no lo dudo, y da los resultados esperados. Un ejemplo interesante es la reversa que aplica en el código, para el análisis contrario de secuencias z-a. La implementación dejó varia cháchara de que hablar, muchas gracias...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.