2010-04-01 6 views
13

Mam numer, powiedz "123456", i muszę go zmapować na ciąg, dowolny ciąg. Jedynym ograniczeniem funkcji map są:Konwertuj liczbę na najkrótszy możliwy ciąg znaków zachowując unikatowość.

  • każdy numer musi map do unikalnego ciągu znaków (oznacza to, że łańcuch może być dowolnie długa)
  • ciąg znaków może zawierać tylko 0-9, az, AZ

Która funkcja mapy generuje najkrótsze struny?

Preferowane są rozwiązania w JavaScript.

Uwaga: Najwyraźniej najprostszym rozwiązaniem jest użycie oryginalnego numeru, więc upewnij się, że rozwiązanie działa lepiej.

+0

Mówisz "lista cyfr" zamiast "liczba". Czy to oznacza, że ​​chcesz "000006" traktować inaczej niż "6"? – AakashM

+0

Dobre pytanie. Nie, nie. Poprawię to, aby było bardziej jasne. – alumb

Odpowiedz

30

Możesz użyć: Podstawa 36 lub Podstawa 62.

Baza 36 będzie najbardziej kompaktową dla znaków alfanumerycznych niewrażliwych na wielkość liter, ale jeśli chcesz wykorzystać wielkość liter, podstawa 62 będzie o około 20% bardziej zwarta.

dla podstawy 36, można łatwo korzystać Number.toString(radix) metodę JavaScript w następujący sposób:

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

dla podstawy 62, może chcesz sprawdzić this forum post. Zasadniczo powinieneś być w stanie wykonać następujące czynności:

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

O ile się nie mylę, OP wymaga bazy 62. – spender

+0

@spender: Tak, masz rację, ponieważ A-Z zostało wyraźnie wymienione. Zmodyfikowałem moją odpowiedź. –

+0

123456.toString (36) spełnia wymagania ... szkoda, nie robi podstawy 62, byłoby lepiej. – alumb

0

Zrobiłem to, aby utworzyć klucze podobne do YouTube. Używa wyrażenia regularnego do przechwytywania liczb, a następnie przechodzi przez listę dopasowania w celu złożenia ciągu znaków.

Kolejność tablic znaków jest dowolna, możesz zrobić to, co chcesz, ale gdy już ją ustawisz, nie zmieniaj jej później, w przeciwnym razie możesz uruchomić duplikaty kluczy i upewnić się, że nie ma żadnych duplikatów.

Tutaj liczba jest zmienną, która zawiera klawisz wprowadzania. W tej próbce jest bardzo długi, ale może mieć dowolną długość.

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); 

A oto implementacja w Cold Fusion, który wykorzystuje tablice 1 oparte zamiast tablic 0 oparte jest obsługa JavaScript w przypadku pomaga nikomu.

<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> 
Powiązane problemy