24point 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/COPYING ADDED
@@ -0,0 +1 @@
1
+ No copying restrictions/license given.
data/LICENSE ADDED
File without changes
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,60 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ require 'rdoc/task'
6
+ require 'fileutils'
7
+ include FileUtils
8
+
9
+ version="0.1"
10
+ name="24point"
11
+
12
+ spec = Gem::Specification.new do |s|
13
+ s.name = name
14
+ s.version = version
15
+ s.description = s.summary = "The 24point GemPlugin"
16
+ s.author = "Joy Hu"
17
+
18
+ s.platform = Gem::Platform::RUBY
19
+ s.has_rdoc = true
20
+ s.extra_rdoc_files = ["README"]
21
+
22
+ s.files = %w(COPYING LICENSE README Rakefile) +
23
+ Dir.glob("{bin,doc/rdoc,test,lib}/**/*") +
24
+ Dir.glob("ext/**/*.{h,c,rb}") +
25
+ Dir.glob("examples/**/*.rb") +
26
+ Dir.glob("tools/*.rb") +
27
+ Dir.glob("resources/**/*")
28
+
29
+ s.require_path = "lib"
30
+ s.bindir = "bin"
31
+ end
32
+
33
+ Rake::GemPackageTask.new(spec) do |p|
34
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
35
+ end
36
+
37
+ task :install => [:test, :package] do
38
+ sh %{sudo gem install pkg/#{name}-#{version}.gem}
39
+ end
40
+
41
+ task :uninstall => [:clean] do
42
+ sh %{sudo gem uninstall #{name}}
43
+ end
44
+
45
+ Rake::TestTask.new do |t|
46
+ t.libs << "test"
47
+ t.test_files = FileList['test/test*.rb']
48
+ t.verbose = true
49
+ end
50
+
51
+ Rake::RDocTask.new do |rdoc|
52
+ rdoc.rdoc_dir = 'doc/rdoc'
53
+ rdoc.options << '--line-numbers'
54
+ rdoc.rdoc_files.add ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
55
+ end
56
+
57
+ task :default => [:test, :package]
58
+
59
+ CLEAN.include ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log', 'pkg', 'lib/*.bundle', '*.gem', '.config']
60
+
@@ -0,0 +1,102 @@
1
+ require "24point/calculate"
2
+ require "24point/string"
3
+ require "24point/exception"
4
+ class TfPointClass
5
+ include TfPoint::Calculate
6
+ attr_accessor :given_numbers, :number, :expression, :count_of_number, :all_expression
7
+
8
+ NUMBER_TO_CAL = 24
9
+
10
+
11
+ def initialize(*args)
12
+ args.flatten!
13
+ raise TfPoint::Exception.new("Sorry, Given arguments should be numbers.") if args.any?{|arg| !arg.is_a? Fixnum }
14
+ @count_of_number = args.length
15
+ @given_numbers = args
16
+ @all_expression = []
17
+ end
18
+
19
+ def result
20
+ given_numbers.permutation.to_a.uniq.each do |given_number|
21
+ @number = given_number
22
+ @expression = given_number.collect{|number| number.to_s}
23
+ calculate(count_of_number)
24
+ end
25
+ all_expression.uniq!
26
+ return all_expression
27
+ end
28
+
29
+
30
+
31
+ private
32
+
33
+ # deprecated
34
+ def optimize_expression(exp)
35
+ return exp unless exp.expression?
36
+ # step 1: remove ()
37
+ exp = remove_bracket(exp[1..-2])
38
+ exp
39
+ end
40
+
41
+ def calculate(n)
42
+ # return number[0] == NUMBER_TO_CAL if n == 1
43
+ all_expression << expression[0] if n == 1 && number[0] == NUMBER_TO_CAL
44
+
45
+ (0...n).each do|i|
46
+ ((i+1)...n).each do |j|
47
+ a, b = number[i], number[j]
48
+ number[j] = number[n - 1]
49
+ expa, expb = expression[i], expression[j]
50
+ expression[j] = expression[n - 1]
51
+ #+
52
+ expression[i], number[i] = plus_operation(expa, expb, n, a, b)
53
+ calculate(n - 1)
54
+ #-
55
+ expression[i], number[i] = sub_operation(expa, expb, n, a, b)
56
+ calculate(n - 1)
57
+
58
+ #*
59
+ expression[i], number[i] = multi_operation(expa, expb, a, b)
60
+ calculate(n - 1)
61
+
62
+ #/
63
+ if b != 0 && a % b == 0
64
+ expression[i], number[i] = devision_operation(expa, expb, a, b)
65
+ calculate(n - 1)
66
+ end
67
+
68
+ if a != 0 && b % a == 0
69
+ expression[i], number[i] = devision_operation(expb, expa, b, a)
70
+ calculate(n - 1)
71
+ end
72
+
73
+ number[i], number[j] = a, b
74
+ expression[i], expression[j] = expa.to_s, expb.to_s
75
+ end
76
+ end
77
+
78
+ return false
79
+
80
+ end
81
+
82
+
83
+
84
+ #TODO 乘法和除法可以在计算时就不加(),但加减仍需要优化,例如:(1+(3+2))
85
+ def remove_bracket(exp)
86
+ reg = '((?<expression>\(?(\d*)[\+\-\*\/](\d*|\g<expression>)\)?)|\d*)'
87
+ # 乘法,统一排序,前大后小 ex: (3*3)+(3*5)=> 3*3+5*3
88
+ if /(?<all_exp>\((?<left_number>((?<expression_left>\(?(\d*)[\+\-\*\/](\d*|\g<expression_left>)\)?)|\d*))\*(?<right_number>((?<expression_right>\(?(\d*)[\+\-\*\/](\d*|\g<expression_right>)\)?)|\d*))\))/ =~ exp
89
+ 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
90
+ s_exp = "#{left_number}*#{right_number}"
91
+ remove_bracket(exp.gsub!(all_exp, s_exp))
92
+ #除法: 去除括号
93
+ elsif /(?<all_exp>\((?<s_exp>((?<expression_left>\(?(\d*)[\+\-\*\/](\d*|\g<expression_left>)\)?)|\d*)\/((?<expression_right>\(?(\d*)[\+\-\*\/](\d*|\g<expression_right>)\)?)|\d*))\))/ =~ exp
94
+ remove_bracket(exp.gsub(all_exp, s_exp))
95
+ else
96
+ return exp
97
+ end
98
+ end
99
+
100
+
101
+
102
+ end
@@ -0,0 +1,33 @@
1
+ module TfPoint
2
+ module Calculate
3
+ ##+ 排序,大的在前,小的在后,如果是最后一次(n=2),不加括号
4
+ def plus_operation(expa, expb, n, numa, numb)
5
+ return "", 0 if !numa.is_a?(Fixnum) || !numb.is_a?(Fixnum)
6
+ expa, expb = expb, expa if expa.is_num? && expb.is_num? && expa < expb
7
+ exp = (n == 2) ? expa + '+' + expb : '(' + expa + '+' + expb + ')'
8
+ return exp, (numa + numb)
9
+ end
10
+
11
+ ##-
12
+ def sub_operation(expa, expb, n, numa, numb)
13
+ return "", 0 if !numa.is_a?(Fixnum) || !numb.is_a?(Fixnum)
14
+ exp = (n == 2) ? expa + '-' + expb : '(' + expa + '-' + expb + ')'
15
+ return exp, (numa - numb)
16
+ end
17
+
18
+ ##*
19
+ def multi_operation(expa, expb, numa, numb)
20
+ return "", 0 if !numa.is_a?(Fixnum) || !numb.is_a?(Fixnum)
21
+ exp = (expa > expb) ? expa + '*' + expb : expb + '*' + expa
22
+ return exp, (numa * numb)
23
+ end
24
+
25
+ #/
26
+ def devision_operation(expa, expb, numa, numb)
27
+ return "", 0 if !numa.is_a?(Fixnum) || !numb.is_a?(Fixnum)
28
+ exp = expa + '/' + expb
29
+ return exp, (numa / numb)
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ require "24point/base"
2
+ module TfPoint
3
+ class Exception < Exception
4
+
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ class String
2
+
3
+ # match as ((3+5)*6)/2) (3*8)+(1-1) => true
4
+ def expression?
5
+ !(self =~ /(?<expression>\((?<left>(\g<expression>|\d*))(?<operate>[\+\-\*\/])(?<right>(\g<expression>|\d*))\))/).nil?
6
+ end
7
+
8
+ def is_num?
9
+ !(self =~ /^\d*$/).nil?
10
+ end
11
+
12
+ end
data/lib/24point.rb ADDED
@@ -0,0 +1,11 @@
1
+ # coding: utf-8
2
+ require File.dirname(__FILE__) +'/24point/base'
3
+ require File.dirname(__FILE__) +'/24point/calculate'
4
+ require File.dirname(__FILE__) +'/24point/string'
5
+ require File.dirname(__FILE__) +'/24point/exception'
6
+
7
+
8
+
9
+
10
+
11
+
@@ -0,0 +1,2 @@
1
+ ---
2
+ :debug: false
@@ -0,0 +1,3 @@
1
+ require 'spec_helper'
2
+
3
+
File without changes
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe TfPointClass do
4
+ it 'initialize should success' do
5
+ tf = TfPointClass.new(4, 3, 2, 1)
6
+ tf.given_numbers.should eq([4, 3, 2, 1])
7
+ end
8
+
9
+ it 'string initialize should raise exception' do
10
+ expect{TfPointClass.new("a", 1, 2, 3)}.to raise_error
11
+ end
12
+
13
+
14
+ it "four numbers should calculate success" do
15
+ tf = TfPointClass.new(6, 6, 6, 6)
16
+ result = tf.result
17
+ result.should_not be_nil
18
+ end
19
+
20
+ it "little numbers should have no result" do
21
+ tf = TfPointClass.new(2, 2, 2, 2)
22
+ result = tf.result
23
+ result.should eq([])
24
+ end
25
+
26
+ it "random numbers calculate" do
27
+ numbers = (1..13).to_a.sample(4)
28
+ puts numbers
29
+ tf = TfPointClass.new(numbers)
30
+ result = tf.result
31
+ puts result
32
+ end
33
+
34
+
35
+
36
+
37
+ end
38
+
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require '24point'
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: 24point
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joy Hu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-11 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A gem for 24-point calculate game
15
+ email: joyhu8023danny@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files:
19
+ - README
20
+ files:
21
+ - COPYING
22
+ - LICENSE
23
+ - README
24
+ - Rakefile
25
+ - spec/24point/calculate_spec.rb
26
+ - spec/24point/string_spec.rb
27
+ - spec/24point_spec.rb
28
+ - spec/spec_helper.rb
29
+ - lib/24point/base.rb
30
+ - lib/24point/calculate.rb
31
+ - lib/24point/exception.rb
32
+ - lib/24point/string.rb
33
+ - lib/24point.rb
34
+ - resources/defaults.yaml
35
+ homepage: https://github.com/huyong36/24point
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.25
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: 24-point game
59
+ test_files: []