Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/08/2005, 15:19
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Retomo el tema despues de mas de un año porque me ha vuelto a picar el gusanillo. Esta vez tenia que hacer una cosa parecida, pero con una funcion que devolviera la siguiente combinacion. Es decir, si a la funcion le paso "aaa" que me devuelva "aab", y si le paso esto ultimo "aac".

Tenia que estar preparada para funcionar por si sola hasta el infinito, de manera que "zzz" generase "aaaa" para empezar de nuevo a dar "aaab", "aaac"... "zzzz".

Es en PHP, pero vamos, que viene a ser lo mismo. La funcion es recursiva, y he comentado todo lo mejor que he podido para que se entienda. Al parecer mis conocimientos siguen aumentando (aunque me ha costado su tiempo...).

Código PHP:
//esta denominada como 'abecedario' en los comentarios
$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");

// devuelve la siguiente cadena generada por el orden logico del alfabeto
function siguiente($str=""$attach="") {
    global 
$abc;
    
//si nos lo dan vacio, vacio lo devolveremos
    
if($str=="") return "";
    
//calculamos su longitud, lo necesitaremos y es mejor almacenarlo en una variable
    
$longitud=strlen($str);
    
//cogemos la ultima letra para analizar qué parte debemos evolucionar
    
$ultima_letra=substr($str,-1);
    
//si la ultima letra de la palabra es la ultima letra de abecedario
    //  haremos un siguiente de toda la cadena menos el ultimo caracter, y el ultimo caracter
    //  se convertira en $abc[0]
    //cogemos toda la cadena menos la ultima letra
    
$loViejo=substr($str,0,$longitud-1);
    if(
$ultima_letra==$abc[count($abc)-1]) {
        
//si resulta que loViejo esta vacio (es que la longitud era 1), necesitaremos una nueva cadena desde cero
        
if($loViejo=="") {
            
//generacion de nueva cadena de orden $longitud+1 repleta de $abc[0]
            
$devolver="";
            for(
$a=0$a<$longitud+1+strlen($attach); $a++)
                
$devolver.=$abc[0];
            return 
$devolver;
        }
        
//si loViejo tenia contenido simplemente devolveremos ese siguiente(viejo), y mantendremos lo que se 
        //  estaba manteniendo y un $abc[0] para empezar una nueva secuencia.
        
else
            return 
siguiente$loViejo $attach.$abc[0] );
    }
    
//la ultima letra no es la ultima detra de abecedario. Basta modificar esa letra unicamente.
    
else {
        
//para ello extraemos la posicion de la ultima letra en abecedario
        
$pos_ultima_letra=array_search($ultima_letra$abc);
        
//y obtenemos la letra siguiente
        
$nueva_ultima_letra=$abc[$pos_ultima_letra+1];
        
//devolveremos todo exactamente como estaba, solo que la ultima letra ya estara cambiada
        
return $loViejo.$nueva_ultima_letra .$attach;
    }

Espero que a alguien le sirva!. Podemos hacer:
Código PHP:
$actual="A";
for(
$a=0$a<100000$a++) {
    echo 
$actual."<br>";
    
$actual=siguiente($actual);

si desearamos las primeras 100000 generaciones.





Me queda el mono de una ultima funcion, que se le pase un numero tipo 123 y te devuelva la combinacion numero 123 sin tener que hacer las 122 anteriores. Vere si algun dia la saco, y espero no tardar tanto como esta .


Posteado queda, pues!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.