set_theory 0.0.4 → 0.0.5
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/README.md +47 -5
- data/benchmark/power_set.rb +41 -0
- data/lib/set_theory/power_set.rb +8 -0
- data/lib/set_theory/version.rb +1 -1
- data/lib/set_theory.rb +1 -0
- data/set_theory.gemspec +3 -2
- data/spec/set_theory/power_set_spec.rb +14 -0
- metadata +29 -14
data/README.md
CHANGED
@@ -17,14 +17,52 @@ _For the whole library_
|
|
17
17
|
_Or choose the parts you want_
|
18
18
|
|
19
19
|
require 'set_theory/member_of'
|
20
|
-
require 'set_theory/union'
|
21
|
-
require 'set_theory/intersection'
|
22
20
|
require 'set_theory/difference'
|
21
|
+
require 'set_theory/intersection'
|
22
|
+
require 'set_theory/power_set'
|
23
23
|
require 'set_theory/symmetric_difference'
|
24
|
+
require 'set_theory/union'
|
24
25
|
|
25
26
|
Usage
|
26
27
|
-----
|
27
28
|
|
29
|
+
#### Membership (Object#member_of?)
|
30
|
+
|
31
|
+
Returns true if the receiving object is found within an array.
|
32
|
+
|
33
|
+
1.member_of? [1, 2, 3] #=> true
|
34
|
+
|
35
|
+
#### Difference (Array#difference)
|
36
|
+
|
37
|
+
Returns an array with the objects of the receiving array that are not in the passed array.
|
38
|
+
|
39
|
+
[1, 2, 3].difference [2, 3, 4] #=> [1]
|
40
|
+
[2, 3, 4].difference [1, 2, 3] #=> [4]
|
41
|
+
|
42
|
+
#### Intersection (Array#intersection)
|
43
|
+
|
44
|
+
Returns an array containing only the objects that are members of both the receiving and passed array.
|
45
|
+
|
46
|
+
[1, 2, 3].intersection [2, 3, 4] #=> [2, 3]
|
47
|
+
|
48
|
+
#### Power set (Array#power_set)
|
49
|
+
|
50
|
+
Returns an array with all possible subsets of the receiving array.
|
51
|
+
|
52
|
+
[1, 2, 3].power_set #=> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
|
53
|
+
|
54
|
+
#### Symmetric difference (Array#symmetric_difference)
|
55
|
+
|
56
|
+
Returns an array containing only the objects that are in one of the receiving or passed arrays, but not both.
|
57
|
+
|
58
|
+
[1, 2, 3].symmetric_difference [2, 3, 4] #=> [1, 4]
|
59
|
+
|
60
|
+
#### Union (Array#union)
|
61
|
+
|
62
|
+
Returns an array containing all members the receiving and passed arrays.
|
63
|
+
|
64
|
+
[1, 2, 3].union [2, 3, 4] #=> [1, 2, 3, 4]
|
65
|
+
|
28
66
|
Development and Testing
|
29
67
|
-----------------------
|
30
68
|
|
@@ -41,19 +79,23 @@ _Install dependencies_
|
|
41
79
|
|
42
80
|
_Then run the specs_
|
43
81
|
|
44
|
-
rake
|
82
|
+
bundle exec rake
|
45
83
|
|
46
84
|
TODO
|
47
85
|
----
|
48
86
|
|
49
87
|
* Possibly deal with type errors on parameter to member_of?
|
50
|
-
* Add aliases for other set operations.
|
51
|
-
* Add methods for missing set operations.
|
52
88
|
|
53
89
|
Rationale
|
54
90
|
---------
|
55
91
|
Yes, I know about [this patch](https://github.com/rails/rails/pull/265), but I prefer `Object#member_of?` and `!Object#member_of?`.
|
56
92
|
|
93
|
+
References
|
94
|
+
----------
|
95
|
+
[http://en.wikipedia.org/wiki/Set_theory](http://en.wikipedia.org/wiki/Set_theory)
|
96
|
+
|
97
|
+
[http://rosettacode.org/wiki/Power_Set#Ruby](http://rosettacode.org/wiki/Power_Set#Ruby)
|
98
|
+
|
57
99
|
Copyright
|
58
100
|
---------
|
59
101
|
See LICENSE for details.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# There are two methods described here for calculating the power set of
|
4
|
+
# a set.
|
5
|
+
#
|
6
|
+
# First is using a nice Ruby implementation from
|
7
|
+
# http://rosettacode.org/wiki/Power_Set#Ruby
|
8
|
+
#
|
9
|
+
# Second is using a binary count method.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'pp'
|
13
|
+
require 'benchmark'
|
14
|
+
|
15
|
+
array = [1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15,16,17,18,19]
|
16
|
+
|
17
|
+
puts "set size: #{array.size}"
|
18
|
+
|
19
|
+
inject = Benchmark.measure do
|
20
|
+
|
21
|
+
array.inject([[]]) { |ps,item|
|
22
|
+
ps + ps.map { |e| e + [item] }
|
23
|
+
}
|
24
|
+
|
25
|
+
end
|
26
|
+
puts "inject: #{inject}"
|
27
|
+
|
28
|
+
binary = Benchmark.measure do
|
29
|
+
|
30
|
+
out = []
|
31
|
+
(2**array.size).times do |i|
|
32
|
+
a = []
|
33
|
+
binary = i.to_s(2).rjust(array.size, '0')
|
34
|
+
binary.size.times do |j|
|
35
|
+
a << array[j] if binary[j] == '1'
|
36
|
+
end
|
37
|
+
out << a
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
puts "binary: #{binary}"
|
data/lib/set_theory/version.rb
CHANGED
data/lib/set_theory.rb
CHANGED
data/set_theory.gemspec
CHANGED
@@ -9,11 +9,12 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Tim Preston"]
|
10
10
|
s.email = ["tim@tp.id.au"]
|
11
11
|
s.homepage = "http://github.com/tehpeh/set_theory"
|
12
|
-
s.summary = %q{Extends Object with nice names for set operations.}
|
13
|
-
s.description = %q{Extends Object with nice names for set operations.}
|
12
|
+
s.summary = %q{Extends Object and Array with nice names for set operations.}
|
13
|
+
s.description = %q{Extends Object and Array with nice names for set operations.\nSee the Set class (http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html) for a library that doesn't pollute your Objects and Arrays.}
|
14
14
|
|
15
15
|
s.rubyforge_project = "set_theory"
|
16
16
|
|
17
|
+
s.add_development_dependency "rake", "0.8.7"
|
17
18
|
s.add_development_dependency "gem-release", "~> 0.0.16"
|
18
19
|
s.add_development_dependency "rspec", "~> 2.6.0"
|
19
20
|
s.add_development_dependency "guard", "~> 0.3.4"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'set_theory/power_set'
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
it 'responds to #power_set' do
|
5
|
+
Array.new.respond_to?(:power_set).should be
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#power_set' do
|
9
|
+
it 'calculates the power set of the set' do
|
10
|
+
([1, 2, 3].power_set).should
|
11
|
+
eql [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]].sort
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: set_theory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Tim Preston
|
@@ -10,65 +10,76 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05-
|
13
|
+
date: 2011-05-30 00:00:00 +10:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: rake
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - "="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.8.7
|
25
|
+
type: :development
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: gem-release
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
20
31
|
none: false
|
21
32
|
requirements:
|
22
33
|
- - ~>
|
23
34
|
- !ruby/object:Gem::Version
|
24
35
|
version: 0.0.16
|
25
36
|
type: :development
|
26
|
-
version_requirements: *
|
37
|
+
version_requirements: *id002
|
27
38
|
- !ruby/object:Gem::Dependency
|
28
39
|
name: rspec
|
29
40
|
prerelease: false
|
30
|
-
requirement: &
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
31
42
|
none: false
|
32
43
|
requirements:
|
33
44
|
- - ~>
|
34
45
|
- !ruby/object:Gem::Version
|
35
46
|
version: 2.6.0
|
36
47
|
type: :development
|
37
|
-
version_requirements: *
|
48
|
+
version_requirements: *id003
|
38
49
|
- !ruby/object:Gem::Dependency
|
39
50
|
name: guard
|
40
51
|
prerelease: false
|
41
|
-
requirement: &
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
42
53
|
none: false
|
43
54
|
requirements:
|
44
55
|
- - ~>
|
45
56
|
- !ruby/object:Gem::Version
|
46
57
|
version: 0.3.4
|
47
58
|
type: :development
|
48
|
-
version_requirements: *
|
59
|
+
version_requirements: *id004
|
49
60
|
- !ruby/object:Gem::Dependency
|
50
61
|
name: guard-rspec
|
51
62
|
prerelease: false
|
52
|
-
requirement: &
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
53
64
|
none: false
|
54
65
|
requirements:
|
55
66
|
- - ~>
|
56
67
|
- !ruby/object:Gem::Version
|
57
68
|
version: 0.3.1
|
58
69
|
type: :development
|
59
|
-
version_requirements: *
|
70
|
+
version_requirements: *id005
|
60
71
|
- !ruby/object:Gem::Dependency
|
61
72
|
name: rb-fsevent
|
62
73
|
prerelease: false
|
63
|
-
requirement: &
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
64
75
|
none: false
|
65
76
|
requirements:
|
66
77
|
- - ~>
|
67
78
|
- !ruby/object:Gem::Version
|
68
79
|
version: 0.4.0
|
69
80
|
type: :development
|
70
|
-
version_requirements: *
|
71
|
-
description: Extends Object with nice names for set operations.
|
81
|
+
version_requirements: *id006
|
82
|
+
description: Extends Object and Array with nice names for set operations.\nSee the Set class (http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html) for a library that doesn't pollute your Objects and Arrays.
|
72
83
|
email:
|
73
84
|
- tim@tp.id.au
|
74
85
|
executables: []
|
@@ -86,10 +97,12 @@ files:
|
|
86
97
|
- LICENSE
|
87
98
|
- README.md
|
88
99
|
- Rakefile
|
100
|
+
- benchmark/power_set.rb
|
89
101
|
- lib/set_theory.rb
|
90
102
|
- lib/set_theory/difference.rb
|
91
103
|
- lib/set_theory/intersection.rb
|
92
104
|
- lib/set_theory/member_of.rb
|
105
|
+
- lib/set_theory/power_set.rb
|
93
106
|
- lib/set_theory/symmetric_difference.rb
|
94
107
|
- lib/set_theory/union.rb
|
95
108
|
- lib/set_theory/version.rb
|
@@ -97,6 +110,7 @@ files:
|
|
97
110
|
- spec/set_theory/difference_spec.rb
|
98
111
|
- spec/set_theory/intersection_spec.rb
|
99
112
|
- spec/set_theory/member_of_spec.rb
|
113
|
+
- spec/set_theory/power_set_spec.rb
|
100
114
|
- spec/set_theory/symmetric_difference_spec.rb
|
101
115
|
- spec/set_theory/union_spec.rb
|
102
116
|
has_rdoc: true
|
@@ -126,10 +140,11 @@ rubyforge_project: set_theory
|
|
126
140
|
rubygems_version: 1.5.2
|
127
141
|
signing_key:
|
128
142
|
specification_version: 3
|
129
|
-
summary: Extends Object with nice names for set operations.
|
143
|
+
summary: Extends Object and Array with nice names for set operations.
|
130
144
|
test_files:
|
131
145
|
- spec/set_theory/difference_spec.rb
|
132
146
|
- spec/set_theory/intersection_spec.rb
|
133
147
|
- spec/set_theory/member_of_spec.rb
|
148
|
+
- spec/set_theory/power_set_spec.rb
|
134
149
|
- spec/set_theory/symmetric_difference_spec.rb
|
135
150
|
- spec/set_theory/union_spec.rb
|