アニメ「すべてがFになる」を見て、「すべてがFになる」gemを作ってみた

# すべてがFになる
ちょうど先ほど、アニメ「すべてがFになる」の最終回でしたね。
いや〜。楽しく見る事ができました。
ご存知ないかたは、こちらからどうぞ

[すべてがFになる - Wikipedia](https://ja.wikipedia.org/wiki/%E3%81%99%E3%81%B9%E3%81%A6%E3%81%8CF%E3%81%AB%E3%81%AA%E3%82%8B)
[TVアニメ「すべてがFになる THE PERFECT INSIDER」](http://www.f-noitamina.com/)

# 勢いに任せて
すべてがfになる `everything_becomes_f` method
と
すべてがfになったか、を判定する `everything_became_f?` method

を提供するgemを作ってみました。

[ryoff/everything_becomes_f](https://github.com/ryoff/everything_becomes_f)

# usage
## everything_became_f?
まずは【すべてがfになったか否か】を判定する `everything_became_f?`

integer

```rb
1.everything_became_f? # => false
14.everything_became_f? # => false
15.everything_became_f? # => true
16.everything_became_f? # => false
255.everything_became_f? # => true

65534.to_s(16) # => "fffe"
65534.everything_became_f? # => false
65535.to_s(16) # => "ffff"
65535.everything_became_f? # => true
```

String

```rb
'f'.everything_became_f? # => true
'fF'.everything_became_f? # => true
'FF'.everything_became_f? # => true
'ffffffffffffffffffffffffffffffffffffffffffffffffff'.everything_became_f? # => true
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'.everything_became_f? # => true
```

Time

```rb
ENV['TZ'] = 'UTC'
Time.new(1970, 1, 1, 0, 0, 15).everything_became_f? # => true
Time.new(1978, 7, 4, 21, 24, 15).everything_became_f? # => true

Time.new(2106, 2, 7, 6, 28, 14).to_i.to_s(16) # => "fffffffe"
Time.new(2106, 2, 7, 6, 28, 14).everything_became_f? # => false
Time.new(2106, 2, 7, 6, 28, 15).to_i.to_s(16) # => "ffffffff"
Time.new(2106, 2, 7, 6, 28, 15).everything_became_f? # => true
```

timeは、unixtimeにした数値を16進数にした場合に、すべてがfになっているかどうかを判定します。

## everything_becomes_f
続いて、【すべてがfになる】 `everything_becomes_f`

Integer

```rb
0.everything_becomes_f # => 15
1.everything_becomes_f # => 15
10.everything_becomes_f # => 15
15.everything_becomes_f # => 15
16.everything_becomes_f # => 255
254.everything_becomes_f # => 255
255.everything_becomes_f # => 255
256.everything_becomes_f # => 4095
65534.everything_becomes_f # => 65535
65535.everything_becomes_f # => 65535
```

`すべてがf` でなかった場合は、次に一番近いすべてがfになる数値を返却します。

String

```rb
'a'.everything_becomes_f # => 'f'
'af'.everything_becomes_f # => 'ff'
'fa'.everything_becomes_f # => 'ff'
'ffffffffffffffffffffffffffffffffffffffffffffffffffe'.everything_becomes_f # => 'fffffffffffffffffffffffffffffffffffffffffffffffffff'
'あいうえお'.everything_becomes_f # => 'fffff'
```

Time

```rb
Time.new(1970, 1, 1, 0, 0, 14).everything_becomes_f # => Time.new(1970, 1, 1, 0, 0, 15)
Time.new(1970, 1, 1, 0, 0, 15).everything_becomes_f # => Time.new(1970, 1, 1, 0, 0, 15)
Time.new(1970, 1, 1, 0, 0, 16).everything_becomes_f # => Time.new(1970, 1, 1, 0, 4, 15)
Time.new(1978, 7, 4, 21, 24, 14).everything_becomes_f # => Time.new(1978, 7, 4, 21, 24, 15)
Time.new(1978, 7, 4, 21, 24, 15).everything_becomes_f # => Time.new(1978, 7, 4, 21, 24, 15)
Time.new(1978, 7, 4, 21, 24, 16).everything_becomes_f # => Time.new(2106, 2, 7, 6, 28, 15)
```

Integerと同じように、次にすべてがfになる時刻を返却します。

# 作ってみて
すべてがfって、意外と難しいですね。
本当は、DateやArrayなどにもmethodを生やそうと思ったんですが、「すべてがfってどんな状態だ？？」って疑問に思ったら、あまりしっくりくるパターンを思いつかなかったです。

なんか、「こんな状態はすべてがfって言えるんじゃない？」といったパターン思いついたらPRお待ちしていますmm

判定のロジックは結構シンプルで、

```rb
class Integer
  def everything_became_f?
    to_s(16).squeeze == 'f'
  end
```

みたいな事をしています。

String#squeeze って使った事無かったから面白かったです。
[squeeze (String) - APIdock](http://apidock.com/ruby/String/squeeze)

何はともあれ、ネタgemでした mm