2010-04-01 4 views
13

숫자가 "123456"이고 문자열, 모든 문자열에 매핑해야합니다. 지도 기능에 대한 유일한 제약 조건은 다음과 같습니다유일성을 유지하면서 숫자를 최대한 짧은 문자열로 변환하십시오.

    각 숫자는
  • 문자열은 0-9를 포함 할 수 있습니다 (이 문자열은 임의의 길이 될 수 있음을 의미) 고유 문자열로 매핑해야
  • , AZ, AZ

어떤지도 함수가 가장 짧은 문자열을 생성합니까?

JavaScript로 해결 된 솔루션입니다.

참고 : 분명히 가장 간단한 해결책은 원래 숫자를 사용하는 것이므로 솔루션이 그보다 나은지 확인하십시오.

+0

"숫자"대신 "숫자 목록"이라고 말합니다. "000006"을 "6"과 다르게 취급하기를 원한다는 뜻입니까? – AakashM

+0

좋은 질문입니다. 아니. 더 명확하게하기 위해 그것을 고치겠다. – alumb

답변

30

자료 36 또는 자료 62을 사용할 수 있습니다.

Base 36은 대소 문자를 구분하지 않는 영숫자 문자로는 가장 작지만 대소 문자를 구분하려면 Base 62가 약 20 % 더 작아야합니다. 다음과 같이

자료 36, 당신은 쉽게, 자바 스크립트의 Number.toString(radix) 방법을 사용할 수 있습니다 :

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

자료 (62)를 들어, this forum post을 확인 할 수 있습니다. 기본적으로 다음을 수행 할 수 있어야합니다.

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

내가 잘못 본 것이 아니라면 OP는 기본 62가 필요합니다. – spender

+0

@spender : A-Z가 명시 적으로 언급되었으므로 네 말이 맞습니다. 내 대답을 수정했습니다. –

+0

123456.toString (36)은 요구 사항을 만족합니다. 너무 나쁘면 기본 62를 수행하지 않는 것이 좋습니다. – alumb

0

YouTube와 비슷한 키를 만들려면이 방법을 사용하십시오. 정규 표현식을 사용하여 숫자를 캡처 한 다음 일치 목록을 순환하여 문자열을 조합합니다.

chars 배열의 순서는 임의적입니다. 실제로 원하는대로 만들 수는 있지만 일단 설정하면 나중에 변경하지 마십시오. 그렇지 않으면 중복 키로 실행될 수 있습니다. 중복 된 것이 없습니다.

여기에서 num은 입력 키를 보유하는 변수입니다. 이 샘플에서는 매우 길지만 길이는 제한이 없습니다.

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

그리고 여기 할 경우에 누구를하는 데 도움이, 1 기반의 배열이 아닌 자바 스크립트의 0 기반 배열을 사용하는 콜드 퓨전 (Cold Fusion)의 구현입니다.

<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> 
관련 문제