11はゾロ目なのでキリ番gemの紹介です。
kiriban_getterとは?
キリ番かどうか調べるためのgemです
用語の定義
ゾロ目
1111, 2222, 333など、全ての桁が0以外の同じ数字である数字
位番(くらいばん)
100, 2000など、最上位以外の数字が全部0である数字
- このgemを作るためにキリ番系のサイトを頑張って調べたのですが、こういうキリ番に関して名前をつけているサイトが見つかりませんでした
- いくつか見た中で一番しっくりきたのが位番だったので採用
- もっといい名前があったらコメントで教えてください
キリ番
ゾロ目 OR 位番
使い方
refinementsを使っているので
using KiribanGetter
したところでのみ下記のメソッドが使えるようになります
zorome?
111.zorome?
#=> true
2222.zorome?
#=> true
2223.zorome?
#=> false
kuraiban?
100.kuraiban?
#=> true
101.kuraiban?
#=> false
111.kuraiban?
#=> false
kiriban?
100.kiriban?
#=> true
101.kiriban?
#=> false
111.kiriban?
#=> true
kiriban gemとの違い
最初kiribanって名前でgemを作ってpushしようとしたら下記の同名gemがあったので名前を変えてリリースしました(つらい)
違いは下記です
- kiribanはRubyのコアクラス(ObjectやString)をオープンクラスしてメソッドを直接生やしているが、kiriban_getterはrefinementsを使ってるので影響範囲は
using KiribanGetter
したところのみ - kiribanの方が対応してるキリ番は多い
- kiribanは文字列に変換できるオブジェクトなら
AAA
のようなやつでもチェックできるが、kirban_getterはInteger
のみチェック - ベンチマーク結果はkiriban_getterの方が速い(後述)
ベンチマーク
同一のメソッドに対していくつか実装していますが、そのうち一番ベンチマークで一番速かったものだけを採用しています。
$ bundle exec ruby benchmark/kiriban_getter.rb
Warming up --------------------------------------
digit_1 (legacy) 73.095k i/100ms
digit_2 (v0.1.0) 82.049k i/100ms
digit_3 84.584k i/100ms
digit_4 (v0.1.1) 84.366k i/100ms
Calculating -------------------------------------
digit_1 (legacy) 1.062M (± 2.4%) i/s - 5.336M in 5.025518s
digit_2 (v0.1.0) 1.292M (± 2.7%) i/s - 6.482M in 5.021483s
digit_3 1.397M (± 3.0%) i/s - 7.020M in 5.031134s
digit_4 (v0.1.1) 1.506M (± 5.7%) i/s - 7.509M in 5.006177s
Comparison:
digit_4 (v0.1.1): 1505969.8 i/s
digit_3: 1396793.8 i/s - same-ish: difference falls within error
digit_2 (v0.1.0): 1291836.8 i/s - 1.17x slower
digit_1 (legacy): 1062391.6 i/s - 1.42x slower
Warming up --------------------------------------
kuraiban_1? (legacy) 40.928k i/100ms
kuraiban_2? (v0.1.0) 67.337k i/100ms
zeroban? (kiriban gem)
8.350k i/100ms
Calculating -------------------------------------
kuraiban_1? (legacy) 602.408k (± 2.0%) i/s - 3.029M in 5.029728s
kuraiban_2? (v0.1.0) 1.064M (± 2.6%) i/s - 5.387M in 5.064581s
zeroban? (kiriban gem)
91.694k (± 2.3%) i/s - 459.250k in 5.011135s
Comparison:
kuraiban_2? (v0.1.0): 1064390.0 i/s
kuraiban_1? (legacy): 602407.8 i/s - 1.77x slower
zeroban? (kiriban gem): 91693.8 i/s - 11.61x slower
Warming up --------------------------------------
zorome_1? (legacy) 10.478k i/100ms
zorome_2? (v0.1.0) 25.437k i/100ms
zoroban? (kiriban gem)
6.952k i/100ms
Calculating -------------------------------------
zorome_1? (legacy) 113.520k (± 3.9%) i/s - 576.290k in 5.084746s
zorome_2? (v0.1.0) 312.690k (± 2.8%) i/s - 1.577M in 5.047756s
zoroban? (kiriban gem)
75.835k (± 2.8%) i/s - 382.360k in 5.046056s
Comparison:
zorome_2? (v0.1.0): 312689.9 i/s
zorome_1? (legacy): 113520.3 i/s - 2.75x slower
zoroban? (kiriban gem): 75834.5 i/s - 4.12x slower
legacyというのはリリース前の初期実装です。
上記ベンチマークにはRuby標準の benchmark ではなく、benchmark-ipsというgemを使っています。