ようへいの日々精進XP

よかろうもん

2018 年 03 月 25 日(日)

ジョギング

  • 休む
  • 足の具合が良くなるまでは, 積極的に休んだ方がいいのかなと思った次第

日課

  • これは, すっかり実施のタイミングを見失った
  • ジョギングは休んでも, こっちだけはやるようにしたい

チキフェス

高校時代の先輩が鹿児島でからあげ屋さんを営んでいて, チキフェスに出店されているとのことで, 挨拶を兼ねて行ってきた.

先輩からは出来立ての唐揚げを頂いたり, 奥さんの高校時代の同級生と遭遇したり, 鶏が人の縁を取り持つ...なんて駄洒落が出てきそうな昼下がりだった.

先輩から頂いた唐揚げは夕飯に本当に美味しく頂いた. 有難う御座いました.

今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (8) ~

もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.

Q22. 組み込みライブラリ

以下のコードについて適切な記述はどれか.

%r|(http://www(\.)(.*)/) | =~ "http://www.abc.com/"

以下, irb での実行例.

irb(main):010:0> %r|(http://www(\.)(.*)/)| =~ "http://www.abc.com/"
=> 0
irb(main):011:0> $0
=> "irb"
irb(main):012:0> $1
=> "http://www.abc.com/"
irb(main):013:0> $2
=> "."
irb(main):014:0> $3
=> "abc.com"

Q23. 組み込みライブラリ

以下の実行結果になるように, [ x ] に記述する適切なコードを全て選ぶ.

p [ x ]

以下, 実行結果.

[1, 4, 9]

実行結果になるようなコード.

[1, 2, 3].map {|x| x ** 2}
[1, 2, 3].collect {|x| x ** 2}
[1, 2, 3].inject([]) {|x, y| x << y ** 2}

以下, irb での実行結果.

irb(main):001:0> [1, 2, 3].map {|x| x ** 2}
=> [1, 4, 9]
irb(main):002:0> [1, 2, 3].collect {|x| x ** 2}
=> [1, 4, 9]
irb(main):003:0> [1, 2, 3].inject([]) {|x, y| x << y ** 2}
=> [1, 4, 9]

実行結果にならない選択肢を irb で実行してみる.

irb(main):004:0> [1, 2, 3].inject {|x, y| x + y ** 2}
=> 14

map と collect の挙動 (配列の各要素をブロック内で評価した結果を配列で返す) は理解出来るけど, inject の挙動についてはイマイチなんだけど, ざっくり言うと配列内の要素のたたみこみ演算を行う.

# 配列内の要素を合計する
irb(main):001:0> p [2, 3, 4, 5].inject {|result, item| result + item }
14
=> 14
# 同様の処理を inject を使わない例で
irb(main):002:0> result = 0
=> 0
irb(main):003:0> [2, 3, 4, 5].each {|v| result += v }
=> [2, 3, 4, 5]
irb(main):004:0> p result
14
=> 14

たたみこみ演算とは, 初期値と自身の要素を順に組み合わせて結果を返す演算で, 1 から 5 までの数値の 2 乗の和を求める場合には以下のように実行する.

irb(main):005:0> [1, 2, 3, 4, 5].inject(0) {|result, v| result + v ** 2}
=> 55
irb(main):008:0> [1, 2, 3, 4, 5].inject([]) {|result, v| result << v ** 2}
=> [1, 4, 9, 16, 25]

Q24. 組み込みライブラリ

以下のコードを実行したらどうなるか.

p (1..Float::INFINITY).lazy.map {|x| x ** 2}.take(3).inject(0, &:+)

以下, irb による実行例.

irb(main):001:0> p (1..Float::INFINITY).lazy.map {|x| x ** 2}.take(3).inject(0, &:+)
14
=> 14

以下, 解説より抜粋.

  • Enumerable#lazy は実際に値が必要になるまで値を生成せず,take や first が呼ばれた際に必要な数だけ値を評価してリストとして返すメソッド
  • 設問では 1..Float::INFINITY で大量の数に対して take(3) を呼んだ時のみ必要な数を map した結果を返している

フムフム