2016-03-31 10 views
5

更新:番号(文字セットが付属)JavaScriptの

次のコードは、55834574847より大きい整数遭遇char.to_text $まで完璧に動作します。 、手動で上記のコードを反復することは正常な応答を生成する必要があります

$char.to_num("military",alpha) => 98987733674 
$char.to_text(98987733674,alpha) => "undefinedundefinedundefinedundefinedundefinedundefinedundefinedy" 

、なぜそれがこの「未定義の...」の文字列を得ず、それはだから、それは単純である:ここでは

alpha="abcdefghijklmnopqrstuvwxyz"; 
$char={ 
    to_num:function(s,c){ 
     var l=c.length,o={}; 
     c.split('').forEach(function(a,i){ 
      o[a]=i 
     }); 
     return s.split('').reduce(function(r,a){ 
      return r*l+o[a] 
     },0) 
    }, 
    to_text:function(i,c){ 
     var l=c.length,s=''; 
     do{ 
      s=c[i%l]+s; // i%l 
      i/=l; 
      i|=0 
     }while(i!==0); 
     return s 
    } 
}; 

は迅速スニップですJSのための多数の操作?

+0

、あなただけの 'のparseInt使用していたかもしれない(27)' ... – Bergi

+0

@Bergiは、本当に、あなたにも1 ... 9になるだろう。これにはいくらかのシフトが必要です。 –

+0

@ NinaScholz:OK、その後に 'replace'が続きます...しかし、彼が文字セットに' 0'を含んでいれば、1-9は重要ではないと思います。 – Bergi

答えて

2

これは簡略化indexOfと戻り値の単純なループとしてオブジェクトoを使用書き換えhash関数、と提案です。

希望する機能ihashは、ループを1つ使用します(do ... until)。これは、値の残りと長さを与えられたcharcterセットのインデックスとして使用します。次に、値をカーラクターセットの長さで除算し、整数部分が次の反復のために取られます(ゼロでない場合)。あなたが知っている

function hash(s) { 
 
    var c = '0abcdefghijklmnopqrstuvwxyz', 
 
     l = c.length, 
 
     o = {}; 
 

 
    c.split('').forEach(function (a, i) { 
 
     o[a] = i; 
 
    }); 
 
    return s.split('').reduce(function (r, a) { 
 
     return r * l + o[a]; 
 
    }, 0); 
 
} 
 

 
function ihash(i) { 
 
    var c = '0abcdefghijklmnopqrstuvwxyz', 
 
     l = c.length, 
 
     s = ''; 
 

 
    do { 
 
     s = c[i % l] + s; 
 
     i = Math.floor(i/l); 
 
    } while (i !== 0); 
 
    return s; 
 
} 
 

 
document.write(hash('0') + '<br>');   // => 0 
 
document.write(hash('a') + '<br>');   // => 1 
 
document.write(hash('hi') + '<br>');   // => 225 
 
document.write(hash('world') + '<br>');  // => 12531838 
 
document.write(hash('freecode') + '<br>'); // => 69810159857 
 

 
document.write(ihash(0) + '<br>');   // => '0' 
 
document.write(ihash(1) + '<br>');   // => 'a' 
 
document.write(ihash(225) + '<br>');   // => 'hi' 
 
document.write(ihash(12531838) + '<br>'); // => 'world' 
 
document.write(ihash(69810159857) + '<br>'); // => 'freecode'

+0

このスニペットはほぼ完璧に動作します。しかし、整数が55834574847より大きい場合は動作しなくなるのではないかと心配しています。なぜ、JSの数値環境(大きな数値を扱うときにはあまり効果的ではありません。更新を投稿して結果を表示する – JoBro

+0

@JoBro、editを参照してください。私は暗黙のキャストを 'Math.floor'で整数に変更しました。 –

+0

ありがとうございました!それは完全に動作します(:私はまだ興味がありますが、 "i | = 0"を "i = Math.floor(i/l)"に変更したのはまったく同じですか? – JoBro

0

ここに、文字列を戻すための疑似コードがあります。これは、異なるベースの数値を変換するのと似ています。

var txt = function(n, charset) { 
     var s ="" 
     while (n > 0) { 
      var r = n % charset.length; 
      n = n/charset.length; 
      s += charset[r]; 
     } 
     return s; 
    } 
関連する問題