ようへいの日々精進XP

よかろうもん

2018 年 06 月 15 日 (金)

ジョギング

  • 自宅→香椎神宮香椎浜
  • 引き続き, 右足 (右腰から右足全体) にかけて痛み... は, 多少, 今日は良かった

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

香椎ミートアップ

  • ということで, 香椎駅の中に出来た竹の家に行ってきた
  • 色々ワイワイ喋って楽しかったけど呑み過ぎた感

今日のるびぃ ~ REx - Ruby Examination にチャレンジ (27) ~

REx - Ruby Examination の問題を自分なりにアレンジした上で 1 〜 3 問くらいずつ解いていく. 正直言ってかなり難しい. 尚, irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

Ruby コマンドラインオプション

Ruby で使用可能なオプションではないものを選択する.

  • -t
  • -l
  • -p
  • -f

以下, 利用可能ではないオプション.

  • -t
  • -f

以下, 利用可能なオプション (解説より抜粋)

  • -l
    • 各行の最後に String#chop! を実行する (ドキュメントより引用: 行末の自動処理を行います。まず、$\ を $/ と同じ値に設定し, printでの出力 時に改行を付加するようにします。)
  • -p
    • -n オプションと同様に $_ を出力する
    • $_ とは, 最後に Kernel.#gets または Kernel.#readline で読み込んだ文字列です。 (ドキュメントより引用)

以下, 実行例.

# 通常は print を利用する場合, 改行は付加されない
$ ruby -e 'print "01234567890"'
01234567890$
# -l オプションを付けると, print を利用した際に改行を付加する
$ ruby -l -e 'print "01234567890"'
01234567890
# -p オプションのサンプル
$ echo foo | ruby -p -e '$_.tr! "a-z", "A-Z"'
FOO
# ちなみに, -n オプションは以下のような挙動となる
$ echo 'foo' | ruby -n -e 'print'
foo

Enumerator::Lazy

以下のコードは Enumerator::Lazy を利用している. 先頭から 5 つの値を取り出す為にはどのメソッドが必要か.

(1..100).each.lazy.chunk(&:even?)

以下, 解答.

take(5).force first(5)

以下, irb による実行例.

irb(main):001:0> (1..100).each.lazy.chunk(&:even?)
=> #<Enumerator::Lazy: #<Enumerator: #<Enumerator::Generator:0x0055758c2a6dc0>:each>>
irb(main):002:0> (1..100).each.lazy.chunk(&:even?).first(5)
=> [[false, [1]], [true, [2]], [false, [3]], [true, [4]], [false, [5]]]
irb(main):003:0> (1..100).each.lazy.chunk(&:even?).take(5)
=> #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator: #<Enumerator::Generator:0x0055758c24f048>:each>>:take(5)>
irb(main):004:0> (1..100).each.lazy.chunk(&:even?).take(5).force
=> [[false, [1]], [true, [2]], [false, [3]], [true, [4]], [false, [5]]]
irb(main):006:0> (1..100).each.lazy.chunk(&:even?).force.take(5)
=> [[false, [1]], [true, [2]], [false, [3]], [true, [4]], [false, [5]]]
irb(main):007:0> (1..100).each.lazy.chunk(&:even?).first
=> [false, [1]]
irb(main):008:0> (1..100).each.lazy.chunk(&:even?).force.first(5)
=> [[false, [1]], [true, [2]], [false, [3]], [true, [4]], [false, [5]]]

以下, 解説より抜粋.

  • 単純に値を取り出すには, Enumerator::Lazy#force 又は Enumerator::Lazy#first を利用する
  • 設問では, 「先頭から 5 つの値」とあるので, first(5) を利用する
  • Enumerator::Lazy#force は全ての値を取り出す (全ての要素を含む配列を返す) が, 5 つの値を取り出す為には Enumerator::Lazy#take 又は Enumerator::Lazy#first を利用する
  • Enumerator::Lazy#takeEnumerable#take と異なり, Enumerator::Lazyインスタンスを戻り値となる為, Enumerator::Lazy#force で実際の値を取り出す

フムフム.