• Source
    1. # -*- coding: utf-8 -*-
    2.  
    3. # 使用した Python のバージョン:
    4. # ・Python(Python 2.7.x)/Python3(Python 3.x) ←どちらか選んでください。どちらでも動作する場合は両方書いてください。
    5. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    6. # ・
    7. # ・
    8.  
    9. # 必要に応じてここに import 文を挿入してもOKです(標準添付ライブラリに限る)。
    10. # 例:import itertools
    11.  
    12. # 無限リスト(ストリーム)に対応した直積(Cartesian product)を生成して列挙する関数(generator 関数)
    13. def infinite_product(*iters):
    14. """Cartesian product generator function of (infinite) iterables."""
    15. # ここを適切に実装しなおしてテストが通るようにしてください。
    16. # ただし、以下の条件を満たすこと:
    17. # ・後述の別関数 infinite_product_process を利用すること。
    18. # ・yield 式を必ず利用すること。
    19. for e in iters[0]:
    20. yield (e,)
    21. # 桜先生からのワンポイントアドバイス:
    22. # ・今まで学んだことを最大限に活かしてね♪
    23. # ・Good Luck!
    24.  
    25.  
    26. def infinite_product_process(*args):
    27. """Sub-generator function for infinite_product()."""
    28. # この関数の引数は変更しても可↑↑。
    29. # ここを適切に実装してテストが通るようにしてください。
    30. # ただし、以下の条件を満たすこと:
    31. # ・yield 式を必ず利用すること。
    32. # 桜先生からのワンポイントアドバイス:
    33. # ・この infinite_product_process 関数の使い方がポイント。
    34. #  何を受け取って、何を返すか(何を yield 式に引き渡すのか)。
    35. #  あと、何回呼び出すのか、どこから呼び出すのか、とかもね。
    36. # ・あとは、えーと…ぐ、Good Luck!
    37.  
    38.  
    39. # ここに Lv.2 問題で作成した IteratorCloner クラスを転記してください。
    40. # ※利用せずに解けた場合は、ここには何も記述しないでください。
    41. # ※Lv.2 問題に挑戦していない方は、ここには何も記述せず上記2関数内で完結するようがんばって実装してください。
    42. # v--ココカラ
    43.  
    44.  
    45. # ^--ココマデ
    46.  
    47. # ※これ以降は変更しないこと。
    48. if __name__ == '__main__':
    49. import unittest
    50. from itertools import count, islice
    51. try:
    52. # for Python2
    53. from itertools import ifilter
    54. except ImportError:
    55. # for Python3
    56. ifilter = filter
    57.  
    58.  
    59. def primes():
    60. """Generator function of Prime numbers."""
    61. g = count(2)
    62. while True:
    63. prime = next(g)
    64. yield prime
    65. g = ifilter(lambda x, prime=prime: x%prime, g)
    66.  
    67.  
    68. def nats():
    69. """Generator function of Integers(>0)."""
    70. return count(1)
    71.  
    72.  
    73. def fib():
    74. """Generator function of Fibonacci numbers."""
    75. a, b = 0, 1
    76. while True:
    77. yield b
    78. a, b = b, a + b
    79.  
    80.  
    81. class Q99Test(unittest.TestCase):
    82. """Test class for infinite_product()."""
    83.  
    84. def test_fib_only(self):
    85. """Test for Fibonacci numbers."""
    86. expected = [(1,), (1,), (2,), (3,), (5,), (8,), (13,), (21,), (34,), (55,)]
    87. result = list(islice(infinite_product(fib()), 10))
    88. self.assertEqual(result, expected)
    89.  
    90.  
    91. def test_product_nats_fib(self):
    92. """Test for product of Integers(>0) and Fibonacci numbers."""
    93. expected = [
    94. (1, 1),
    95. (1, 1), (2, 1),
    96. (1, 2), (2, 1), (3, 1),
    97. (1, 3), (2, 2), (3, 1), (4, 1),
    98. (1, 5), (2, 3), (3, 2), (4, 1), (5, 1),
    99. (1, 8), (2, 5), (3, 3), (4, 2), (5, 1), (6, 1)
    100. ]
    101. result = list(islice(infinite_product(nats(), fib()), 21))
    102. self.assertEqual(result, expected)
    103.  
    104.  
    105. def test_product_primes_nats_fib(self):
    106. """Test for product of Primes and Integers(>0) and Fibonacci numbers."""
    107. expected = [
    108. (2, 1, 1),
    109. (2, 1, 1), (2, 2, 1),
    110. (3, 1, 1),
    111. (2, 1, 2), (2, 2, 1), (2, 3, 1),
    112. (3, 1, 1), (3, 2, 1),
    113. (5, 1, 1),
    114. (2, 1, 3), (2, 2, 2), (2, 3, 1), (2, 4, 1),
    115. (3, 1, 2), (3, 2, 1), (3, 3, 1),
    116. (5, 1, 1), (5, 2, 1),
    117. (7, 1, 1),
    118. (2, 1, 5), (2, 2, 3), (2, 3, 2), (2, 4, 1), (2, 5, 1),
    119. (3, 1, 3), (3, 2, 2), (3, 3, 1), (3, 4, 1),
    120. (5, 1, 2), (5, 2, 1), (5, 3, 1),
    121. (7, 1, 1), (7, 2, 1),
    122. (11, 1, 1)
    123. ]
    124. result = list(islice(infinite_product(primes(), nats(), fib()), 35))
    125. self.assertEqual(result, expected)
    126.  
    127.  
    128. def test_product_nats_1_3(self):
    129. """Test for product of Integers(>0) and [1, 2, 3]."""
    130. expected = [
    131. (1, 1),
    132. (1, 2), (2, 1),
    133. (1, 3), (2, 2), (3, 1),
    134. (2, 3), (3, 2), (4, 1),
    135. (3, 3), (4, 2), (5, 1),
    136. (4, 3), (5, 2), (6, 1)
    137. ]
    138. result = list(islice(infinite_product(nats(), range(1, 4)), 15))
    139. self.assertEqual(result, expected)
    140.  
    141.  
    142. def test_product_1_3_nats(self):
    143. """Test for product of [1, 2, 3] and Integers(>0)."""
    144. expected = [
    145. (1, 1),
    146. (1, 2), (2, 1),
    147. (1, 3), (2, 2), (3, 1),
    148. (1, 4), (2, 3), (3, 2),
    149. (1, 5), (2, 4), (3, 3),
    150. (1, 6), (2, 5), (3, 4)
    151. ]
    152. result = list(islice(infinite_product(range(1, 4), nats()), 15))
    153. self.assertEqual(result, expected)
    154.  
    155.  
    156. # run tests
    157. unittest.main()
    158.