• Source
    1. # -*- coding: utf-8 -*-
    2.  
    3. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    4. # ・
    5. # ・
    6.  
    7. # 必要に応じてここに require 文を挿入してもOKです(標準添付ライブラリに限る)。
    8. # 例:require 'set'
    9.  
    10. # 無限リスト(ストリーム)に対応した直積(Cartesian product)を生成して列挙するメソッド
    11. def infinite_product *iters
    12. return to_enum :infinite_product, *iters unless block_given?
    13. # ここを適切に実装しなおしてテストが通るようにしてください。
    14. # ただし、以下の条件を満たすこと:
    15. # ・後述の別メソッド infinite_product_process を利用すること。
    16. # ・yield 式を必ず利用すること。
    17. iters[0].each do |el|
    18. yield [el]
    19. end
    20. # 桜先生からのワンポイントアドバイス:
    21. # ・今まで学んだことを最大限に活かしてね♪
    22. # ・Good Luck!
    23. end
    24.  
    25. def infinite_product_process *args
    26. # メソッドの引数は変更しても可↑。ただし「ブロック引数 (&block)」は利用不可。
    27. # メソッドの引数を変更した場合は、下記の ↓ to_enum の引数も適切に変更すること。
    28. return to_enum :infinite_product_process, *args unless block_given?
    29. # ここを適切に実装してテストが通るようにしてください。
    30. # ただし、以下の条件を満たすこと:
    31. # ・yield 式を必ず利用すること。
    32. # 桜先生からのワンポイントアドバイス:
    33. # ・この infinite_product_process メソッドの使い方がポイント。
    34. #  何を受け取って、何を返すか(何を yield の引数に引き渡すのか)。
    35. #  あと、何回呼び出すのか、どこから呼び出すのか、とかもね。
    36. # ・あとは、えーと…ぐ、Good Luck!
    37. end
    38.  
    39. # ※これ以降は変更しないこと。
    40. if $0 == __FILE__
    41. require 'test/unit'
    42. require 'prime'
    43.  
    44. # 素数を列挙する Enumerator を返すメソッド
    45. def primes
    46. Prime.to_enum
    47. end
    48.  
    49. # 整数(>0)を列挙する Enumerable(≠Enumerator) を返すメソッド
    50. def nats
    51. (1..1.0/0)
    52. end
    53.  
    54. # フィボナッチ数列を列挙するメソッド
    55. def fib
    56. return to_enum :fib unless block_given?
    57. a, b = 0, 1
    58. loop do
    59. yield b
    60. a, b = b, a + b
    61. end
    62. end
    63.  
    64. # infinite_product メソッドのテストクラス
    65. class AnswerQ3Test < Test::Unit::TestCase
    66. # fib のみのテスト
    67. def test_fib_only
    68. expected = [[1], [1], [2], [3], [5], [8], [13], [21], [34], [55]]
    69. result = infinite_product(fib).take(10)
    70. assert_equal(expected, result)
    71. end
    72.  
    73. # nats と fib の infinite_product のテスト
    74. def test_product_nats_fib
    75. expected = [
    76. [1, 1],
    77. [1, 1], [2, 1],
    78. [1, 2], [2, 1], [3, 1],
    79. [1, 3], [2, 2], [3, 1], [4, 1],
    80. [1, 5], [2, 3], [3, 2], [4, 1], [5, 1],
    81. [1, 8], [2, 5], [3, 3], [4, 2], [5, 1], [6, 1]
    82. ]
    83. result = infinite_product(nats, fib).take(21)
    84. assert_equal(expected, result)
    85. end
    86.  
    87. # primes と nats と fib の infinite_product のテスト
    88. def test_product_primes_nats_fib
    89. expected = [
    90. [2, 1, 1],
    91. [2, 1, 1], [2, 2, 1],
    92. [3, 1, 1],
    93. [2, 1, 2], [2, 2, 1], [2, 3, 1],
    94. [3, 1, 1], [3, 2, 1],
    95. [5, 1, 1],
    96. [2, 1, 3], [2, 2, 2], [2, 3, 1], [2, 4, 1],
    97. [3, 1, 2], [3, 2, 1], [3, 3, 1],
    98. [5, 1, 1], [5, 2, 1],
    99. [7, 1, 1],
    100. [2, 1, 5], [2, 2, 3], [2, 3, 2], [2, 4, 1], [2, 5, 1],
    101. [3, 1, 3], [3, 2, 2], [3, 3, 1], [3, 4, 1],
    102. [5, 1, 2], [5, 2, 1], [5, 3, 1],
    103. [7, 1, 1], [7, 2, 1],
    104. [11, 1, 1]
    105. ]
    106. result = infinite_product(primes, nats, fib).take(35)
    107. assert_equal(expected, result)
    108. end
    109.  
    110. # nats と [1, 2, 3] の infinite_product のテスト
    111. def test_product_nats_1_3
    112. expected = [
    113. [1, 1],
    114. [1, 2], [2, 1],
    115. [1, 3], [2, 2], [3, 1],
    116. [2, 3], [3, 2], [4, 1],
    117. [3, 3], [4, 2], [5, 1],
    118. [4, 3], [5, 2], [6, 1]
    119. ]
    120. result = infinite_product(nats, 1..3).take(15)
    121. assert_equal(expected, result)
    122. end
    123.  
    124. # [1, 2, 3] と nats の infinite_product のテスト
    125. def test_product_1_3_nats
    126. expected = [
    127. [1, 1],
    128. [1, 2], [2, 1],
    129. [1, 3], [2, 2], [3, 1],
    130. [1, 4], [2, 3], [3, 2],
    131. [1, 5], [2, 4], [3, 3],
    132. [1, 6], [2, 5], [3, 4]
    133. ]
    134. result = infinite_product(1..3, nats).take(15)
    135. assert_equal(expected, result)
    136. end
    137. end
    138. end
    139.