epitools 0.5.58 → 0.5.59
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.
- 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
|