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!