4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sue445Advent Calendar 2016

Day 11

踏み逃げ禁止「kiriban_getter」

Posted at

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

kiriban_getterとは?

キリ番かどうか調べるためのgemです

用語の定義

ゾロ目

1111, 2222, 333など、全ての桁が0以外の同じ数字である数字

位番(くらいばん)

100, 2000など、最上位以外の数字が全部0である数字

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

キリ番

ゾロ目 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を使っています。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?