combination_generator 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,17 @@
1
+ = CombinationGenerator
2
+
3
+ == Install
4
+ $ sudo gem install combination_generator
5
+
6
+ == Usage
7
+ require 'rubygems'
8
+ require 'combination_generator'
9
+ CombinationGenerator.new(2, ["r", "b", "g"]).each do |element|
10
+ p element
11
+ end
12
+
13
+ output -- ["r", "b"] ["r", "g"] ["b", "g"]
14
+ Copyright (c) 2010 MIT-LICENSE
15
+ Author : Wayne Deng
16
+ Web : http://blog.waynedeng.com
17
+ Email : wayne.deng.cn(AT).com
@@ -0,0 +1,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{combination_generator}
3
+ s.version = "0.1.1"
4
+
5
+ s.authors = ["Wayne Deng"]
6
+ s.date = %q{2010-09-20}
7
+ s.platform = Gem::Platform::RUBY
8
+ s.summary = "generate combination list in Ruby"
9
+ s.description = "Combination Generator - generate combination list in Ruby"
10
+ s.email = %q{wayne.deng.cn@gmail.com}
11
+ s.homepage = %q{http://blog.waynedeng.com}
12
+ s.files = ["test/test_combination_generator.rb", "README", "lib/combination_generator.rb", "combination_generator.gemspec"]
13
+ s.require_paths = ["lib"]
14
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Combination Generator", "--main", "README"]
15
+ end
@@ -0,0 +1,104 @@
1
+ #= CombinationGenerator
2
+ #
3
+ #== Install
4
+ # $ sudo gem install combination_generator
5
+ #
6
+ #== Usage
7
+ # require 'rubygems'
8
+ # require 'combination_generator'
9
+ # CombinationGenerator.new(2, ["r", "b", "g"]).each do |element|
10
+ # p element
11
+ # end
12
+ #
13
+ # # output -- ["r", "b"] ["r", "g"] ["b", "g"]
14
+ #Copyright (c) 2010 MIT-LICENSE
15
+ #Author : Wayne Deng
16
+ #Web : http://blog.waynedeng.com
17
+ #Email : wayne.deng.cn(AT).com
18
+
19
+ class CombinationGenerator
20
+ attr_accessor :size, :elements, :comb_index
21
+
22
+ class CombinationIndex
23
+ attr_accessor :size, :element_size, :index_ary
24
+
25
+ def initialize(picking_size, element_size)
26
+ self.element_size = element_size
27
+ self.size = picking_size
28
+ self.index_ary = [1] * self.size + [0] * (element_size - self.size)
29
+ end
30
+
31
+ def each (&block)
32
+ yield self.index_ary
33
+ while self.move_next
34
+ yield self.index_ary
35
+ end
36
+ end
37
+
38
+ def each_with_index (&block)
39
+ i = 0
40
+ yield self.index_ary, i
41
+ while self.move_next
42
+ i = i + 1
43
+ yield self.index_ary, i
44
+ end
45
+ end
46
+
47
+ def move_next
48
+ (1..self.size).each do |i|
49
+ return true if self.move_i_next(i)
50
+ end
51
+ return false
52
+ end
53
+
54
+ #the index of last ith 1
55
+ def last_1_index(num = 1)
56
+ count = 0
57
+ self.index_ary.reverse.each_with_index do |e, i|
58
+ count = count + 1 if e==1
59
+ return (self.index_ary.size - i - 1) if count>=num
60
+ end
61
+ return -1
62
+ end
63
+
64
+ def move_i_next(num = 1)
65
+ index = self.last_1_index(num)
66
+ #if already move to the last position
67
+ return nil if index == -1 or index >= self.index_ary.size - 1
68
+ #if the element in next position is 1
69
+ return nil if self.index_ary[index + 1]==1
70
+
71
+ self.index_ary[index] = 0
72
+ self.index_ary[index + 1] = 1
73
+ return true
74
+ end
75
+ end
76
+
77
+ def initialize(picking_size, elements)
78
+ self.elements = elements
79
+ self.size = picking_size
80
+ self.comb_index = CombinationIndex.new(self.size, elements.size)
81
+ end
82
+
83
+ def each (&block)
84
+ self.comb_index.each do |ary|
85
+ yield self.selected_elements(ary)
86
+ end
87
+ end
88
+
89
+ def each_with_index (&block)
90
+ self.comb_index.each_with_index do |ary, i|
91
+ yield self.selected_elements(ary), i
92
+ end
93
+ end
94
+
95
+ protected
96
+ def selected_elements(ary)
97
+ _elements = []
98
+ ary.each_with_index do |e, i|
99
+ _elements << self.elements[i] if e==1
100
+ end
101
+ _elements
102
+ end
103
+
104
+ end
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.join(File.dirname(__FILE__),"..","lib","combination_generator.rb")
3
+ require 'test/unit'
4
+
5
+ class TestCombinationGenerator < Test::Unit::TestCase
6
+ def test_each
7
+ ary = []
8
+ CombinationGenerator.new(2, [1,2,3]).each{|ai| ary << ai}
9
+ assert_equal ary, [[1,2],[1,3],[2,3]]
10
+
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: combination_generator
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
+ platform: ruby
11
+ authors:
12
+ - Wayne Deng
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-09-20 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Combination Generator - generate combination list in Ruby
22
+ email: wayne.deng.cn@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - test/test_combination_generator.rb
31
+ - README
32
+ - lib/combination_generator.rb
33
+ - combination_generator.gemspec
34
+ has_rdoc: true
35
+ homepage: http://blog.waynedeng.com
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options:
40
+ - --line-numbers
41
+ - --inline-source
42
+ - --title
43
+ - Combination Generator
44
+ - --main
45
+ - README
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ segments:
53
+ - 0
54
+ version: "0"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ requirements: []
63
+
64
+ rubyforge_project:
65
+ rubygems_version: 1.3.6
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: generate combination list in Ruby
69
+ test_files: []
70
+