epitools 0.5.58 → 0.5.59
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/epitools/core_ext/enumerable.rb +15 -0
- data/lib/epitools/core_ext/numbers.rb +41 -3
- data/lib/epitools/core_ext/string.rb +4 -3
- data/spec/core_ext_spec.rb +34 -4
- data/spec/term_spec.rb +14 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9003ca555f667ebc3547afdcbe332b0718cb3e0
|
4
|
+
data.tar.gz: 83d00e82dc95355773c1f34744c6a1f24290f808
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 776eca2bf207c715ef1ec9a0fa213e216bc640b152b356841b6873a8ecf66c2e0d0d5ca7a786f38c4b16edca14676f29a73644b7b82d38df31145938623e8071
|
7
|
+
data.tar.gz: 5400b2ad213c76e4e297838143af5c43010bd8c485aee789479b530b89781d73303b21ed784ec4cae2e1c67c7937c818f11057dda6ab44129465e9aaf794f2d7
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.59
|
@@ -289,6 +289,21 @@ module Enumerable
|
|
289
289
|
result
|
290
290
|
end
|
291
291
|
|
292
|
+
|
293
|
+
#
|
294
|
+
# See: Array#permutation
|
295
|
+
#
|
296
|
+
def permutation(*args, &block)
|
297
|
+
to_a.permutation(*args, &block)
|
298
|
+
end
|
299
|
+
|
300
|
+
#
|
301
|
+
# See: See Array#combination
|
302
|
+
#
|
303
|
+
def combination(*args, &block)
|
304
|
+
to_a.combination(*args, &block)
|
305
|
+
end
|
306
|
+
|
292
307
|
#
|
293
308
|
# Returns the powerset of the Enumerable
|
294
309
|
#
|
@@ -123,6 +123,46 @@ class Numeric
|
|
123
123
|
end
|
124
124
|
|
125
125
|
|
126
|
+
#
|
127
|
+
# Combinations: compute "n choose r" (self.choose(r))
|
128
|
+
#
|
129
|
+
# This represents number of ways to pick "r" items from a collection of "self"
|
130
|
+
# items (where the order of the items doesn't matter, and items can't be repeated.)
|
131
|
+
#
|
132
|
+
# eg: 49.choose(6) is how many ways can we pick 6 lottery numbers from a set of 49.
|
133
|
+
#
|
134
|
+
# Formula: n! / (r! * (n-r)!) == n * n-1 * ... * n-r / r * r-1 * ... * 2
|
135
|
+
#
|
136
|
+
def choose(r)
|
137
|
+
(self-r+1..self).reduce(:*) / (2..r).reduce(:*)
|
138
|
+
end
|
139
|
+
alias_method :combinations, :choose
|
140
|
+
|
141
|
+
#
|
142
|
+
# Permutations: compute "n P r"
|
143
|
+
#
|
144
|
+
# This represents number of ways to pick "r" items from a collection of "self"
|
145
|
+
# items (where the order of the items DOES matter, and items can't be repeated.)
|
146
|
+
#
|
147
|
+
# eg: 23.perm(3) is how many ways 23 people can win 1st, 2nd and 3rd place in a race.
|
148
|
+
#
|
149
|
+
# Formula: n! / (n - r)!
|
150
|
+
#
|
151
|
+
def perms(r)
|
152
|
+
(self-r+1..self).reduce(:*)
|
153
|
+
end
|
154
|
+
alias_method :permutations, :perms
|
155
|
+
|
156
|
+
#
|
157
|
+
# Multiply self by n, returning the integer product and the floating point remainder.
|
158
|
+
#
|
159
|
+
def mulmod(n)
|
160
|
+
prod = self * n
|
161
|
+
intprod = prod.to_i
|
162
|
+
|
163
|
+
[intprod, prod % intprod]
|
164
|
+
end
|
165
|
+
|
126
166
|
# Math.log is different in 1.8
|
127
167
|
if RUBY_VERSION["1.8"]
|
128
168
|
|
@@ -281,9 +321,7 @@ class Integer
|
|
281
321
|
# Factorial (iterated style)
|
282
322
|
#
|
283
323
|
def fact
|
284
|
-
|
285
|
-
self.downto(2) { |x| total *= x }
|
286
|
-
total
|
324
|
+
(2..self).reduce(:*)
|
287
325
|
end
|
288
326
|
alias_method :factorial, :fact
|
289
327
|
|
@@ -147,15 +147,16 @@ class String
|
|
147
147
|
end
|
148
148
|
|
149
149
|
#
|
150
|
-
# Indent all the lines
|
150
|
+
# Indent all the lines, if "prefix" is a string, prepend that string
|
151
|
+
# to each lien. If it's an integer, prepend that many spaces.
|
151
152
|
#
|
152
|
-
def indent(prefix=" "
|
153
|
+
def indent(prefix=" ")
|
153
154
|
prefix = (" " * prefix) if prefix.is_an? Integer
|
154
155
|
|
155
156
|
if block_given?
|
156
157
|
lines.each { |line| yield prefix + line }
|
157
158
|
else
|
158
|
-
lines.
|
159
|
+
lines.map { |line| prefix + line }.join('')
|
159
160
|
end
|
160
161
|
end
|
161
162
|
|
data/spec/core_ext_spec.rb
CHANGED
@@ -67,8 +67,8 @@ describe Object do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
it "nots" do
|
70
|
-
10.should
|
71
|
-
10.not.
|
70
|
+
10.even?.should == true
|
71
|
+
10.not.even?.should == false
|
72
72
|
end
|
73
73
|
|
74
74
|
it "alias_class_methods" do
|
@@ -234,8 +234,10 @@ describe String do
|
|
234
234
|
end
|
235
235
|
|
236
236
|
it "indents" do
|
237
|
-
s
|
238
|
-
|
237
|
+
s = "Some things\nNeed indenting\nSo, you indent them!\n"
|
238
|
+
indented_2 = " Some things\n Need indenting\n So, you indent them!\n"
|
239
|
+
|
240
|
+
s.indent(2).should == indented_2
|
239
241
|
end
|
240
242
|
|
241
243
|
it "titlecases" do
|
@@ -302,6 +304,25 @@ describe String do
|
|
302
304
|
e.to_a.should == %w[he ll ot he re !]
|
303
305
|
end
|
304
306
|
|
307
|
+
it "n choose r" do
|
308
|
+
n = 49
|
309
|
+
r = 6
|
310
|
+
|
311
|
+
n.choose(r).should == n.fact / (r.fact * (n-r).fact)
|
312
|
+
end
|
313
|
+
|
314
|
+
it "n perms r" do
|
315
|
+
n = 23
|
316
|
+
r = 3
|
317
|
+
|
318
|
+
n.perms(r).should == (n.fact / (n-r).fact)
|
319
|
+
end
|
320
|
+
|
321
|
+
it "mulmods" do
|
322
|
+
1.25.mulmod(2).should == [2, 0.5]
|
323
|
+
5.mulmod(2).should == [10, 0]
|
324
|
+
end
|
325
|
+
|
305
326
|
end
|
306
327
|
|
307
328
|
|
@@ -510,6 +531,15 @@ describe Enumerable do
|
|
510
531
|
[:a, :b, :c].to_enum.includes?(5).should == false
|
511
532
|
end
|
512
533
|
|
534
|
+
it "permutatitons and combinations" do
|
535
|
+
10.times.permutation(2).to_a.should == 10.times.to_a.permutation(2).to_a
|
536
|
+
10.times.combination(2).to_a.should == 10.times.to_a.combination(2).to_a
|
537
|
+
|
538
|
+
result = []
|
539
|
+
10.times.permutation(2) { |perm| result << perm }
|
540
|
+
result.should == 10.times.permutation(2).to_a
|
541
|
+
end
|
542
|
+
|
513
543
|
end
|
514
544
|
|
515
545
|
describe Enumerator do
|
data/spec/term_spec.rb
CHANGED
@@ -26,20 +26,20 @@ describe Term do
|
|
26
26
|
table.by_columns.should_not be_nil
|
27
27
|
table.by_rows.should_not be_nil
|
28
28
|
|
29
|
-
Term::Table do |table|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
Term::Table[
|
40
|
-
|
41
|
-
|
42
|
-
]
|
29
|
+
# Term::Table do |table|
|
30
|
+
# 100.times do |n|
|
31
|
+
# table.row do
|
32
|
+
# col "#{n}."
|
33
|
+
# col "A" * rand(10)
|
34
|
+
# col "B" * rand(10)
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
|
39
|
+
# Term::Table[
|
40
|
+
# [1,2,3],
|
41
|
+
# [4,5,6]
|
42
|
+
# ]
|
43
43
|
|
44
44
|
table = Term::Table.new
|
45
45
|
table.rows = [ [1,2,3], [4,5,6] ]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epitools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.59
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- epitron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|