class TfPointClass
Constants
- NUMBER_TO_CAL
Attributes
all_expression[RW]
count_of_number[RW]
expression[RW]
given_numbers[RW]
number[RW]
Public Class Methods
new(*args)
click to toggle source
# File lib/24point/base.rb, line 11 def initialize(*args) args.flatten! raise TfPoint::Exception.new("Sorry, Given arguments should be numbers.") if args.any?{|arg| !arg.is_a? Fixnum } @count_of_number = args.length @given_numbers = args @all_expression = [] end
Public Instance Methods
result()
click to toggle source
# File lib/24point/base.rb, line 19 def result return all_expression if all_expression != [] given_numbers.permutation.to_a.uniq.each do |given_number| @number = given_number @expression = given_number.collect{|number| number.to_s} calculate(count_of_number) end all_expression.uniq! return all_expression end
Private Instance Methods
calculate(n)
click to toggle source
# File lib/24point/base.rb, line 42 def calculate(n) # return number[0] == NUMBER_TO_CAL if n == 1 all_expression << expression[0] if n == 1 && number[0] == NUMBER_TO_CAL (0...n).each do|i| ((i+1)...n).each do |j| a, b = number[i], number[j] number[j] = number[n - 1] expa, expb = expression[i], expression[j] expression[j] = expression[n - 1] #+ expression[i], number[i] = plus_operation(expa, expb, n, a, b) calculate(n - 1) #- expression[i], number[i] = sub_operation(expa, expb, n, a, b) calculate(n - 1) #* expression[i], number[i] = multi_operation(expa, expb, a, b) calculate(n - 1) #/ if b != 0 && a % b == 0 expression[i], number[i] = devision_operation(expa, expb, a, b) calculate(n - 1) end if a != 0 && b % a == 0 expression[i], number[i] = devision_operation(expb, expa, b, a) calculate(n - 1) end number[i], number[j] = a, b expression[i], expression[j] = expa.to_s, expb.to_s end end return false end
optimize_expression(exp)
click to toggle source
deprecated
# File lib/24point/base.rb, line 35 def optimize_expression(exp) return exp unless exp.expression? # step 1: remove () exp = remove_bracket(exp[1..-2]) exp end
remove_bracket(exp)
click to toggle source
TODO 乘法和除法可以在计算时就不加(),但加减仍需要优化,例如:(1+(3+2))
# File lib/24point/base.rb, line 86 def remove_bracket(exp) reg = '((?<expression>\(?(\d*)[\+\-\*\/](\d*|\g<expression>)\)?)|\d*)' # 乘法,统一排序,前大后小 ex: (3*3)+(3*5)=> 3*3+5*3 if /(?<all_exp>\((?<left_number>((?<expression_left>\(?(\d*)[\+\-\*\/](\d*|\g<expression_left>)\)?)|\d*))\*(?<right_number>((?<expression_right>\(?(\d*)[\+\-\*\/](\d*|\g<expression_right>)\)?)|\d*))\))/ =~ exp left_number, right_number = right_number, left_number if left_number.is_num? && right_number.is_num? && left_number.to_i < right_number.to_i s_exp = "#{left_number}*#{right_number}" remove_bracket(exp.gsub!(all_exp, s_exp)) #除法: 去除括号 elsif /(?<all_exp>\((?<s_exp>((?<expression_left>\(?(\d*)[\+\-\*\/](\d*|\g<expression_left>)\)?)|\d*)\/((?<expression_right>\(?(\d*)[\+\-\*\/](\d*|\g<expression_right>)\)?)|\d*))\))/ =~ exp remove_bracket(exp.gsub(all_exp, s_exp)) else return exp end end