2017-10-14 3 views
2

だから私は見つけたこのクールなプロジェクトを(Python 3ではなく)プログラムしようとしています。Pythonで基数64に変換する

復路64個の数字の順序は逆の順序でベース64番号として36ビット数nの6文字列表現:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz- +

例えば

encode(0) → '000000' 

encode() → 'gR1iC9' 

encode(68719476735) → '++++++' 

def encode(n): 
    SYM = {'0': 0, 
     '1': 1, 
     '2': 2, 
     '3': 3, 
     '4': 4, 
     '5': 5, 
     '6': 6, 
     '7': 7, 
     '8': 8, 
     '9': 9, 
     'A': 10, 
     'B': 11, 
     'C': 12, 
     'D': 13, 
     'E': 14, 
     'F': 15, 
     'G': 16, 
     'H': 17, 
     'I': 18, 
     'J': 19, 
     'K': 20, 
     'L': 21, 
     'M': 22, 
     'N': 23, 
     'O': 24, 
     'P': 25, 
     'Q': 26, 
     'R': 27, 
     'S': 28, 
     'T': 29, 
     'U': 30, 
     'V': 31, 
     'W': 32, 
     'X': 33, 
     'Y': 34, 
     'Z': 35, 
     'a': 36, 
     'b': 37, 
     'c': 38, 
     'd': 39, 
     'e': 40, 
     'f': 41, 
     'g': 42, 
     'h': 43, 
     'i': 44, 
     'j': 45, 
     'k': 46, 
     'l': 47, 
     'm': 48, 
     'n': 49, 
     'o': 50, 
     'p': 51, 
     'q': 52, 
     'r': 53, 
     's': 54, 
     't': 55, 
     'u': 56, 
     'v': 57, 
     'w': 58, 
     'x': 59, 
     'y': 60, 
     'z': 61, 
     '-': 62, 
     '+': 63,} 

しかし、今、私は次に何をすべきかわからない:

は、私がこれまで持っていることです。私は文字列や連結などを使用したくないので、私はモジュラスと標準数論+ for/while/elseメソッドを使用してこれを行いたいと思います。

私の考えは

r1 = n % 63 
r2 = r1 % 63 
r3 = r2 % 63 
r4 = r3 % 63 
r5 = r4 % 63 
r6 = r5 % 63 

を定義することであった。しかし、私はそこから何をすべきかわかりません。

nをベース64に変換するにはどうすればよいですか?

最後に、新しい表現を見つけた後に数字を逆にするために、各自の数字を分離して後方に一緒に戻すように10の累乗を調整します。

これをプログラミングするにはどうすればよいですか?

ありがとうございます!

+0

'が何をしているかを調べる。 –

+0

2番目のコードサンプルは何をしますか? –

+0

「n」が100に等しいことをテストしてください。 –

答えて

2

あなたが望むことを行うコードがいくつかあります。 get_digit関数はif... elifの束を使用して、dの0 < = d < 64を対応する文字番号に変換し、標準のchr関数を使用してその数値を実際の文字に変換します。 encode関数は実際の剰余計算を行い、get_digitを呼び出して文字変換を行い、結果をoutリストに保存します。我々は代替に、2のべき乗のベースで作業しているので、私たちは、その長さ6

def get_digit(d): 
    ''' Convert a base 64 digit to the desired character ''' 
    if 0 <= d <= 9: 
     # 0 - 9 
     c = 48 + d 
    elif 10 <= d <= 35: 
     # A - Z 
     c = 55 + d 
    elif 36 <= d <= 61: 
     # a - z 
     c = 61 + d 
    elif d == 62: 
     # - 
     c = 45 
    elif d == 63: 
     # + 
     c = 43 
    else: 
     # We should never get here 
     raise ValueError('Invalid digit for base 64: ' + str(d)) 
    return chr(c) 

# Test `digit` 
print(''.join([get_digit(d) for d in range(64)])) 

def encode(n): 
    ''' Convert integer n to base 64 ''' 
    out = [] 
    while n: 
     n, r = n // 64, n % 64 
     out.append(get_digit(r)) 
    while len(out) < 6: 
     out.append('0') 
    return ''.join(out) 

# Test `encode` 
for i in (0,, 68719476735): 
    print(i, encode(i)) 

出力

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+ 
0 000000 
gR1iC9 
68719476735 ++++++ 

を作るために'0'文字とそのリストを追加します

n, r = n // 64, n % 64 

ビット単位の操作を使用する

n, r = n >> 64, n & 63 

少し速いですが、ここではそれほど大きな違いはなく、前のコードは読みやすくなっています。 OTOHでは、なぜビットワイズバージョンが正しい結果をもたらすのかを理解することは有益です。

+0

私は十分な担当者がいないので、私はupvoteすることはできませんが、ありがとうございます。 –

+0

私はそれを差し込んで、それは動作します;)もう一度ありがとう。今私はそれを理解する次の数時間を過ごすつもりです! –

+0

だから私はこのプログラムの逆を書くことを試みています - それはデコードします。私は 'chr'を' ord 'に変更すべきだが、それ以外は何か? –

関連する問題