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
どうでもいいようなクラスであります。