fork(2) download
  1. # Extended Fizz Buzz program
  2. puts '★1行版'
  3. puts [*1..100].map{|n| n % 15 == 0 ? 'FizzBuzz' : n % 5 ==0 ? 'Buzz' : n % 3 == 0 ? 'Fizz' : n}.join(' ')
  4.  
  5. puts '★複数処理の内部状態を合成した版'
  6. puts [*1..100].map{|n|
  7. ["FizzBuzz", n, n, "Fizz", n, "Buzz", "Fizz", n, n, "Fizz", "Buzz", n, "Fizz", n, n, "FizzBuzz"][n % 15]
  8. }.join(' ')
  9.  
  10. puts '★拡張性考慮版'
  11. puts [*1..100].map{|n| # 数列の初期値と上限値を、両方同時に定義しているので、不十分
  12. to_print = ''
  13. to_print += 'Fizz' if n % 3 == 0 #判別条件の個数は、追加容易になったが
  14. to_print += 'Buzz' if n % 5 == 0 #複雑な判別条件には、拡張性が無い
  15. to_print.empty? ? n : to_print
  16. }.join(' ') # 出力先がstring型を1個に固定化していて、拡張性不十分
  17.  
  18. #https://i...content-available-to-author-only...h.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/
  19.  
  20. puts '★ファイル分離&拡張版'
  21. # # # # Producer1.rb
  22. 生産者 = Enumerator.new {|提出先|
  23. (1..100).each{|生産物| 提出先.yield 生産物}
  24. [1_000, 50_001, 100_000, 1_000_000].each{|先頭|
  25. (1..19).each{|生産物| 提出先.yield (先頭 + 生産物)}
  26. }
  27. 生産物 = 2_000_000
  28. loop do # 上限値を決めないで、無限ループ
  29. 提出先.yield 生産物 += 1
  30. end
  31. }
  32.  
  33. # # # # Consumer1.rb
  34. require 'fiber'
  35. 消費者達 = []
  36. 消費者達 << Fiber.new do |first|
  37. puts '消費者Fizzが御仕事を始めます'
  38. 加工値 = nil
  39. 100.times do # 0から99までは、3の倍数の時Fizz
  40. 入力値 = Fiber.yield(加工値)
  41. 加工値 = (入力値 % 3 == 0) ? 'Fizz' : nil
  42. end
  43. loop do # 100以上で、10進表示に'3'が含まれれば、'Fizz'
  44. 入力値 = Fiber.yield(加工値)
  45. 加工値 = (入力値.to_s.include?('3') ? 'Fizz' : nil)
  46. end
  47. end
  48.  
  49. # # # # Consumer2.rb
  50. 消費者達 << Fiber.new do |first|
  51. puts '消費者Buzzが御仕事を始めます'
  52. 加工値 = nil
  53. 50.times do # 1から53までは、5の倍数の時、Buzz
  54. 入力値 = Fiber.yield(加工値)
  55. 加工値 = (入力値 % 5 == 0) ? 'Buzz' : nil
  56. end
  57. loop do # 50以上の場合、奇数回目と偶数回目が異なる判別条件
  58. 入力値 = Fiber.yield(加工値) # 10進数表示に'5'が1個以上含まれれば、Buzz
  59. 加工値 = (入力値.to_s.count('5') > 0 ? 'Buzz' : nil)
  60. 入力値 = Fiber.yield(加工値) # 10進数表示に'5'が2個以上含まれれば、BuzzBuzz
  61. 加工値 = (入力値.to_s.count('5') > 1 ? 'BuzzBuzz' : nil)
  62. end
  63. end
  64.  
  65. # # # # Consumer3.rb
  66. require 'prime'
  67. 消費者達 << Fiber.new do |first|
  68. puts '消費者Quxが御仕事を始めます'
  69. 入力値 = first
  70. 加工値 = nil
  71. 5.times do
  72. Fiber.yield(加工値)
  73. end
  74. loop do # 7以上の素数について
  75. 入力値 = Fiber.yield(加工値)
  76. 加工値 = (Prime.prime?(入力値) ? 'Qux' : nil)
  77. end
  78. end
  79.  
  80. # # # # integrate1.rb
  81. 統合消費者 = Enumerator.new do |統合先|
  82. 生産者.each do |生産物| # 消費者達の数にも判別条件にも独立
  83. 中間生産物 = 消費者達.map {|消費者| 消費者.resume(生産物)}
  84. # 出力先の仕様変更の影響範囲を局所化
  85. 統合先 << (中間生産物.any? ? 中間生産物.compact.join(' ') : 生産物)
  86. end
  87. end
  88. # 終了条件を”生産者”から分離している
  89. 統合消費者.take(161).each {|総合値| print 総合値; print ' '}
  90.  
Success #stdin #stdout 0s 33488KB
stdin
Standard input is empty
stdout
★1行版
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
★複数処理の内部状態を合成した版
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
★拡張性考慮版
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
★ファイル分離&拡張版
消費者Fizzが御仕事を始めます
消費者Buzzが御仕事を始めます
消費者Quxが御仕事を始めます
1 2 Fizz 4 Buzz Fizz Qux 8 Fizz Buzz Qux Fizz Qux 14 Fizz Buzz 16 Qux Fizz Qux Buzz Fizz 22 Qux Fizz Buzz 26 Fizz 28 Qux Fizz Buzz Qux 32 Fizz 34 Buzz Fizz Qux 38 Fizz Buzz Qux Fizz Qux 44 Fizz Buzz 46 Qux Fizz 49 Buzz Fizz Buzz Qux Fizz Buzz BuzzBuzz Buzz Fizz Buzz Qux Fizz Qux 62 Fizz 64 65 Fizz Qux 68 Fizz 70 Qux Fizz Qux 74 Fizz 76 77 Fizz Qux 80 Fizz 82 Qux Fizz 85 86 Fizz 88 Qux Fizz 91 92 Fizz 94 95 Fizz Qux 98 Fizz 100 1001 1002 Fizz 1004 1005 1006 1007 1008 Qux 1010 1011 1012 Fizz Qux 1014 1015 1016 1017 1018 Qux Buzz Fizz Buzz BuzzBuzz Buzz 50007 Buzz 50009 Buzz 50011 Buzz Fizz Buzz BuzzBuzz Buzz 50017 Buzz 50019 Buzz 100001 100002 Fizz Qux 100004 100005 100006 100007 100008 100009 100010 100011 100012 Fizz 100014 100015 100016 100017 100018 Qux 1000001 1000002 Fizz Qux 1000004