permutation 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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