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

Tsukasa OISHI

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

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