OSDN Git Service

fix generator document
[mint/mint-lib.git] / lib / mint / generator / square_root_arithmetic.rb
1 # -*- coding: nil -*-
2
3 module Mint::Generator
4
5   #
6   # 無理数の四則演算を生成するジェネレータ
7   #
8   # オプション ::
9   #               以下のオプションが使用出来る
10   #               [_term_number_] 生成する項の数 (ex. 2)
11   #               [_operators_] 使用する演算子 (ex. %w[ + - ])
12   #               [_min_] 各項の最小値 (ex. 0)
13   #               [_max_] 各項の最大値 (ex. 30)
14   #               [_single_term_min_] 各項の最小項数 (ex. 1)
15   #               [_single_term_max_] 各項の最大項数 (ex. 1)
16   #               [_use_coefficient_] 真なら係数をつける (ex. true)
17   #               [_use_power_] 真なら2乗した項を作る (ex. false)
18   #
19   class SquareRootArithmetic < Arithmetic
20
21     root_pattern = /[2-9]?sqrt\((?:[2-9]|\d\d)\)/
22     term_pattern = /#{root_pattern} [+\-] #{root_pattern}/
23     validation /\A\(#{root_pattern}\)\^2\z/
24     validation /\A#{term_pattern}\z/
25     validation /\A\(#{term_pattern}\)(?:\^2)? [+\-] \(#{term_pattern}(?:\^2)?\)\z/
26     validation /\A\(#{term_pattern}\) [\*\/] \(#{term_pattern}\)\z/
27
28     private
29
30     def generate_problem
31       defaults = {
32         :min => 0, :max => 30,
33         :operators => %w[ + - ],
34         :use_power => false,
35         :single_term_min => 1,
36         :single_term_max => 2,
37       }
38       do_generate(defaults)
39     end
40
41     def term_number
42       max = options.values_at(:single_term_min, :single_term_max).max
43       amount_seed = (options[:single_term_min]..max).to_a
44       amount = amount_seed.sample
45       amount = 1 if amount <= 0
46       amount
47     end
48
49     def operand
50       results = []
51       term_number.times do
52         results << create_square_root_number
53         results << %w[ + - ].sample
54       end
55       result = results[0..-2].join(' ')
56       result = "(#{result})" if results.size > 2
57       if options[:use_power]
58         power = rand(2)
59         if power == 1
60           result = "#{result}^2"
61         end
62       end
63       result
64     end
65
66     def create_square_root_number
67       number = create_integer(options[:min], options[:max], false)
68       coefficient = ''
69       need_coefficient = options[:use_coefficient] ? rand(2) == 0 : false
70         if need_coefficient || [0, 1].include?(number)
71         min = 2 # MEMO: 2 - 9
72         coefficient = (min + rand(10 - min)).to_s
73       end
74       root = [0, 1].include?(number) ? '' : "sqrt(#{number})"
75       "#{coefficient}#{root}"
76     end
77   end
78 end
79