permutation 0.1.7 → 0.1.8

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/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ 2010-03-16 (0.1.8)
2
+ * Disabled building of gem spec file.
3
+ * Reorganised documentation.
4
+ * Fixed an unncessary check.
1
5
  2009-07-19 (0.1.7)
2
6
  * Create a gem spec file.
3
7
  * Some cleanup.
data/README CHANGED
@@ -1,35 +1,144 @@
1
- Installation
2
- ============
1
+ === Description
2
+
3
+ The Permutation class has a dual purpose: It can be used to create
4
+ permutations of a given size and to do some simple computations with/on
5
+ permutations. The instances of this class don't require much memory
6
+ because they don't include the permutation as a data structure. They
7
+ only save the information necessary to create the permutation if asked
8
+ to do so.
9
+
10
+ To generate permutations the ranking/unranking method described in [SS97]
11
+ is used. Because of Ruby's Bignum arithmetic it is useful also
12
+ for permutations of very large size.
13
+
14
+ === Download
15
+
16
+ The latest version of <b>permutation</b> can be found at
17
+
18
+ * http://www.ping.de/~flori/
19
+
20
+ The homepage of this library is located at
21
+
22
+ * http://flori.github.com/permutation
23
+
24
+ == Installation
3
25
 
4
26
  Just type into the command line as root:
5
27
 
6
28
  # ruby install.rb
7
29
 
8
- Or if you already use rubygems (you should!) just type and rubygems fetches
9
- the gem and installs it for you:
30
+ Or if you use rubygems just type and rubygems fetches the gem and installs it
31
+ for you:
10
32
 
11
33
  # gem install permutation
12
34
 
13
- Documentation
14
- =============
35
+ == Creating Documentation
15
36
 
16
- To create the documentation of this module, type
37
+ To create the documentation of this module, type either
17
38
 
18
39
  $ ruby make_doc.rb
19
40
 
41
+ or with rake installed
42
+
43
+ $ rake doc
44
+
20
45
  and the API documentation is generated by your rdoc command in
21
46
  the doc/ sub-directory.
22
47
 
23
- In the examples direcotry is a small example that solves the
48
+ The examples direcotry also contains a small demonstration that solves the
24
49
  Traveling Salesman Problem (TSP) with this library.
25
50
 
26
- Author
27
- ======
51
+ === Examples
52
+
53
+ In this section some examples show what can be done with this class.
54
+
55
+ Creating all permutations and project them on data:
56
+
57
+ perm = Permutation.new(3)
58
+ # => #<Permutation:0x57dc94 @last=5, @rank=0, @size=3>
59
+ perm.map { |p| p.value }
60
+ # => [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]
61
+ colors = [:r, :g, :b]
62
+ # => [:r, :g, :b]
63
+ perm.map { |p| p.project(colors) }
64
+ # => [[:r, :g, :b], [:r, :b, :g], [:g, :r, :b], [:g, :b, :r], [:b, :r, :g],
65
+ # [:b, :g, :r]]
66
+ string = "abc"# => "abc"
67
+ perm.map { |p| p.project(string) }
68
+ # => ["abc", "acb", "bac", "bca", "cab", "cba"]
69
+
70
+ Or perhaps more convenient to use:
71
+
72
+ perm = Permutation.for("abc")
73
+ perm.map { |p| p.project }
74
+ # => ["abc", "acb", "bac", "bca", "cab", "cba"]
75
+
76
+ Finding the successor and predecessor of Permutations or a
77
+ certain Permutation for a given rank:
78
+
79
+ perm = Permutation.new(7)
80
+ # => #<Permutation:0x8453c @rank=0, @size=7, @last=5039>
81
+ perm.succ!
82
+ # => #<Permutation:0x8453c @rank=1, @size=7, @last=5039>
83
+ perm.succ!
84
+ # => #<Permutation:0x8453c @rank=2, @size=7, @last=5039>
85
+ perm.succ!
86
+ # => #<Permutation:0x8453c @rank=3, @size=7, @last=5039>
87
+ perm.pred!
88
+ # => #<Permutation:0x8453c @rank=2, @size=7, @last=5039>
89
+ perm.rank = 3200
90
+ # => 3200
91
+ perm
92
+ # => #<Permutation:0x8453c @rank=3200, @size=7, @last=5039>
93
+ perm.value
94
+ # => [4, 2, 5, 1, 3, 0, 6]
95
+
96
+ Generating random Permutations
97
+
98
+ perm = Permutation.new(10)
99
+ # => #<Permutation:0x59f4c0 @rank=0, @size=10, @last=3628799>
100
+ perm.random!.value
101
+ # => [6, 4, 9, 7, 3, 5, 8, 1, 2, 0]
102
+ perm.random!.value
103
+ # => [3, 7, 6, 1, 4, 8, 9, 2, 5, 0]
104
+ perm.random!.value
105
+ # => [2, 8, 4, 9, 3, 5, 6, 7, 0, 1]
106
+ perm.random!.project("ABCDEFGHIJ")
107
+ # => "DFJGAEBCIH"
108
+ perm.random!.project("ABCDEFGHIJ")
109
+ # => "BFADEGHJCI"
110
+
111
+ Performing some mathematical operations on/with Permutations
112
+
113
+ p1 = Permutation.from_cycles([[1, 3, 2], [5, 7]], 10)
114
+ # => #<Permutation:0x593594 @rank=80694, @size=10, @last=3628799>
115
+ p2 = Permutation.from_value [3, 2, 0, 5, 6, 8, 9, 1, 4, 7]
116
+ # => #<Permutation:0x5897b0 @rank=1171050, @size=10, @last=3628799>
117
+ p3 = p1 * p2
118
+ # => #<Permutation:0x586a88 @rank=769410, @size=10, @last=3628799>
119
+ p3.value
120
+ # => [2, 1, 0, 7, 6, 8, 9, 3, 4, 5]
121
+ p3.cycles
122
+ # => [[0, 2], [3, 7], [4, 6, 9, 5, 8]]
123
+ p4 = p1 * -p2
124
+ # => #<Permutation:0x581a10 @rank=534725, @size=10, @last=3628799>
125
+ p4.value
126
+ # => [1, 5, 3, 0, 8, 2, 4, 9, 7, 6]
127
+ p4.cycles
128
+ # => [[0, 1, 5, 2, 3], [4, 8, 7, 9, 6]]
129
+ id = p1 * -p1
130
+ # => #<Permutation:0x583a7c @rank=0, @size=10, @last=3628799>
131
+
132
+ === References
133
+
134
+ [SS97] The Algorithm Design Manual, Steven S. Skiena, Telos/Springer, 1997.
28
135
 
29
- Florian Frank <flori@ping.de>
136
+ === Author
30
137
 
31
- License
32
- =======
138
+ Florian Frank mailto:flori@ping.de
33
139
 
34
- GNU General Public License (GPL)
140
+ === License
35
141
 
142
+ This is free software; you can redistribute it and/or modify it under the
143
+ terms of the GNU General Public License Version 2 as published by the Free
144
+ Software Foundation: www.gnu.org/copyleft/gpl.html
data/Rakefile CHANGED
@@ -32,38 +32,27 @@ task :doc do
32
32
  end
33
33
 
34
34
  if defined? Gem
35
- spec_src = <<GEM
36
- # -*- encoding: utf-8 -*-
37
- Gem::Specification.new do |s|
38
- s.name = '#{PKG_NAME}'
39
- s.version = '#{PKG_VERSION}'
40
- s.summary = 'Permutation library in pure Ruby'
41
- s.description = "Library to perform different operations with permutations of sequences (strings, arrays, etc.)"
35
+ spec = Gem::Specification.new do |s|
36
+ s.name = PKG_NAME
37
+ s.version = PKG_VERSION
38
+ s.summary = 'Permutation library in pure Ruby'
39
+ s.description = "Library to perform different operations with permutations of sequences (strings, arrays, etc.)"
42
40
 
43
- s.files = #{PKG_FILES.to_a.sort.inspect}
41
+ s.files = PKG_FILES.to_a.sort
44
42
 
45
- s.require_path = 'lib'
43
+ s.require_path = 'lib'
46
44
 
47
- s.has_rdoc = true
48
- s.rdoc_options << '--main' << 'doc-main.txt' << '--line-numbers'
49
- s.extra_rdoc_files << 'doc-main.txt'
50
- s.test_files << 'test/test.rb'
45
+ s.has_rdoc = true
46
+ s.rdoc_options << '--main' << 'README' << '--line-numbers'
47
+ s.extra_rdoc_files << 'README'
48
+ s.test_files << 'test/test.rb'
51
49
 
52
- s.author = "Florian Frank"
53
- s.email = "flori@ping.de"
54
- s.homepage = "http://#{PKG_NAME}.rubyforge.org"
55
- s.rubyforge_project = "#{PKG_NAME}"
56
- end
57
- GEM
58
-
59
- desc 'Create a gemspec file'
60
- task :gemspec do
61
- File.open("#{PKG_NAME}.gemspec", 'w') do |f|
62
- f.puts spec_src
63
- end
50
+ s.author = "Florian Frank"
51
+ s.email = "flori@ping.de"
52
+ s.homepage = "http://flori.github.com/#{PKG_NAME}"
53
+ s.rubyforge_project = "#{PKG_NAME}"
64
54
  end
65
55
 
66
- spec = eval(spec_src)
67
56
  Rake::GemPackageTask.new(spec) do |pkg|
68
57
  pkg.need_tar = true
69
58
  pkg.package_files += PKG_FILES
@@ -87,6 +76,6 @@ EOT
87
76
  end
88
77
  end
89
78
 
90
- task :default => [ :version, :gemspec, :test ]
79
+ task :default => [ :version, :test ]
91
80
 
92
- task :release => [ :clean, :version, :gemspec, :package ]
81
+ task :release => [ :clean, :version, :package ]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -259,7 +259,7 @@ class Permutation
259
259
  result = [[]]
260
260
  seen = {}
261
261
  current = nil
262
- until seen == perm.size
262
+ loop do
263
263
  current or current = perm.find { |x| !seen[x] }
264
264
  break unless current
265
265
  if seen[current]
@@ -1,6 +1,6 @@
1
1
  class Permutation
2
2
  # Permutation version
3
- VERSION = '0.1.7'
3
+ VERSION = '0.1.8'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -2,4 +2,4 @@
2
2
 
3
3
  $outdir = 'doc/'
4
4
  puts "Creating documentation in '#$outdir'."
5
- system "rdoc -d -m doc-main.txt -o #$outdir #{(%w[doc-main.txt] + Dir['lib/**/*.rb']) * ' '}"
5
+ system "rdoc -d -m README -t 'Permutation library for Ruby' -o #$outdir #{(%w[README] + Dir['lib/**/*.rb']) * ' '}"
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: permutation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 8
9
+ version: 0.1.8
5
10
  platform: ruby
6
11
  authors:
7
12
  - Florian Frank
@@ -9,7 +14,7 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-07-19 00:00:00 +02:00
17
+ date: 2010-03-16 00:00:00 +01:00
13
18
  default_executable:
14
19
  dependencies: []
15
20
 
@@ -20,7 +25,7 @@ executables: []
20
25
  extensions: []
21
26
 
22
27
  extra_rdoc_files:
23
- - doc-main.txt
28
+ - README
24
29
  files:
25
30
  - CHANGES
26
31
  - COPYING
@@ -32,17 +37,15 @@ files:
32
37
  - lib/permutation.rb
33
38
  - lib/permutation/version.rb
34
39
  - make_doc.rb
35
- - permutation.gemspec
36
40
  - test/test.rb
37
- - doc-main.txt
38
41
  has_rdoc: true
39
- homepage: http://permutation.rubyforge.org
42
+ homepage: http://flori.github.com/permutation
40
43
  licenses: []
41
44
 
42
45
  post_install_message:
43
46
  rdoc_options:
44
47
  - --main
45
- - doc-main.txt
48
+ - README
46
49
  - --line-numbers
47
50
  require_paths:
48
51
  - lib
@@ -50,18 +53,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
53
  requirements:
51
54
  - - ">="
52
55
  - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
53
58
  version: "0"
54
- version:
55
59
  required_rubygems_version: !ruby/object:Gem::Requirement
56
60
  requirements:
57
61
  - - ">="
58
62
  - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
59
65
  version: "0"
60
- version:
61
66
  requirements: []
62
67
 
63
68
  rubyforge_project: permutation
64
- rubygems_version: 1.3.2
69
+ rubygems_version: 1.3.6
65
70
  signing_key:
66
71
  specification_version: 3
67
72
  summary: Permutation library in pure Ruby
@@ -1,120 +0,0 @@
1
- == Permutation library for Ruby
2
-
3
- === Author
4
-
5
- Florian Frank mailto:flori@ping.de
6
-
7
- === License
8
-
9
- This is free software; you can redistribute it and/or modify it under the
10
- terms of the GNU General Public License Version 2 as published by the Free
11
- Software Foundation: www.gnu.org/copyleft/gpl.html
12
-
13
- === Download
14
-
15
- The latest version of <b>permutation</b> can be found at
16
-
17
- * http://rubyforge.org/frs/?group_id=291
18
-
19
- The homepage of this library is located at
20
-
21
- * http://permutation.rubyforge.org
22
-
23
- === Description
24
-
25
- The Permutation class has a dual purpose: It can be used to create
26
- permutations of a given size and to do some simple computations with/on
27
- permutations. The instances of this class don't require much memory
28
- because they don't include the permutation as a data structure. They
29
- only save the information necessary to create the permutation if asked
30
- to do so.
31
-
32
- To generate permutations the ranking/unranking method described in [SS97]
33
- is used. Because of Ruby's Bignum arithmetic it is useful also
34
- for permutations of very large size.
35
-
36
- === Examples
37
-
38
- In this section some examples show what can be done with this class.
39
-
40
- Creating all permutations and project them on data:
41
-
42
- perm = Permutation.new(3)
43
- # => #<Permutation:0x57dc94 @last=5, @rank=0, @size=3>
44
- perm.map { |p| p.value }
45
- # => [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]
46
- colors = [:r, :g, :b]
47
- # => [:r, :g, :b]
48
- perm.map { |p| p.project(colors) }
49
- # => [[:r, :g, :b], [:r, :b, :g], [:g, :r, :b], [:g, :b, :r], [:b, :r, :g],
50
- # [:b, :g, :r]]
51
- string = "abc"# => "abc"
52
- perm.map { |p| p.project(string) }
53
- # => ["abc", "acb", "bac", "bca", "cab", "cba"]
54
-
55
- Or perhaps more convenient to use:
56
-
57
- perm = Permutation.for("abc")
58
- perm.map { |p| p.project }
59
- # => ["abc", "acb", "bac", "bca", "cab", "cba"]
60
-
61
- Finding the successor and predecessor of Permutations or a
62
- certain Permutation for a given rank:
63
-
64
- perm = Permutation.new(7)
65
- # => #<Permutation:0x8453c @rank=0, @size=7, @last=5039>
66
- perm.succ!
67
- # => #<Permutation:0x8453c @rank=1, @size=7, @last=5039>
68
- perm.succ!
69
- # => #<Permutation:0x8453c @rank=2, @size=7, @last=5039>
70
- perm.succ!
71
- # => #<Permutation:0x8453c @rank=3, @size=7, @last=5039>
72
- perm.pred!
73
- # => #<Permutation:0x8453c @rank=2, @size=7, @last=5039>
74
- perm.rank = 3200
75
- # => 3200
76
- perm
77
- # => #<Permutation:0x8453c @rank=3200, @size=7, @last=5039>
78
- perm.value
79
- # => [4, 2, 5, 1, 3, 0, 6]
80
-
81
- Generating random Permutations
82
-
83
- perm = Permutation.new(10)
84
- # => #<Permutation:0x59f4c0 @rank=0, @size=10, @last=3628799>
85
- perm.random!.value
86
- # => [6, 4, 9, 7, 3, 5, 8, 1, 2, 0]
87
- perm.random!.value
88
- # => [3, 7, 6, 1, 4, 8, 9, 2, 5, 0]
89
- perm.random!.value
90
- # => [2, 8, 4, 9, 3, 5, 6, 7, 0, 1]
91
- perm.random!.project("ABCDEFGHIJ")
92
- # => "DFJGAEBCIH"
93
- perm.random!.project("ABCDEFGHIJ")
94
- # => "BFADEGHJCI"
95
-
96
- Performing some mathematical operations on/with Permutations
97
-
98
- p1 = Permutation.from_cycles([[1, 3, 2], [5, 7]], 10)
99
- # => #<Permutation:0x593594 @rank=80694, @size=10, @last=3628799>
100
- p2 = Permutation.from_value [3, 2, 0, 5, 6, 8, 9, 1, 4, 7]
101
- # => #<Permutation:0x5897b0 @rank=1171050, @size=10, @last=3628799>
102
- p3 = p1 * p2
103
- # => #<Permutation:0x586a88 @rank=769410, @size=10, @last=3628799>
104
- p3.value
105
- # => [2, 1, 0, 7, 6, 8, 9, 3, 4, 5]
106
- p3.cycles
107
- # => [[0, 2], [3, 7], [4, 6, 9, 5, 8]]
108
- p4 = p1 * -p2
109
- # => #<Permutation:0x581a10 @rank=534725, @size=10, @last=3628799>
110
- p4.value
111
- # => [1, 5, 3, 0, 8, 2, 4, 9, 7, 6]
112
- p4.cycles
113
- # => [[0, 1, 5, 2, 3], [4, 8, 7, 9, 6]]
114
- id = p1 * -p1
115
- # => #<Permutation:0x583a7c @rank=0, @size=10, @last=3628799>
116
-
117
- === References
118
-
119
- [SS97] The Algorithm Design Manual, Steven S. Skiena, Telos/Springer, 1997.
120
-
@@ -1,21 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- Gem::Specification.new do |s|
3
- s.name = 'permutation'
4
- s.version = '0.1.7'
5
- s.summary = 'Permutation library in pure Ruby'
6
- s.description = "Library to perform different operations with permutations of sequences (strings, arrays, etc.)"
7
-
8
- s.files = ["CHANGES", "COPYING", "README", "Rakefile", "VERSION", "examples", "examples/tsp.rb", "install.rb", "lib", "lib/permutation", "lib/permutation.rb", "lib/permutation/version.rb", "make_doc.rb", "permutation.gemspec", "test", "test/test.rb"]
9
-
10
- s.require_path = 'lib'
11
-
12
- s.has_rdoc = true
13
- s.rdoc_options << '--main' << 'doc-main.txt' << '--line-numbers'
14
- s.extra_rdoc_files << 'doc-main.txt'
15
- s.test_files << 'test/test.rb'
16
-
17
- s.author = "Florian Frank"
18
- s.email = "flori@ping.de"
19
- s.homepage = "http://permutation.rubyforge.org"
20
- s.rubyforge_project = "permutation"
21
- end