62進数変換ライブラリもRuby版を作って見ました。
時計フォーマットの圧縮などに最適な62進数は、正直60進数でもいいのではないか?
どうせなら記号も混ぜて100進数ぐらいにして欲しい・・・
というご意見をいただきながら、まずは実直に62進数を貫いて見たいと思います。
ソースコード
class Decimal62
def char()
char = "0123456789"
char += "abcdefghijklmnopqrstuvwxyz"
char += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
return char
end
def encode(num)
str = []
cn = self.char.length
while num != 0 do
a1 = (num / cn).to_i
a2 = num - a1 * cn
s = self.char[a2]
str.unshift(s)
num = a1
end
res = str.join("")
return res
end
def decode(str)
char = {}
cn = self.char.length
for i in 0..cn-1 do
char[self.char[i]] = i
end
slen = str.length
num = 0
for i in 0..slen do
s = str[(i+1)*-1]
pow = cn**i
num += char[s].to_i * pow
end
return num
end
end
dec = Decimal62.new()
enc = dec.encode(20180425231245)
dec = dec.decode(enc)
print enc,"\n"
print dec,"\n"
実行
$ ruby decimal62.rb
> 5JhPVGod
> 20180425231245
ちょこっと解説
ruby言語をメインで使っている人に怒られるかもしれませんが、グローバル変数として持たせたかった62個の文字列をclassメソッドとして扱っています。
理由は簡単で、class内での変数がうまく定義できなかったので、暫定処理でこうしてます。
※もっと効率的な記述方法教えてください。
少し手こずった点として、多言語でのint宣言がrubyでは「.to_i」で行うという点、ちなみに、文字型にしたい場合は「.to_s」なのだそうです。
少し独自な方式でなかなか手になじみませんが、分かりやすいという点では納得ですね。
以前の記事でも書いたのですが、whileとfor文の書き方が、他の言語とは違って癖があるので、これもRubyに慣れるしかなさそうですね。
個人的には、PHPとjavascript方式やC言語方式が楽なんですけどね・・・
全体的な構成は多言語と同じようにしているので、そこに関しての解説は以前記事を参考にしてみてください。
多言語対応
0 件のコメント:
コメントを投稿