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 +1 -0
- data/LICENSE +0 -0
- data/README +0 -0
- data/Rakefile +60 -0
- data/lib/24point/base.rb +102 -0
- data/lib/24point/calculate.rb +33 -0
- data/lib/24point/exception.rb +6 -0
- data/lib/24point/string.rb +12 -0
- data/lib/24point.rb +11 -0
- data/resources/defaults.yaml +2 -0
- data/spec/24point/calculate_spec.rb +3 -0
- data/spec/24point/string_spec.rb +0 -0
- data/spec/24point_spec.rb +38 -0
- data/spec/spec_helper.rb +2 -0
- metadata +59 -0
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
|
+
|
data/lib/24point/base.rb
ADDED
|
@@ -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,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
|
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
|
+
|
data/spec/spec_helper.rb
ADDED
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: []
|