CodeIQ Ruby問題でRubyの便利メソッドを学ぶ
最近学んだRubyの便利メソッド
文字列をフォーマット(sprintfじゃなくていい)
sprintfを使わなくても、stringの%でサクっとフォーマット
例:右寄せする
n = 8 puts "'%2d'"%n # => ' 8'
参考:Rubyのプログラムでsprintfを見る機会がほとんどない理由 - 福島餃子Ruby親方
文字列をちょうど半分に分割する
偶数桁の文字列をちょうど半分にする場合。 奇数桁だったら、あまりの1文字を前につけるか、後ろにつけるかでもうちょい工夫しないとだわ。。
words = "12345678" n = words.size / 2 puts words.scan(/.{1,#{n}}/) # => [ "1234", "5678" ]
参考:
文字列を配列にする
"HELLO".chars # => ["H", "E", "L", "L", "O"]
配列を転置する(zip)
1次元配列から、転置した2次元配列を作る。
array1 = [ 1, 2, 3 ] array2 = [ 4, 5, 6 ] array3 = [ 7, 8, 9 ] array1.zip(array2, array3) # => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
配列を転置する(transpose)
2次元配列を転置する。
arrays = [ [1, 2, 3], [ 4, 5, 6 ], [ 7, 8, 9 ] ] arrays.transpose # => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
配列の要素をn個ずつループ1
1個ずつずれる。
n = 3 [ 1, 2, 3, 4 ].each_cons(n) do | a, b, c | puts "#{a}, #{b}, #{c}" end # 1, 2, 3 # 2, 3, 4
配列の要素をn個ずつループ2
n個ずつずれる。
n = 3 [ 1, 2, 3, 4 5, 6, 7, 8 ].each_sりcえ(n) do | a, b, c | puts "#{a}, #{b}, #{c}" end # 1, 2, 3 # 4, 5, 6 # 7, 8
下書きしたまま時間が経って、赤ペン先生の回答が返って来た
1記事書くのにどんだけ時間かかってるんだか;;
赤ペン先生の方はその間に50人の回答見て、フィードバック返してるのに・・ やっぱすごいな〜
Rangeをいちいちto_aしなくていい
(1..line_nums).to_a.map do |i|
こんな感じに書いてたのを・・
(1..line_nums).map do |i|
これでよい。 不要なメソッド呼び出しなくなりスッキリ。
ランダムな結果を1個返したい時にsampleすればいい
ある範囲から、数を指定して、ランダムな結果を配列でとりたかった。
a = 1 b = 10 (a..b).to_a.shuffle.shift(5) => [2, 8, 4, 7, 6]
こんな感じにしてたのを・・
a = 1 b = 10 [*a..b].sample(5) => [8, 5, 6, 4, 9]
これで良いらしい。スッキリ・・・・
このアスタリスク・・なに??
調べてみた
a = 'a' z = 'z' whats_this = (a..z) # => "a".."z" whats_this.class # => Range whats_this = [a..z] # => ["a".."z"] whats_this.class # => Array whats_this.size # => 1 whats_this = [*a..z] # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] whats_this.class # => Array whats_this.size # => 26
アスタリスク有りの場合、Arrayが展開されている。 多重代入時の展開、らしい。 多重代入時、というか、右辺に来た場合に展開されるようだ。
参考:
ちなみに、解いてた赤ペン先生の課題はこちらでした。
Ruby -「ビンゴカード作成問題」の優秀作品ベスト3を発表します! #codeiq - give IT a try
模範解答も、優秀者3名もすげ〜 こうやって短いコードで、自分のとすごい差を見れるって、すごいわ。 いくらOSSで沢山すごい人のコード、見放題といっても、初心者にはどこ見ていいのか見つけるのからして難しいからなぁ。 いや〜勉強になりました。