OSDN Git Service

refactored square_root_arithmetic generator
authorTomohiro Nishimura <tomohiro68@gmail.com>
Sun, 21 Mar 2010 18:21:22 +0000 (03:21 +0900)
committerTomohiro Nishimura <tomohiro68@gmail.com>
Sun, 21 Mar 2010 18:21:22 +0000 (03:21 +0900)
lib/mint/generator/square_root_arithmetic.rb
spec/generator/square_root_arithmetic_spec.rb

index 3b5d755..1dc0e92 100644 (file)
@@ -45,30 +45,39 @@ module Mint::Generator
     option :single_term_max, 2
 
     def operand
+      results = square_root_expression_parts
+      result = results[0..-2].join(' ')
+      result = "(#{result})" if results.size > 2
+      result = "#{result}^2" if options[:use_power] && rand(2) == 0
+      result
+    end
+
+    def square_root_expression_parts
       results = []
       term_number(:single).times do
         results << create_square_root_number
         results << %w[ + - ].sample
       end
-      result = results[0..-2].join(' ')
-      result = "(#{result})" if results.size > 2
-      if options[:use_power]
-        result = "#{result}^2" if rand(2) == 1
-      end
-      result
+      results
     end
 
     def create_square_root_number
       number = create_integer(options[:min], options[:max], false)
-      coefficient = ''
-      need_coefficient = options[:use_coefficient] ? rand(2) == 0 : false
-      if need_coefficient || [0, 1].include?(number)
-        # MEMO: coefficient in 2 - 9
-        min, max = 2, 10
-        coefficient = (min + rand(max - min)).to_s
+      "#{coefficient(number)}#{root(number)}"
+    end
+
+    def root(number)
+      zero_or_one?(number) ? '' : "sqrt(#{number})"
+    end
+
+    def coefficient(number)
+      if options[:use_coefficient] || zero_or_one?(number)
+        coefficient = create_integer(2, 9, false)
       end
-      root = [0, 1].include?(number) ? '' : "sqrt(#{number})"
-      "#{coefficient}#{root}"
+    end
+
+    def zero_or_one?(number)
+      number == 0 || number == 1
     end
   end
 end
index 22cca48..e490b61 100644 (file)
@@ -63,7 +63,7 @@ module Mint::Generator
           [{:use_power => true}, /\A#{term_pattern}(?:\^2)? [\-+] #{term_pattern}(?:\^2)?\z/],
 
         ].each do |options, pattern|
-          context options do
+          context options.inspect do
             before do
               settings = @common_settings.merge(options)
               @problem = subject.generate(settings)