• Source
    1. # -*- coding: utf-8 -*-
    2. # q1001_answer_1.rb
    3.  
    4. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    5. # ・カウンタ変数を利用し、n になるまでは each メソッドの yield で渡ってくるブロック引数を無視するようにしました。
    6. # ・count を n 未満である間だけインクリメントするようにしました。
    7.  
    8. class AnswerQ1
    9. def each
    10. return to_enum unless block_given?
    11. a, b = 0, 1
    12. loop do
    13. yield b
    14. a, b = b, a + b
    15. end
    16. end
    17.  
    18. def drop n
    19. return to_enum :drop, n unless block_given?
    20. count = 0
    21. each do |el|
    22. if count < n
    23. count += 1
    24. next
    25. end
    26. yield el
    27. end
    28. end
    29. end
    30.  
    31. # ※これ以降は変更しないこと。
    32. if $0 == __FILE__
    33. require 'test/unit'
    34.  
    35. class AnswerQ1Test < Test::Unit::TestCase
    36. def setup
    37. @fib = AnswerQ1.new
    38. end
    39.  
    40. def test_each
    41. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    42. result = []
    43. @fib.each do |n|
    44. result << n
    45. break if result.size == 10
    46. end
    47. assert_equal(expected, result)
    48. end
    49.  
    50. def test_drop
    51. expected = [8, 13, 21, 34, 55]
    52. result = []
    53. @fib.drop(5) do |n|
    54. result << n
    55. break if result.size == 5
    56. end
    57. assert_equal(expected, result)
    58. end
    59.  
    60. def test_100th_fib
    61. expected = 354_224_848_179_261_915_075
    62. result = @fib.drop(99).first
    63. assert_equal(expected, result)
    64. end
    65. end
    66. end