おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

N進数の整数を扱えるNAdicNumberをつくりました

N進数の整数を扱えるクラスNAdicNumberを作りました。
https://github.com/tsukasaoishi/n_adic_number

以下でインストールできますが、bundlerを使っている人がほとんどでしょう。

sudo gem install n_adic_number  

Gemfileなら当然以下になります。

gem "n_adic_number"  

2進数、8進数、16進数はどの言語でも標準で扱えると思いますが、NAdicNumerは任意の文字を使ったN進数の整数を扱えるようになります。
誰かが作ってそうな気がするのですが、gemパッケージとしては見当たらなかったし、初めての娘の育児をしながらの家庭内プログラミングだったので簡単にできそうなものにしたのです。

まずN進数の元となる文字の配列を指定して継承したクラスを作ります。短縮URLでよく使われているような62進数(0-9, A-Z, a-zの62文字を使う)は以下のようにします。

class Number64 < NAdicNumber::Base  
  mapping ["0".."9", "A".."Z", "a".."z"].map{|r| r.to_a}.flatten  
end  

あとはinitializerの引数に整数を指定すればOKです。

a = Number64.new(1)  
a.to_s #=> "1"  
a.to_i #=> 1  

b = Number64.new(61)  
b.to_s #=> "z"  
b.to_i #=> 61  

c = a + b  
c.to_s #=> "10"  
c.to_i #=> 62  

N進数の文字列を指定することもできます。

d = Number64.new("z")  
d.to_s #=> "z"  
d.to_i #=> 61  

Fixnumとの四則演算も可能です。

c += 1  
c.to_s #=> "11"  
c.to_i #=> 63  

c *= 100  
c.to_s #=> "1dc"  
c.to_i #=> 6300  

任意の文字が使えるので以下のようなこともできます。

class NumberX < NAdicNumber::Base  
  mapping "あいうえおかきくけこ".chars  
end  

a = NumberX.new(1)  
a.to_s #=> "い"  
a.to_i #=> 1  
b = NumberX.new(9)  
b.to_s #=> "こ"  
b.to_i #=> 9  
c = a + b  
c.to_s #=> "いあ"  
c.to_i #=> 10  

どうでもいいようなクラスであります。