Ver Mensaje Individual
  #12 (permalink)  
Antiguo 02/09/2005, 06:51
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
Progresos por fin, despues de haberlo intentado horas.

El problema es que la escala en la que nosotros representamos el abecedario es
Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz" 
pero la escala en la que javascript devuelve esa misma cadena al hacer el toString() es
Código PHP:
var ELdevuelve="0123456789abcdefghijklmnop"
, luego ahi tenemos un grave problema.

Lo que hago es codificar el numero en la base de la longitud de ELdevuelve
Código PHP:
var resultado=(num).toString(ELdevuelve.length); 
. 'resultado' seguro contiene letras unicamente de la cadena ELdevuelve, ya que es su escala de caracteres cuando la base es ELdevuelve.length.

Espero que me podais seguir hasta aqui.

Ahora lo que hago es transformar esos caracteres (suyos) a los mios. Es decir, al '0' le corresponde la 'a', al '1' la 'b', al '2' la 'c'... y asi hasta la 'p', que le corresponde la 'z'.

Construyo el script, y me encuentro mi primer problema: El "numero" que va despues de 'p' (='z') no es '00' (='aa'), si no '10' (='ba'). Asi que pienso que si se encuentra un numero que esta en las decimas, se le debe restar 1. Lo hago asi y funciona a la perfeccion, hasta que llegamos a '100' (='aaa'). Claro, qué pasa. Que a la cifra de las centenas (1) le quito 1, y todo bien. A la cifra de las decenas (0) le quito 1, y da -1. ERROR.

Se me ha ocurrido solucionar el problema diciendo que la resta de 1 solo la ejecute una vez por transformacion. Es decir, que si le quita a las centenas, a las decenas ya no. Si se lo quita a los miles, a las centenas ya no.

Y funciona!. de 'zz' pasa a 'aaa', y de 'zzz' pasa de 'aaaa'. Comprobado.

Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz".split("");
var 
ELdevuelve="0123456789abcdefghijklmnop";

function 
num2letra(num) {
    var 
resultado=(num).toString(ELdevuelve.length);
    
resultado=resultado.split("");
    var final=
"";
    var 
quitado=false;
    for(var 
a=0;a<resultado.length;a++) {
        
n=resultado[a];
        
//si no se le ha quitado, si a>decenas, y si es un numero del 1 al 9 (el cero no vale)
        
if( resultado.length-1>&& resultado[a].search(/^[1-9]$/)==&& quitado==false ) {
            
//document.write("Le quito '"+(1)+"' al '"+resultado[a]+"'....");            //debug
            
n-=1;        //le restamos 1
            
quitado=true;
        }
        
posELdevuelve.indexOf(n);
        final+= 
YOdevuelvo[pos];
    }
    return [
"Convertido="+resultado.join(""),"Final="+final];

Se puede imprimir un bucle, por ejemplo:
Código PHP:
for(a=0;a<1000;a++) {
    
document.write('Numero'+a+' --> '+num2letra(a).join("; ")+'<br/>');

Ahora bien, no todo es camino de rosas, porque ya le he encontrado un fallo. Resulta que a las decenas le quitamos 1 si es por ejemplo un 9. El "numero" '9p' antes de sustituirlo lo convertimos a '8p'. Lo sustituimos y da 'iz'. El numero siguiente es 'a0', que lo convertimos a 'a0' (no se toca) y da 'ka', en vez de 'ja'.

¿Y porque se salta la J? Pues porque el '9' es convertido a '8', que segun
Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz"
var ELdevuelve="0123456789abcdefghijklmnop"
se corresponde a 'i'. Pero despues de ese '8' nuestro, se pasa a 'a', en vez de a '9'; y 'a' no se toca. Es decir: en el ciclo nuestro de una vez convertido (antes de sustituir), nos pasamos el '9'.


De momento no se como solucionarlo, supongo que a parte de los numeros de las decenas, centenas y miles, tambien hay que quitarle 1 a las letras de esas posiciones....



Aunque de momento va bien, no?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.