[Ruby] 10進数を62進数に変換するライブラリ

2018年4月28日

Ruby テクノロジー プログラミング 特集

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言語方式が楽なんですけどね・・・ 全体的な構成は多言語と同じようにしているので、そこに関しての解説は以前記事を参考にしてみてください。

多言語対応

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ