permutation 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ 2008-12-01 (0.1.6)
2
+ * Reuse last value more.
3
+ * Re-indented code.
4
+ 2007-04-17 (0.1.5)
5
+ * Added version.
6
+ * Better caching for factorial.
1
7
  2006-03-11 (0.1.4)
2
8
  * Applied two bugfixes. Thanks go to Roel Harbers <roel@roelharbers.com>
3
9
  for the report.
data/GPL CHANGED
File without changes
data/README.en CHANGED
File without changes
data/Rakefile CHANGED
@@ -23,6 +23,11 @@ task :test do
23
23
  ruby %{-Ilib test/test.rb}
24
24
  end
25
25
 
26
+ desc "Testing library (with coverage)"
27
+ task :coverage do
28
+ sh %{rcov -Ilib test/test.rb}
29
+ end
30
+
26
31
  spec = Gem::Specification.new do |s|
27
32
  s.name = 'permutation'
28
33
  s.version = PKG_VERSION
@@ -66,5 +71,7 @@ EOT
66
71
  end
67
72
  end
68
73
 
74
+ CLEAN.include 'doc'
75
+
69
76
  task :release => [ :clean, :version, :package ]
70
77
  # vim: set et sw=2 ts=2:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/install.rb CHANGED
File without changes
@@ -47,7 +47,7 @@
47
47
  # # => [:r, :g, :b]
48
48
  # perm.map { |p| p.project(colors) }
49
49
  # # => [[:r, :g, :b], [:r, :b, :g], [:g, :r, :b], [:g, :b, :r], [:b, :r, :g],
50
- # # [:b, :g, :r]]
50
+ # # [:b, :g, :r]]
51
51
  # string = "abc"# => "abc"
52
52
  # perm.map { |p| p.project(string) }
53
53
  # # => ["abc", "acb", "bac", "bca", "cab", "cba"]
@@ -120,42 +120,42 @@
120
120
  #
121
121
 
122
122
  class Permutation
123
- include Enumerable
124
- include Comparable
125
-
126
- # Creates a new Permutation instance of <code>size</code>
127
- # (and ranked with <code>rank</code>).
128
- def initialize(size, rank = 0)
129
- @size, @rank = size, rank
130
- @last = factorial(size) - 1
123
+ include Enumerable
124
+ include Comparable
125
+
126
+ # Creates a new Permutation instance of <code>size</code>
127
+ # (and ranked with <code>rank</code>).
128
+ def initialize(size, rank = 0)
129
+ @size, @rank = size, rank
130
+ @last = factorial(size) - 1
131
+ end
132
+
133
+ # Creates a new Permutation instance from the Array
134
+ # <code>indices</code>, that should consist of a permutation of Fixnums
135
+ # in the range of <code>0</code> and <code>indices.size - 1</code>. This is
136
+ # for example the result of a call to the Permutation#value method.
137
+ def self.from_value(indices)
138
+ obj = new(indices.size)
139
+ obj.instance_eval do
140
+ self.rank = rank_indices(indices)
131
141
  end
132
-
133
- # Creates a new Permutation instance from the Array
134
- # <code>indices</code>, that should consist of a permutation of Fixnums
135
- # in the range of <code>0</code> and <code>indices.size - 1</code>. This is
136
- # for example the result of a call to the Permutation#value method.
137
- def self.from_value(indices)
138
- obj = new(indices.size)
139
- obj.instance_eval do
140
- self.rank = rank_indices(indices)
141
- end
142
- obj
143
- end
144
-
145
- # Creates a new Permutation instance from the Array of Arrays
146
- # <code>cycles</code>. This is for example the result of a
147
- # call to the Permutation#cycles method .
148
- def self.from_cycles(cycles, max = 0)
149
- indices = Array.new(max)
150
- cycles.each do |cycle|
151
- cycle.empty? and next
152
- for i in 0...cycle.size
153
- indices[ cycle[i - 1] ] = cycle[i]
154
- end
155
- end
156
- indices.each_with_index { |r, i| r or indices[i] = i }
157
- from_value(indices)
142
+ obj
143
+ end
144
+
145
+ # Creates a new Permutation instance from the Array of Arrays
146
+ # <code>cycles</code>. This is for example the result of a
147
+ # call to the Permutation#cycles method .
148
+ def self.from_cycles(cycles, max = 0)
149
+ indices = Array.new(max)
150
+ cycles.each do |cycle|
151
+ cycle.empty? and next
152
+ for i in 0...cycle.size
153
+ indices[ cycle[i - 1] ] = cycle[i]
154
+ end
158
155
  end
156
+ indices.each_with_index { |r, i| r or indices[i] = i }
157
+ from_value(indices)
158
+ end
159
159
 
160
160
  # A permutation instance of size collection.size is created with
161
161
  # collection as the default Permutation#project data object. A
@@ -167,301 +167,299 @@ class Permutation
167
167
  perm
168
168
  end
169
169
 
170
- # Returns the size of this permutation, a Fixnum.
171
- attr_reader :size
172
-
173
- # Returns the size of this permutation, a Fixnum in the range
174
- # of 0 and Permutation#last.
175
- attr_reader :rank
176
-
177
- # Returns the rank of the last ranked Permutation of size
178
- # Permutation#size .
179
- attr_reader :last
180
-
181
- # Assigns <code>m</code> to the rank attribute of this Permutation
182
- # instance. That implies that the indices produced by a call to the
183
- # Permutation#value method of this instance is the permutation ranked with
184
- # this new <code>rank</code>.
185
- def rank=(m)
186
- @rank = m % factorial(size)
187
- end
188
-
189
- # Returns the indices in the range of 0 to Permutation#size - 1
190
- # of this permutation that is ranked with Permutation#rank.
191
- #
192
- # <b>Example:</b>
193
- # perm = Permutation.new(6, 312)
194
- # # => #<Permutation:0x6ae34 @last=719, @rank=312, @size=6>
195
- # perm.value
196
- # # => [2, 4, 0, 1, 3, 5]
197
- def value
198
- unrank_indices(@rank)
199
- end
200
-
201
- # Returns the projection of this instance's Permutation#value
202
- # into the <code>data</code> object that should respond to
203
- # the #[] method. If this Permutation inbstance was created
204
- # with Permutation.for the collection used to create
205
- # it is used as a data object.
206
- #
207
- # <b>Example:</b>
208
- # perm = Permutation.new(6, 312)
209
- # # => #<Permutation:0x6ae34 @last=719, @rank=312, @size=6>
210
- # perm.project("abcdef")
211
- # # => "ceabdf"
212
- def project(data = @collection)
213
- data or raise ArgumentError.new("a collection is required to project")
214
- raise ArgumentError.new("data size is != #{size}!") if data.size != size
215
- projection = data.clone
216
- value.each_with_index { |i, j| projection[j] = data[i] }
217
- projection
218
- end
219
-
220
- # Switches this instances to the next ranked Permutation.
221
- # If this was the Permutation#last permutation it wraps around
222
- # the first (<code>rank == 0</code>) permutation.
223
- def next!
224
- @rank += 1
225
- last = factorial(size) - 1
226
- @rank = 0 if @rank > last
227
- self
228
- end
229
-
230
- alias succ! next!
231
-
232
- # Returns the next ranked Permutation instance.
233
- # If this instance is the Permutation#last permutation it returns the first
234
- # (<code>rank == 0</code>) permutation.
235
- def next
236
- clone.next!
237
- end
238
-
239
- alias succ next
240
-
241
- # Switches this instances to the previously ranked Permutation.
242
- # If this was the first permutation it returns the last (<code>rank ==
243
- # Permutation#last</code>) permutation.
244
- def pred!
245
- @rank -= 1
246
- last = factorial(size) - 1
247
- @rank = last if @rank < 0
248
- self
249
- end
250
-
251
- # Returns the previously ranked Permutation. If this was the first
252
- # permutation it returns the last (<code>rank == Permutation#last</code>)
253
- # permutation.
254
- def pred
255
- clone.pred!
256
- end
257
-
258
- # Switches this Permutation instance to random permutation
259
- # of size Permutation#size.
260
- def random!
261
- new_rank = rand(last + 1).to_i
262
- self.rank = new_rank
263
- self
264
- end
265
-
266
- # Returns a random Permutation instance # of size Permutation#size.
267
- def random
268
- clone.random!
269
- end
270
-
271
- # Iterates over all permutations of size Permutation#size starting with the
272
- # first (<code>rank == 0</code>) ranked permutation and ending with the
273
- # last (<code>rank == Permutation#last</code>) ranked permutation while
274
- # yielding to a freshly created Permutation instance for every iteration
275
- # step.
276
- #
277
- # The mixed in methods from the Enumerable module rely on this method.
278
- def each # :yields: perm
279
- 0.upto(last) do |r|
280
- klon = clone
281
- klon.rank = r
282
- yield klon
283
- end
284
- end
285
-
286
- # Does something similar to Permutation#each. It doesn't create new
287
- # instances (less overhead) for every iteration step, but yields to a
288
- # modified self instead. This is useful if one only wants to call a
289
- # method on the yielded value and work with the result of this call. It's
290
- # not a good idea to put the yielded values in a data structure because the
291
- # will all reference the same (this!) instance. If you want to do this
292
- # use Permutation#each.
293
- def each!
294
- old_rank = rank
295
- 0.upto(last) do |r|
296
- self.rank = r
297
- yield self
298
- end
299
- self.rank = old_rank
300
- end
301
-
302
- # Compares to Permutation instances according to their Permutation#size
303
- # and the Permutation#rank.
304
- #
305
- # The mixed in methods from the Comparable module rely on this method.
306
- def <=>(other)
307
- size <=> other.size.zero? || rank <=> other.rank
308
- end
309
-
310
- # Returns true if this Permutation instance and the other have the same
311
- # value, that is both Permutation instances have the same Permutation#size
312
- # and the same Permutation#rank.
313
- def eql?(other)
314
- self.class == other.class && size == other.size && rank == other.rank
170
+ # Returns the size of this permutation, a Fixnum.
171
+ attr_reader :size
172
+
173
+ # Returns the size of this permutation, a Fixnum in the range
174
+ # of 0 and Permutation#last.
175
+ attr_reader :rank
176
+
177
+ # Returns the rank of the last ranked Permutation of size
178
+ # Permutation#size .
179
+ attr_reader :last
180
+
181
+ # Assigns <code>m</code> to the rank attribute of this Permutation
182
+ # instance. That implies that the indices produced by a call to the
183
+ # Permutation#value method of this instance is the permutation ranked with
184
+ # this new <code>rank</code>.
185
+ def rank=(m)
186
+ @rank = m % factorial(size)
187
+ end
188
+
189
+ # Returns the indices in the range of 0 to Permutation#size - 1
190
+ # of this permutation that is ranked with Permutation#rank.
191
+ #
192
+ # <b>Example:</b>
193
+ # perm = Permutation.new(6, 312)
194
+ # # => #<Permutation:0x6ae34 @last=719, @rank=312, @size=6>
195
+ # perm.value
196
+ # # => [2, 4, 0, 1, 3, 5]
197
+ def value
198
+ unrank_indices(@rank)
199
+ end
200
+
201
+ # Returns the projection of this instance's Permutation#value
202
+ # into the <code>data</code> object that should respond to
203
+ # the #[] method. If this Permutation inbstance was created
204
+ # with Permutation.for the collection used to create
205
+ # it is used as a data object.
206
+ #
207
+ # <b>Example:</b>
208
+ # perm = Permutation.new(6, 312)
209
+ # # => #<Permutation:0x6ae34 @last=719, @rank=312, @size=6>
210
+ # perm.project("abcdef")
211
+ # # => "ceabdf"
212
+ def project(data = @collection)
213
+ data or raise ArgumentError, "a collection is required to project"
214
+ raise ArgumentError, "data size is != #{size}!" if data.size != size
215
+ projection = data.clone
216
+ value.each_with_index { |i, j| projection[j] = data[i] }
217
+ projection
218
+ end
219
+
220
+ # Switches this instances to the next ranked Permutation.
221
+ # If this was the Permutation#last permutation it wraps around
222
+ # the first (<code>rank == 0</code>) permutation.
223
+ def next!
224
+ @rank += 1
225
+ @rank = 0 if @rank > last
226
+ self
227
+ end
228
+
229
+ alias succ! next!
230
+
231
+ # Returns the next ranked Permutation instance.
232
+ # If this instance is the Permutation#last permutation it returns the first
233
+ # (<code>rank == 0</code>) permutation.
234
+ def next
235
+ clone.next!
236
+ end
237
+
238
+ alias succ next
239
+
240
+ # Switches this instances to the previously ranked Permutation.
241
+ # If this was the first permutation it returns the last (<code>rank ==
242
+ # Permutation#last</code>) permutation.
243
+ def pred!
244
+ @rank -= 1
245
+ @rank = last if @rank < 0
246
+ self
247
+ end
248
+
249
+ # Returns the previously ranked Permutation. If this was the first
250
+ # permutation it returns the last (<code>rank == Permutation#last</code>)
251
+ # permutation.
252
+ def pred
253
+ clone.pred!
254
+ end
255
+
256
+ # Switches this Permutation instance to random permutation
257
+ # of size Permutation#size.
258
+ def random!
259
+ new_rank = rand(last + 1).to_i
260
+ self.rank = new_rank
261
+ self
262
+ end
263
+
264
+ # Returns a random Permutation instance # of size Permutation#size.
265
+ def random
266
+ clone.random!
267
+ end
268
+
269
+ # Iterates over all permutations of size Permutation#size starting with the
270
+ # first (<code>rank == 0</code>) ranked permutation and ending with the
271
+ # last (<code>rank == Permutation#last</code>) ranked permutation while
272
+ # yielding to a freshly created Permutation instance for every iteration
273
+ # step.
274
+ #
275
+ # The mixed in methods from the Enumerable module rely on this method.
276
+ def each # :yields: perm
277
+ 0.upto(last) do |r|
278
+ klon = clone
279
+ klon.rank = r
280
+ yield klon
315
281
  end
316
-
317
- alias == eql?
318
-
319
- # Computes a unique hash value for this Permutation instance.
320
- def hash
321
- size.hash ^ rank.hash
282
+ end
283
+
284
+ # Does something similar to Permutation#each. It doesn't create new
285
+ # instances (less overhead) for every iteration step, but yields to a
286
+ # modified self instead. This is useful if one only wants to call a
287
+ # method on the yielded value and work with the result of this call. It's
288
+ # not a good idea to put the yielded values in a data structure because the
289
+ # will all reference the same (this!) instance. If you want to do this
290
+ # use Permutation#each.
291
+ def each!
292
+ old_rank = rank
293
+ 0.upto(last) do |r|
294
+ self.rank = r
295
+ yield self
322
296
  end
323
-
324
- # Switchtes this Permutation instance to the inverted permutation.
325
- # (See Permutation#compose for an example.)
326
- def invert!
327
- indices = unrank_indices(rank)
328
- inverted = Array.new(size)
329
- for i in 0...size
330
- inverted[indices[i]] = i
331
- end
332
- self.rank = rank_indices(inverted)
333
- self
297
+ self.rank = old_rank
298
+ end
299
+
300
+ # Compares to Permutation instances according to their Permutation#size
301
+ # and the Permutation#rank.
302
+ #
303
+ # The mixed in methods from the Comparable module rely on this method.
304
+ def <=>(other)
305
+ size <=> other.size.zero? || rank <=> other.rank
306
+ end
307
+
308
+ # Returns true if this Permutation instance and the other have the same
309
+ # value, that is both Permutation instances have the same Permutation#size
310
+ # and the same Permutation#rank.
311
+ def eql?(other)
312
+ self.class == other.class && size == other.size && rank == other.rank
313
+ end
314
+
315
+ alias == eql?
316
+
317
+ # Computes a unique hash value for this Permutation instance.
318
+ def hash
319
+ size.hash ^ rank.hash
320
+ end
321
+
322
+ # Switchtes this Permutation instance to the inverted permutation.
323
+ # (See Permutation#compose for an example.)
324
+ def invert!
325
+ indices = unrank_indices(rank)
326
+ inverted = Array.new(size)
327
+ for i in 0...size
328
+ inverted[indices[i]] = i
334
329
  end
335
-
336
- # Returns the inverted Permutation of this Permutation instance.
337
- # (See Permutation#compose for an example.)
338
- def invert
339
- clone.invert!
340
- end
341
-
342
- alias -@ invert
343
-
344
- # Compose this Permutation instance and the other to
345
- # a new Permutation. Note that a permutation
346
- # composed with it's inverted permutation yields
347
- # the identity permutation, the permutation with rank 0.
348
- #
349
- # <b>Example:</b>
350
- # p1 = Permutation.new(5, 42)
351
- # # => #<Permutation:0x75370 @last=119, @rank=42, @size=5>
352
- # p2 = p1.invert
353
- # # => #<Permutation:0x653d0 @last=119, @rank=51, @size=5>
354
- # p1.compose(p2)
355
- # => #<Permutation:0x639a4 @last=119, @rank=0, @size=5>
356
- # Or a little nicer to look at:
357
- # p1 * -p1
358
- # # => #<Permutation:0x62004 @last=119, @rank=0, @size=5>
359
- def compose(other)
360
- size == other.size or raise ArgumentError.new(
361
- "permutations of unequal sizes cannot be composed!")
362
- indices = self.value
363
- composed = other.value.map { |i| indices[i] }
364
- klon = clone
365
- klon.rank = rank_indices(composed)
366
- klon
367
- end
368
-
369
- alias * compose
370
-
371
- # Returns the cycles representation of this Permutation instance.
372
- # The return value of this method can be used to create a
373
- # new Permutation instance with the Permutation.from_cycles method.
374
- #
375
- # <b>Example:</b>
376
- # perm = Permutation.new(7, 23)
377
- # # => #<Permutation:0x58541c @last=5039, @rank=23, @size=7>
378
- # perm.cycles
379
- # # => [[3, 6], [4, 5]]
380
- def cycles
381
- perm = value
382
- result = [[]]
383
- seen = {}
330
+ self.rank = rank_indices(inverted)
331
+ self
332
+ end
333
+
334
+ # Returns the inverted Permutation of this Permutation instance.
335
+ # (See Permutation#compose for an example.)
336
+ def invert
337
+ clone.invert!
338
+ end
339
+
340
+ alias -@ invert
341
+
342
+ # Compose this Permutation instance and the other to
343
+ # a new Permutation. Note that a permutation
344
+ # composed with it's inverted permutation yields
345
+ # the identity permutation, the permutation with rank 0.
346
+ #
347
+ # <b>Example:</b>
348
+ # p1 = Permutation.new(5, 42)
349
+ # # => #<Permutation:0x75370 @last=119, @rank=42, @size=5>
350
+ # p2 = p1.invert
351
+ # # => #<Permutation:0x653d0 @last=119, @rank=51, @size=5>
352
+ # p1.compose(p2)
353
+ # => #<Permutation:0x639a4 @last=119, @rank=0, @size=5>
354
+ # Or a little nicer to look at:
355
+ # p1 * -p1
356
+ # # => #<Permutation:0x62004 @last=119, @rank=0, @size=5>
357
+ def compose(other)
358
+ size == other.size or raise ArgumentError,
359
+ "permutations of unequal sizes cannot be composed!"
360
+ indices = self.value
361
+ composed = other.value.map { |i| indices[i] }
362
+ klon = clone
363
+ klon.rank = rank_indices(composed)
364
+ klon
365
+ end
366
+
367
+ alias * compose
368
+
369
+ # Returns the cycles representation of this Permutation instance.
370
+ # The return value of this method can be used to create a
371
+ # new Permutation instance with the Permutation.from_cycles method.
372
+ #
373
+ # <b>Example:</b>
374
+ # perm = Permutation.new(7, 23)
375
+ # # => #<Permutation:0x58541c @last=5039, @rank=23, @size=7>
376
+ # perm.cycles
377
+ # # => [[3, 6], [4, 5]]
378
+ def cycles
379
+ perm = value
380
+ result = [[]]
381
+ seen = {}
382
+ current = nil
383
+ until seen == perm.size
384
+ current or current = perm.find { |x| !seen[x] }
385
+ break unless current
386
+ if seen[current]
384
387
  current = nil
385
- until seen == perm.size
386
- current or current = perm.find { |x| !seen[x] }
387
- break unless current
388
- if seen[current]
389
- current = nil
390
- result << []
391
- else
392
- seen[current] = true
393
- result[-1] << current
394
- current = perm[current]
395
- end
396
- end
397
- result.pop
398
- result.select { |c| c.size > 1 }.map do |c|
399
- min_index = c.index(c.min)
400
- c[min_index..-1] + c[0...min_index]
401
- end
388
+ result << []
389
+ else
390
+ seen[current] = true
391
+ result[-1] << current
392
+ current = perm[current]
393
+ end
402
394
  end
403
-
404
- # Returns the signum of this Permutation instance.
405
- # It's -1 if this permutation is odd and 1 if it's
406
- # an even permutation.
407
- #
408
- # A permutation is odd if it can be represented by an odd number of
409
- # transpositions (cycles of length 2), or even if it can be represented of
410
- # an even number of transpositions.
411
- def signum
412
- s = 1
413
- cycles.each do |c|
414
- c.size % 2 == 0 and s *= -1
415
- end
416
- s
395
+ result.pop
396
+ result.select { |c| c.size > 1 }.map do |c|
397
+ min_index = c.index(c.min)
398
+ c[min_index..-1] + c[0...min_index]
417
399
  end
400
+ end
401
+
402
+ # Returns the signum of this Permutation instance.
403
+ # It's -1 if this permutation is odd and 1 if it's
404
+ # an even permutation.
405
+ #
406
+ # A permutation is odd if it can be represented by an odd number of
407
+ # transpositions (cycles of length 2), or even if it can be represented of
408
+ # an even number of transpositions.
409
+ def signum
410
+ s = 1
411
+ cycles.each do |c|
412
+ c.size % 2 == 0 and s *= -1
413
+ end
414
+ s
415
+ end
418
416
 
419
- alias sgn signum
417
+ alias sgn signum
420
418
 
421
- # Returns true if this permutation is even, false otherwise.
422
- def even?
423
- signum == 1
424
- end
419
+ # Returns true if this permutation is even, false otherwise.
420
+ def even?
421
+ signum == 1
422
+ end
425
423
 
426
- # Returns true if this permutation is odd, false otherwise.
427
- def odd?
428
- signum == -1
429
- end
424
+ # Returns true if this permutation is odd, false otherwise.
425
+ def odd?
426
+ signum == -1
427
+ end
430
428
 
431
- private
429
+ private
432
430
 
433
- @@fcache = [ 1 ]
431
+ @@fcache = [ 1 ]
434
432
 
435
- def factorial(n)
436
- @@fcache.size.upto(n) { |i| @@fcache[i] = i * @@fcache[i - 1] }
437
- @@fcache[n]
438
- end
433
+ def factorial(n)
434
+ @@fcache.size.upto(n) { |i| @@fcache[i] = i * @@fcache[i - 1] }
435
+ @@fcache[n]
436
+ end
439
437
 
440
- def rank_indices(p)
441
- result = 0
442
- for i in 0...size
443
- result += p[i] * factorial(size - i - 1)
444
- for j in (i + 1)...size
445
- p[j] -= 1 if p[j] > p[i]
446
- end
447
- end
448
- result
438
+ def rank_indices(p)
439
+ result = 0
440
+ for i in 0...size
441
+ result += p[i] * factorial(size - i - 1)
442
+ for j in (i + 1)...size
443
+ p[j] -= 1 if p[j] > p[i]
444
+ end
449
445
  end
450
-
451
- def unrank_indices(m)
452
- result = Array.new(size, 0)
453
- for i in 0...size
454
- f = factorial(i)
455
- x = m % (f * (i + 1))
456
- m -= x
457
- x /= f
458
- result[size - i - 1] = x
459
- x -= 1
460
- for j in (size - i)...size
461
- result[j] += 1 if result[j] > x
462
- end
463
- end
464
- result
446
+ result
447
+ end
448
+
449
+ def unrank_indices(m)
450
+ result = Array.new(size, 0)
451
+ for i in 0...size
452
+ f = factorial(i)
453
+ x = m % (f * (i + 1))
454
+ m -= x
455
+ x /= f
456
+ result[size - i - 1] = x
457
+ x -= 1
458
+ for j in (size - i)...size
459
+ result[j] += 1 if result[j] > x
460
+ end
465
461
  end
462
+ result
463
+ end
466
464
  end
467
- # vim: set et sw=4 ts=4:
465
+ # vim: set et sw=4 ts=4:
@@ -1,6 +1,6 @@
1
1
  class Permutation
2
2
  # Permutation version
3
- VERSION = '0.1.5'
3
+ VERSION = '0.1.6'
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:
File without changes
metadata CHANGED
@@ -1,62 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
4
2
  name: permutation
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.5
7
- date: 2007-04-17 00:00:00 +02:00
8
- summary: Permutation library in pure Ruby
9
- require_paths:
10
- - lib
11
- email: flori@ping.de
12
- homepage: http://permutation.rubyforge.org
13
- rubyforge_project: permutation
14
- description: Library to perform different operations with permutations of sequences (strings, arrays, etc.)
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.1.6
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Florian Frank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-01 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Library to perform different operations with permutations of sequences (strings, arrays, etc.)
17
+ email: flori@ping.de
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - lib/permutation/version.rb
24
+ - lib/permutation.rb
31
25
  files:
32
- - VERSION
33
- - GPL
34
- - README.en
35
26
  - install.rb
36
- - Rakefile
37
- - examples
38
27
  - lib
39
- - test
40
- - CHANGES
41
- - examples/tsp.rb
42
- - lib/permutation.rb
43
28
  - lib/permutation
44
29
  - lib/permutation/version.rb
30
+ - lib/permutation.rb
31
+ - CHANGES
32
+ - README.en
33
+ - VERSION
34
+ - test
45
35
  - test/test.rb
46
- test_files:
47
- - test/test.rb
36
+ - Rakefile
37
+ - GPL
38
+ - examples
39
+ - examples/tsp.rb
40
+ has_rdoc: true
41
+ homepage: http://permutation.rubyforge.org
42
+ post_install_message:
48
43
  rdoc_options:
49
44
  - --title
50
45
  - Permutation
51
46
  - --line-numbers
52
- extra_rdoc_files:
53
- - lib/permutation.rb
54
- - lib/permutation/version.rb
55
- executables: []
56
-
57
- extensions: []
58
-
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
59
61
  requirements: []
60
62
 
61
- dependencies: []
62
-
63
+ rubyforge_project: permutation
64
+ rubygems_version: 1.3.1
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: Permutation library in pure Ruby
68
+ test_files:
69
+ - test/test.rb