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
[{: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)