• Source
    1. # -*- coding: utf-8 -*-
    2.  
    3. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    4. # ・
    5. # ・
    6.  
    7. # iter_a に存在し、iter_b に出てこない要素(整数)を列挙するメソッド
    8. def enum_diff iter_a, iter_b
    9. return to_enum :enum_diff, iter_a, iter_b unless block_given?
    10. # ここを適切に実装しなおしてテストが通るようにしてください。
    11. # ただし、以下の条件を満たすこと:
    12. # ・Enumerator#next(および必要に応じて Enumerator#peek)を利用すること。
    13. # ・yield 式を必ず利用すること。
    14. iter_a.each do |el|
    15. yield el
    16. end
    17. # 桜先生からのワンポイントアドバイス:
    18. # ・iter_a も iter_b も、『要素は全て整数値で、値が増加することはあっても
    19. #  減少することはない』と仮定してもらって構わないわ♪
    20. # ・StopIteration の扱いに注意!
    21. # ・解き方は大きく分けて2種類。よりシンプルな方に気づけるかしら?
    22. end
    23.  
    24. # ※これ以降は変更しないこと。
    25. if $0 == __FILE__
    26. require 'test/unit'
    27. require 'prime'
    28.  
    29. def primes
    30. Prime.to_enum
    31. end
    32.  
    33. def nats
    34. (1...Float::INFINITY)
    35. end
    36.  
    37. def fib
    38. return to_enum :fib unless block_given?
    39. a, b = 0, 1
    40. loop do
    41. yield b
    42. a, b = b, a + b
    43. end
    44. end
    45.  
    46. class AnswerQ2Test < Test::Unit::TestCase
    47. def test_fib
    48. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    49. result = enum_diff(fib, []).take(10)
    50. assert_equal(expected, result)
    51. end
    52.  
    53. def test_nats_without_fib
    54. expected = [4, 6, 7, 9, 10, 11, 12, 14, 15, 16]
    55. result = enum_diff(nats, fib).take(10)
    56. assert_equal(expected, result)
    57. end
    58.  
    59. def test_fib_without_primes
    60. expected = [1, 1, 8, 21, 34, 55, 144, 377, 610, 987, 2584, 4181, 6765, 10946, 17711, 46368]
    61. result = enum_diff(fib, primes).take_while{|n| n < 50000}
    62. assert_equal(expected, result)
    63. end
    64.  
    65. def test_fib_reflect
    66. # 3以上20以下の整数を乱択
    67. k = rand(18) + 3
    68. expected = fib.take(k)
    69. result = enum_diff(fib, enum_diff(nats, fib)).take(k)
    70. assert_equal(expected, result)
    71. end
    72. end
    73. end