• Source
    1. # -*- coding: utf-8 -*-
    2. # q1001_answer_2.rb
    3.  
    4. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    5. # ・Enumerator#next と Integer#times を利用して、コンパクトにまとめました。
    6.  
    7. class AnswerQ1
    8. def each
    9. return to_enum unless block_given?
    10. a, b = 0, 1
    11. loop do
    12. yield b
    13. a, b = b, a + b
    14. end
    15. end
    16.  
    17. def drop n
    18. return to_enum :drop, n unless block_given?
    19. enum = each
    20. n.times { enum.next }
    21. loop do
    22. yield enum.next
    23. end
    24. end
    25. end
    26.  
    27. # ※これ以降は変更しないこと。
    28. if $0 == __FILE__
    29. require 'test/unit'
    30.  
    31. class AnswerQ1Test < Test::Unit::TestCase
    32. def setup
    33. @fib = AnswerQ1.new
    34. end
    35.  
    36. def test_each
    37. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    38. result = []
    39. @fib.each do |n|
    40. result << n
    41. break if result.size == 10
    42. end
    43. assert_equal(expected, result)
    44. end
    45.  
    46. def test_drop
    47. expected = [8, 13, 21, 34, 55]
    48. result = []
    49. @fib.drop(5) do |n|
    50. result << n
    51. break if result.size == 5
    52. end
    53. assert_equal(expected, result)
    54. end
    55.  
    56. def test_100th_fib
    57. expected = 354_224_848_179_261_915_075
    58. result = @fib.drop(99).first
    59. assert_equal(expected, result)
    60. end
    61. end
    62. end