まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

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力低いのぅ。。


ちなみに、解いてた赤ペン先生の課題はこちらでした。

Ruby -「ビンゴカード作成問題」の優秀作品ベスト3を発表します! #codeiq - give IT a try

模範解答も、優秀者3名もすげ〜 こうやって短いコードで、自分のとすごい差を見れるって、すごいわ。 いくらOSSで沢山すごい人のコード、見放題といっても、初心者にはどこ見ていいのか見つけるのからして難しいからなぁ。 いや〜勉強になりました。