くりにっき

フルスタックキュアエンジニアです

rubicureを使って各シリーズのプリキュアの人数を40バイトで計算する

きっかけ

こういうタイムラインだったので rubicure でサクッと出してみた

https://twitter.com/krs653/status/660485585086251008

出したやつ

require "rubicure"
p Precure.map{|s|[s.title,s.girls.size]}
[["ふたりはプリキュア", 2], ["ふたりはプリキュア Max Heart", 3], ["ふたりはプリキュア Splash☆Star", 2], ["Yes! プリキュア5", 5], ["Yes! プリキュア5 Go Go!", 6], ["フレッシュプリキュア!", 4], ["ハートキャッチプリキュア!", 4], ["スイートプリキュア♪", 4], ["スマイルプリキュア!", 5], ["ドキドキ!プリキュア", 5], ["ハピネスチャージプリキュア!", 4], ["Go!プリンセスプリキュア", 4]]

pp で見やすくしたやつ

require "rubicure"
pp Precure.map{|s|[s.title,s.girls.size]}
[["ふたりはプリキュア", 2],
 ["ふたりはプリキュア Max Heart", 3],
 ["ふたりはプリキュア Splash☆Star", 2],
 ["Yes! プリキュア5", 5],
 ["Yes! プリキュア5 Go Go!", 6],
 ["フレッシュプリキュア!", 4],
 ["ハートキャッチプリキュア!", 4],
 ["スイートプリキュア♪", 4],
 ["スマイルプリキュア!", 5],
 ["ドキドキ!プリキュア", 5],
 ["ハピネスチャージプリキュア!", 4],
 ["Go!プリンセスプリキュア", 4]]

ワンライナーだとこんなの

$ ruby -rubicure -e "p Precure.map{|s|[s.title,s.girls.size]}"
[["ふたりはプリキュア", 2], ["ふたりはプリキュア Max Heart", 3], ["ふたりはプリキュア SplashStar", 2], ["Yes プリキュア5", 5], ["Yes プリキュア5 Go Go", 6], ["フレッシュプリキュア!", 4], ["ハートキャッチプリキュア!", 4], ["スイートプリキュア♪", 4], ["スマイルプリキュア!", 5], ["ドキドキ!プリキュア", 5], ["ハピネスチャージプリキュア!", 4], ["Go!プリンセスプリキュア", 4]]

require の部分を除いた p Precure.map{|s|[s.title,s.girls.size]} だけで40文字です

どうでもいい解説

-e

-e の後に文字列を渡せばワンライナーとして実行できます

-rubicure

ruby-r オプションを渡すことで予めライブラリを require した状態で起動できます。ワンライナーとかでは便利ですね

だったら -rubicure じゃなくて -rrubicure じゃねーかと突っ込む人もいるかと思いますが、rubicureは -rubicure でもrequireできるようになっています

実際はこういうファイルがあるだけ https://github.com/sue445/rubicure/blob/v0.2.9/lib/ubicure.rb

Precure.map

Precureeach を実装しています

Precure.each{ |series| puts series.title }
ふたりはプリキュア
ふたりはプリキュア Max Heart
ふたりはプリキュア SplashStar
Yes! プリキュア5
Yes! プリキュア5 Go Go!
フレッシュプリキュア!
ハートキャッチプリキュア!
スイートプリキュア♪
スマイルプリキュア!
ドキドキ!プリキュア
ハピネスチャージプリキュア!
Go!プリンセスプリキュア

Precureは Enumerable をincludeしているので *1 map などのメソッドが呼べます

【参考】 http://docs.ruby-lang.org/ja/2.0.0/class/Enumerable.html https://github.com/sue445/rubicure/blob/v0.2.9/lib/rubicure/core.rb#L7

map{|s|[s.title,s.girls.size]}

mapのブロック引数には Rubicure::Seriesプリキュアの各シリーズのインスタンス)が渡されます。 https://github.com/sue445/rubicure/blob/v0.2.9/lib/rubicure/series.rb

そしてseriesはgirlsメソッド(そのシリーズに所属するプリキュアの配列を返す)を実装しているので、count, size, length などで人数が取得できます。今回は一番短いsizeを採用

map では 各シリーズのtitleと所属するプリキュアの人数のペアを配列で返しています。map複数の値を雑に返したい時は配列で返すのはよくやります。

*1:厳密にはmethod_missing呼んだ先の Rubicure::Core でincludeしている