踏み逃げ禁止「kiriban_getter」

11はゾロ目なのでキリ番gemの紹介です。

# kiriban_getterとは?
キリ番かどうか調べるためのgemです

* https://github.com/sue445/kiriban_getter
* https://rubygems.org/gems/kiriban_getter

# 用語の定義
## ゾロ目
1111, 2222, 333など、全ての桁が0以外の同じ数字である数字

## 位番（くらいばん）
100, 2000など、最上位以外の数字が全部0である数字

* このgemを作るためにキリ番系のサイトを頑張って調べたのですが、こういうキリ番に関して名前をつけているサイトが見つかりませんでした
* いくつか見た中で一番しっくりきたのが位番だったので採用
* もっといい名前があったらコメントで教えてください :sweat_smile: 

## キリ番
ゾロ目 OR 位番

# 使い方
refinementsを使っているので

```ruby
using KiribanGetter
```

したところでのみ下記のメソッドが使えるようになります

## zorome?
```ruby
111.zorome?
#=> true

2222.zorome?
#=> true

2223.zorome?
#=> false
```

## kuraiban?
```ruby
100.kuraiban?
#=> true

101.kuraiban?
#=> false

111.kuraiban?
#=> false
```

## kiriban?
```ruby
100.kiriban?
#=> true

101.kiriban?
#=> false

111.kiriban?
#=> true
```

# kiriban gemとの違い
最初kiribanって名前でgemを作ってpushしようとしたら下記の同名gemがあったので名前を変えてリリースしました（つらい）

https://github.com/osyo-manga/gem-kiriban

違いは下記です

* kiribanはRubyのコアクラス（ObjectやString）をオープンクラスしてメソッドを直接生やしているが、kiriban_getterはrefinementsを使ってるので影響範囲は `using KiribanGetter` したところのみ
* kiribanの方が対応してるキリ番は多い
* kiribanは文字列に変換できるオブジェクトなら `AAA` のようなやつでもチェックできるが、kirban_getterは `Integer` のみチェック
* ベンチマーク結果はkiriban_getterの方が速い（後述）

# ベンチマーク
同一のメソッドに対していくつか実装していますが、そのうち一番ベンチマークで一番速かったものだけを採用しています。

```shell-session
$ 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](https://docs.ruby-lang.org/ja/latest/class/Benchmark.html) ではなく、benchmark-ipsというgemを使っています。

https://github.com/evanphx/benchmark-ips