Ver Mensaje Individual
  #16 (permalink)  
Antiguo 07/04/2007, 19:08
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: permutaciones

La solución en PHP, por si alguien la necesita. Ví en la función chr() que lo intentaban.. yo sin embargo uso la función base_convert(), como lo hice con toString() en JS:

Código PHP:
function base_convert2($n,$b) {        //asumo que desde la base que queremos transformar es desde decimal
    
if( 0<=$n && $n<$b ) {        //caso directo, no hay que hacer nada, devuelve bien
        
$res=base_convert($n,10,$b);
    }
    else {                          
//caso general
        //el ultimo se mantiene como se transformaria
        
$ultimo=base_convert($n,10,$b);
        
$ultimo=substr($ultimo, -11);        //ultimo caracter
        //los primeros (sean cuantos sean) se resuelven recursivamente, hasta llegar a un caso directo
        
$aConvertir=(int)($n/$b)-1;
        
$primeros=base_convert2($aConvertir,$b);
        
$res=$primeros.$ultimo;    //siendo primeros y ultimo strings
    
}
    return 
$res;
}

$YOdevuelvo=split(" " "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");
$ELdevuelve="0123456789abcdefghijklmnop";

function 
num2alpha($n$b=26 ) {
    global 
$YOdevuelvo$ELdevuelve;
    
$bc=base_convert2($nstrlen($ELdevuelve) );
    for(
$a=0$dev="";$a<strlen($bc);$a++) {
        
// la posicion de cada caracter en ELdevuelve es la letra en $YOdevuelvo
        
$pos=strpos($ELdevuelve$bc[$a]);
        
$dev.=$YOdevuelvo[$pos];
    }
    return 
$dev;
}

function 
alpha2num($alpha$b=26 ) {
    global 
$YOdevuelvo;
    
$YOdevuelvoSTR=implode("",$YOdevuelvo);
    for(
$a=0,$dev=0$a<strlen($alpha);$a++) {    
        
// orden: unidades=0; decenas=1; centenas=2 ...
        
$orden=strlen($alpha)-$a-1;
        
$pos=strpos($YOdevuelvoSTR$alpha[$a] );    //posicion de la letra con respecto a $YOdevuelvo
        
if($orden==0)
            
$dev+=$pos;        //haría pow($base,$orden), pero daría 1 en vez de 0
        
else 
            
$dev+=pow($b,$orden)*($pos+1);    
    }
    return 
$dev;

Código PHP:
echo alpha2num("hola")."<br/>";    //151060
echo num2alpha(151060)."<br/>";  //hola 
Tiene un par de problemas cuando tiene que trabajar con cifras grandes, no se puede traducir a numero "permutaciones" porque daría una combinación demasiado alta para un entero supongo (3.4319006077858E+017) y perdemos la precisión.

Pero creo que hasta que la cadena a devolver fuera de 8 caracteres num2alpha() funciona, más no. Con alpha2num() no he encontrado restricciones.


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