ruby-nuggets 0.0.4.171 → 0.0.5.179
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/lib/nuggets/array/shuffle.rb +77 -1
- data/lib/nuggets/array/to_hash.rb +57 -11
- data/lib/nuggets/integer/factorial.rb +47 -0
- data/lib/nuggets/object/blank.rb +2 -2
- data/lib/nuggets/proc/bind.rb +1 -1
- data/lib/nuggets/version.rb +1 -1
- metadata +6 -5
data/README
CHANGED
@@ -30,11 +30,28 @@ class Array
|
|
30
30
|
# call-seq:
|
31
31
|
# array.shuffle => new_array
|
32
32
|
#
|
33
|
-
# Shuffles _array_ in random order.
|
33
|
+
# Shuffles _array_ in random order. Select a different shuffling algorithm:
|
34
|
+
# <tt>Array.send(:alias_method, :shuffle, :shuffle_kfy)</tt>.
|
34
35
|
def shuffle
|
35
36
|
sort_by { Kernel.rand }
|
36
37
|
end
|
37
38
|
|
39
|
+
# call-seq:
|
40
|
+
# array.shuffle_knuth => new_array
|
41
|
+
#
|
42
|
+
# Non-destructive version of #shuffle_knuth!.
|
43
|
+
def shuffle_knuth
|
44
|
+
dup.shuffle_knuth!
|
45
|
+
end
|
46
|
+
|
47
|
+
# call-seq:
|
48
|
+
# array.shuffle_kfy => new_array
|
49
|
+
#
|
50
|
+
# Non-destructive version of #shuffle_kfy!.
|
51
|
+
def shuffle_kfy
|
52
|
+
dup.shuffle_kfy!
|
53
|
+
end
|
54
|
+
|
38
55
|
# call-seq:
|
39
56
|
# array.shuffle! => array
|
40
57
|
#
|
@@ -43,6 +60,32 @@ class Array
|
|
43
60
|
replace shuffle
|
44
61
|
end
|
45
62
|
|
63
|
+
# call-seq:
|
64
|
+
# array.shuffle_knuth! => array
|
65
|
+
#
|
66
|
+
# Shuffles _array_ in random order using Knuth's algorithm.
|
67
|
+
def shuffle_knuth!
|
68
|
+
0.upto(length - 2) { |i|
|
69
|
+
n = i + rand(length - i)
|
70
|
+
self[i], self[n] = self[n], self[i]
|
71
|
+
}
|
72
|
+
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
# call-seq:
|
77
|
+
# array.shuffle_kfy! => array
|
78
|
+
#
|
79
|
+
# Shuffles _array_ in random order using the Knuth-Fisher-Yates algorithm.
|
80
|
+
def shuffle_kfy!
|
81
|
+
(length - 1).downto(0) { |i|
|
82
|
+
n = rand(i + 1)
|
83
|
+
self[n], self[i] = self[i], self[n]
|
84
|
+
}
|
85
|
+
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
46
89
|
end
|
47
90
|
|
48
91
|
if $0 == __FILE__
|
@@ -52,6 +95,39 @@ if $0 == __FILE__
|
|
52
95
|
p a.shuffle
|
53
96
|
p a.shuffle
|
54
97
|
|
98
|
+
p a.shuffle_knuth
|
99
|
+
p a.shuffle_kfy
|
100
|
+
|
55
101
|
a.shuffle!
|
56
102
|
p a
|
103
|
+
|
104
|
+
require File.join(File.dirname(__FILE__), '..', 'integer', 'factorial')
|
105
|
+
require File.join(File.dirname(__FILE__), '..', 'enumerable', 'minmax')
|
106
|
+
|
107
|
+
a = %w[a b c]
|
108
|
+
n = 100_000
|
109
|
+
m = a.length.f!
|
110
|
+
e = n / m.to_f
|
111
|
+
puts '%d / %d / %d / %.2f' % [a.length, n, m, e]
|
112
|
+
|
113
|
+
algorithms = %w[shuffle shuffle_knuth shuffle_kfy]
|
114
|
+
max = algorithms.max(:length)
|
115
|
+
|
116
|
+
algorithms.each { |algorithm|
|
117
|
+
score = Hash.new { |h, k| h[k] = 0 }
|
118
|
+
|
119
|
+
n.times {
|
120
|
+
score[a.send(algorithm)] += 1
|
121
|
+
}
|
122
|
+
|
123
|
+
x2 = 0
|
124
|
+
score.sort.each { |key, value|
|
125
|
+
x = value - e
|
126
|
+
y = x**2 / e
|
127
|
+
#puts '%s: %d (% .2f/%.2f)' % [key, value, x, y]
|
128
|
+
|
129
|
+
x2 += y
|
130
|
+
}
|
131
|
+
puts "%-#{max}s = %.2f (%.2f)" % [algorithm, x2, x2 / m]
|
132
|
+
}
|
57
133
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
5
|
# language. #
|
6
6
|
# #
|
7
|
-
# Copyright (C) 2007 Jens Wille
|
7
|
+
# Copyright (C) 2007-2008 Jens Wille #
|
8
8
|
# #
|
9
9
|
# Authors: #
|
10
10
|
# Jens Wille <jens.wille@uni-koeln.de> #
|
@@ -32,25 +32,63 @@ class Array
|
|
32
32
|
# call-seq:
|
33
33
|
# array.to_h => aHash
|
34
34
|
# array.to_h(value) => aHash
|
35
|
+
# array.to_h { |element| ... } => aHash
|
35
36
|
#
|
36
|
-
# If
|
37
|
-
#
|
38
|
-
#
|
37
|
+
# If neither +value+ nor block is given, converts _array_, taken as an
|
38
|
+
# array of key/value pairs, into a hash, preserving sub-arrays (Thus:
|
39
|
+
# <tt>hash.to_a.to_h == hash</tt>). Otherwise, maps each element of
|
40
|
+
# _array_ to +value+ or the result of the block.
|
41
|
+
#
|
42
|
+
# NOTE: This is the "nice" version. For a more speed-optimized one,
|
43
|
+
# use #to_hash_opt.
|
39
44
|
#
|
40
45
|
# Examples:
|
41
|
-
#
|
42
|
-
# %w[a b c d].to_h
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
# [[0, 0], [1, [2, 3]]].to_h #=> { 0 => 0, 1 => [2, 3] }
|
47
|
+
# %w[a b c d].to_h #=> { "a" => "b", "c" => "d" }
|
48
|
+
# %w[a b c d].to_h(1) #=> { "a" => 1, "b" => 1, "c" => 1, "d" => 1 }
|
49
|
+
# %w[a b].to_h { |e| e * 2 } #=> { "a" => "aa", "b" => "bb" }
|
50
|
+
def to_hash(value = default = Object.new, &block)
|
51
|
+
if block ||= value != default && lambda { value }
|
47
52
|
inject({}) { |hash, element|
|
48
|
-
hash.update(element =>
|
53
|
+
hash.update(element => block[element])
|
49
54
|
}
|
55
|
+
else
|
56
|
+
Hash[*flatten_once]
|
50
57
|
end
|
51
58
|
end
|
52
59
|
alias_method :to_h, :to_hash
|
53
60
|
|
61
|
+
# call-seq:
|
62
|
+
# array.to_h => aHash
|
63
|
+
# array.to_h(value) => aHash
|
64
|
+
# array.to_h { |element| ... } => aHash
|
65
|
+
#
|
66
|
+
# Same as #to_hash, but slightly optimized for speed. To use this one instead
|
67
|
+
# of #to_hash: <tt>Array.send(:alias_method, :to_h, :to_hash_opt)</tt>.
|
68
|
+
#
|
69
|
+
# Benchmark (array = (1..20).to_a, N = 100_000):
|
70
|
+
# user system total real
|
71
|
+
# to_hash: plain 4.820000 0.560000 5.380000 ( 5.600390)
|
72
|
+
# to_hash: value 12.910000 0.930000 13.840000 ( 13.938352)
|
73
|
+
# to_hash: block 13.590000 1.180000 14.770000 ( 14.810804)
|
74
|
+
# to_hash_opt: plain 4.910000 0.470000 5.380000 ( 5.416949)
|
75
|
+
# to_hash_opt: value 2.170000 0.390000 2.560000 ( 2.609034)
|
76
|
+
# to_hash_opt: block 7.090000 0.880000 7.970000 ( 8.109180)
|
77
|
+
def to_hash_opt(value = default = Object.new, &block)
|
78
|
+
if block
|
79
|
+
hash = {}
|
80
|
+
each { |element| hash[element] = block[element] }
|
81
|
+
hash
|
82
|
+
elsif value != default
|
83
|
+
hash = {}
|
84
|
+
each { |element| hash[element] = value }
|
85
|
+
hash
|
86
|
+
else
|
87
|
+
Hash[*flatten_once]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
#alias_method :to_h, :to_hash_opt
|
91
|
+
|
54
92
|
end
|
55
93
|
|
56
94
|
if $0 == __FILE__
|
@@ -64,5 +102,13 @@ if $0 == __FILE__
|
|
64
102
|
|
65
103
|
c = %w[a b c d]
|
66
104
|
p c
|
105
|
+
p c.to_h
|
67
106
|
p c.to_h(1)
|
107
|
+
p c.to_h { nil }
|
108
|
+
|
109
|
+
h = { :a => 1, :b => [2, 3], :c => { :d => 4}}
|
110
|
+
p h
|
111
|
+
p h.to_a
|
112
|
+
p h.to_a.to_h
|
113
|
+
p h.to_a.to_h == h
|
68
114
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2008 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU General Public License as published by the Free #
|
14
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
15
|
+
# any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
20
|
+
# more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU General Public License along #
|
23
|
+
# with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
class Integer
|
29
|
+
|
30
|
+
# call-seq:
|
31
|
+
# int.factorial => anInteger
|
32
|
+
#
|
33
|
+
# Calculate the factorial of +int+.
|
34
|
+
def factorial
|
35
|
+
(1..self).inject { |f, i| f * i }
|
36
|
+
end
|
37
|
+
|
38
|
+
alias_method :fac, :factorial
|
39
|
+
alias_method :f!, :factorial
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
if $0 == __FILE__
|
44
|
+
1.upto(8) { |i|
|
45
|
+
puts "#{i}: #{i.factorial}"
|
46
|
+
}
|
47
|
+
end
|
data/lib/nuggets/object/blank.rb
CHANGED
@@ -72,7 +72,7 @@ class Array
|
|
72
72
|
# call-seq:
|
73
73
|
# array.vain? => true or false
|
74
74
|
#
|
75
|
-
# Returns true if
|
75
|
+
# Returns true if all of _array_'s elements are themselves vain.
|
76
76
|
def vain?
|
77
77
|
blank? { |a| a.delete_if { |i| i.vain? } }
|
78
78
|
end
|
@@ -84,7 +84,7 @@ class Hash
|
|
84
84
|
# call-seq:
|
85
85
|
# hash.vain? => true or false
|
86
86
|
#
|
87
|
-
# Returns true if
|
87
|
+
# Returns true if all of _hash_'s values are themselves vain.
|
88
88
|
def vain?
|
89
89
|
blank? { |h| h.delete_if { |k, v| v.vain? } }
|
90
90
|
end
|
data/lib/nuggets/proc/bind.rb
CHANGED
data/lib/nuggets/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-nuggets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5.179
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Wille
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-01-
|
12
|
+
date: 2008-01-18 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,6 +24,7 @@ extra_rdoc_files:
|
|
24
24
|
- COPYING
|
25
25
|
- ChangeLog
|
26
26
|
files:
|
27
|
+
- lib/nuggets/integer/factorial.rb
|
27
28
|
- lib/nuggets/version.rb
|
28
29
|
- lib/nuggets/object/singleton_class.rb
|
29
30
|
- lib/nuggets/object/blank.rb
|
@@ -55,15 +56,15 @@ has_rdoc: true
|
|
55
56
|
homepage: http://prometheus.rubyforge.org/ruby-nuggets
|
56
57
|
post_install_message:
|
57
58
|
rdoc_options:
|
58
|
-
- --charset
|
59
|
-
- UTF-8
|
60
59
|
- --all
|
61
60
|
- --title
|
62
61
|
- ruby-nuggets Application documentation
|
62
|
+
- --line-numbers
|
63
63
|
- --main
|
64
64
|
- README
|
65
|
-
- --line-numbers
|
66
65
|
- --inline-source
|
66
|
+
- --charset
|
67
|
+
- UTF-8
|
67
68
|
require_paths:
|
68
69
|
- lib
|
69
70
|
required_ruby_version: !ruby/object:Gem::Requirement
|