きっかけ
こういうタイムラインだったので rubicure でサクッと出してみた
この話題で僕がよく授業で話すのは
— 万博@エネミーオブテジナ (@bampaku) October 31, 2015
「2,3,4,5,6、?、?、?」
の、最後3つを埋めよってやつ。
7,8,9だと思うでしょ?でも、本当にそれしか考えられないか?他のアルゴリズムで埋められる可能性はないか?って。
そして、おもむろに最後3つに「4,4,4」と書くのです。
生徒はざわつきます。それぞれが
— 万博@エネミーオブテジナ (@bampaku) October 31, 2015
「2,3,4,5,6,4,4,4」
この数列を作ることができるアルゴリズムを探します。そしてある程度生徒の考えが煮詰まったところで、僕はドヤ顔でこういうのです。
「これは歴代プリキュアの人数です」https://t.co/9eYKafUEFT
https://twitter.com/krs653/status/660485585086251008
出したやつ
ruby -rubicure -e "p Precure.map{|s|[s.title,s.girls.size]}"
— sue445 (@sue445) October 31, 2015
これが各シリーズのプリキュアの人数を出すワンライナーです。ご査収ください #これが一番短いと思います pic.twitter.com/2oJZZK0Nv3
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], ["ふたりはプリキュア Splash☆Star", 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
Precure
は each
を実装しています
Precure.each{ |series| puts series.title } ふたりはプリキュア ふたりはプリキュア Max Heart ふたりはプリキュア Splash☆Star 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している