2010-04-01 8 views
13

Tengo un número, digamos "123456", y necesito asignarlo a una cadena, cualquier cadena. La única limitación a las funciones de mapa son:Convertir un número a la cadena de caracteres más corta posible conservando la singularidad

  • cada número debe asignar a una cadena de caracteres única (esto significa que la cadena puede ser arbitrariamente larga)
  • cadena de caracteres sólo puede contener 0-9, az, AZ

Qué función de mapa producirían las cadenas más cortas?

Se prefieren las soluciones en JavaScript.

Nota: Claramente, la solución más simple es usar el número original, así que asegúrese de que la solución sea mejor que eso.

+0

Dice "una lista de dígitos" en lugar de "un número". ¿Esto significa que quieres que "000006" se trate de manera diferente a "6"? – AakashM

+0

Una buena pregunta. No, yo no. Voy a corregir eso para que quede más claro. – alumb

Respuesta

30

Es posible que desee utilizar Base 36 o Base 62.

base 36 sería el más compacto de caracteres alfanuméricos mayúsculas y minúsculas, pero si quieres explotar mayúsculas y minúsculas, la base 62 sería de aproximadamente un 20% más compacto.

para la base 36, se puede utilizar fácilmente el método de JavaScript Number.toString(radix), de la siguiente manera:

var n = 123456; 
n.toString(36); // returns: "2n9c" 

para la base 62, es posible que desee comprobar this forum post. Básicamente, usted debe poder hacer lo siguiente:

Number.prototype.toBase = function (base) { 
    var symbols = 
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); 
    var decimal = this; 
    var conversion = ""; 

    if (base > symbols.length || base <= 1) { 
     return false; 
    } 

    while (decimal >= 1) { 
     conversion = symbols[(decimal - (base * Math.floor(decimal/base)))] + 
        conversion; 
     decimal = Math.floor(decimal/base); 
    } 

    return (base < 11) ? parseInt(conversion) : conversion; 
} 

var n = 123456; 
n.toBase(62); // returns: "w7e" 
+0

A menos que me equivoque, OP requiere la base 62. – spender

+0

@spender: Sí, tienes razón, ya que A-Z fue mencionado explícitamente. Modifiqué mi respuesta. –

+0

123456.toString (36) satisface los requisitos ... lástima que no haga base 62, eso sería mejor. – alumb

0

Hice esto para crear claves similares a YouTube. Utiliza expresiones regulares para capturar números y luego pasa por encima de una lista de coincidencias para ensamblar la cadena.

El orden de la matriz de caracteres es arbitrario, en realidad puede hacer que sea lo que quiera, pero una vez que lo tenga establecido, no lo cambie más adelante, de lo contrario, puede encontrar claves duplicadas, y asegúrese de no tiene ningún duplicado

Aquí, num, es la variable que contiene la tecla de entrada. Es muy largo en esta muestra, pero puede ser de cualquier longitud.

var chars = ["0","1","2","3","4","5","6","7","8","9","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","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"] 
num = "000102030405060708091011121314151617181920212223242526272829303132333435373839404142434445464748495051525354555657585960616263646566"; 
getnums = num.match(/(0|6[0-1]|[0-5]?[0-9])/g); 
to62 = ""; 
for (var i=0;i<getnums.length;i++) { 
    to62 = to62 + chars[parseInt(getnums[i])]; 
    // console.log(getnums[i] + ": " + chars[parseInt(getnums[i])]) 
} 
console.log(to62); 

Y aquí es una implementación en la fusión fría que utiliza matrices basadas en 1 en lugar de matrices basadas 0 de javascript, en caso de que ayuda a nadie.

<cfscript> 
    chars = ["0","1","2","3","4","5","6","7","8","9","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","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"]; 
    num = "0001020304050607080910111213141516171819202122232425262728293031323334353738394041424344454614748495051525354555657585960616263646566"; 
    getnums = ReMatch("(0|6[0-1]|[0-5]?[0-9])",num); 
    to62 = ""; 
    for (i=1; i<=arraylen(getnums); i=i+1) { 
     to62 = to62 & chars[getnums[i]+1]; 
    } 
    writeoutput(to62); 
</cfscript> 
Cuestiones relacionadas