magician 0.1.1 → 0.2.0
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.
- data/.document +1 -0
- data/CHANGELOG.md +19 -0
- data/README.md +34 -4
- data/VERSION +1 -1
- data/lib/magician/array.rb +39 -23
- data/lib/magician/integer.rb +5 -16
- data/lib/magician/numeric.rb +14 -2
- data/magician.gemspec +3 -2
- data/spec/array_spec.rb +20 -0
- data/spec/integer_spec.rb +0 -10
- data/spec/numeric_spec.rb +13 -0
- metadata +4 -3
data/.document
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
## 0.2.0
|
2
|
+
- Create this changelog
|
3
|
+
- Add examples to the readme, along with a link to magician's docs
|
4
|
+
- Minor code style improvements
|
5
|
+
- Move the divisible? instance method from Integer to Numeric so it can be used
|
6
|
+
on more types of numbers
|
7
|
+
- New Array#numerics instance method
|
8
|
+
- Several of Array's instance methods will now intelligently filter out
|
9
|
+
non-numbers so that these methods can be used with arrays that don't just
|
10
|
+
contain Numeric objects
|
11
|
+
|
12
|
+
## 0.1.1
|
13
|
+
- Minor code style improvements
|
14
|
+
- Improved documentation
|
15
|
+
- Fix spelling errors
|
16
|
+
- Document all nil returns
|
17
|
+
|
18
|
+
## 0.1.0
|
19
|
+
- Initial release
|
data/README.md
CHANGED
@@ -2,8 +2,40 @@
|
|
2
2
|
|
3
3
|
A suite of handy methods for doing calculations in irb.
|
4
4
|
|
5
|
+
For detailed documentation, see
|
6
|
+
[magician on RubyDoc.info](http://rubydoc.info/github/thenickperson/magician/frames).
|
7
|
+
|
8
|
+
## Examples
|
9
|
+
```ruby
|
10
|
+
>> require 'magician'
|
11
|
+
=> true
|
12
|
+
>> [1,2,3].sum
|
13
|
+
=> 6
|
14
|
+
>> [1,2,3].mean
|
15
|
+
=> 2.0
|
16
|
+
>> [1,100,5].range
|
17
|
+
=> 99
|
18
|
+
>> [1,2,2,3,3,3].occurences
|
19
|
+
=> {1=>1, 2=>2, 3=>3}
|
20
|
+
>> 6.factors
|
21
|
+
=> [1, 2, 3, 6]
|
22
|
+
>> 6.divisible? 3
|
23
|
+
=> true
|
24
|
+
>> 7.prime?
|
25
|
+
=> true
|
26
|
+
>> 5.factorial
|
27
|
+
=> 120
|
28
|
+
>> Math.combinations(10,5)
|
29
|
+
=> 252
|
30
|
+
>> Math.triplet?(3,4,5)
|
31
|
+
=> true
|
32
|
+
>> Math.quadratic(2,1,0)
|
33
|
+
=> [-0.5, 0.0]
|
34
|
+
>> 'racecar'.palindrome?
|
35
|
+
=> true
|
36
|
+
```
|
37
|
+
|
5
38
|
## Contributing to magician
|
6
|
-
|
7
39
|
- Check out the latest master to make sure the feature hasn't been implemented
|
8
40
|
or the bug hasn't been fixed yet.
|
9
41
|
- Check out the issue tracker to make sure someone already hasn't requested it
|
@@ -18,6 +50,4 @@ A suite of handy methods for doing calculations in irb.
|
|
18
50
|
isolate to its own commit so I can cherry-pick around it.
|
19
51
|
|
20
52
|
## Copyright
|
21
|
-
|
22
|
-
Copyright (c) 2012 Nicolas McCurdy. See LICENSE.txt for
|
23
|
-
further details.
|
53
|
+
Copyright (c) 2012 Nicolas McCurdy. See LICENSE.txt for further details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/magician/array.rb
CHANGED
@@ -1,53 +1,69 @@
|
|
1
1
|
# Magician's extensions to the Array class.
|
2
2
|
class Array
|
3
3
|
|
4
|
-
#
|
4
|
+
# Returns all numbers from the array, in order. This is done by choosing all
|
5
|
+
# objects from the array that are instances of Numeric or one of its
|
6
|
+
# subclasses.
|
7
|
+
#
|
8
|
+
# @return [Array] a new array containing only Numerics
|
9
|
+
def numerics
|
10
|
+
select { |item| item.class <= Numeric }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Gets the sum of the numbers in the array. The sum of an array with no
|
14
|
+
# numbers is 0.
|
5
15
|
#
|
6
16
|
# @return [Numeric] the sum of the numbers in the array
|
7
17
|
def sum
|
8
|
-
|
9
|
-
|
18
|
+
nums = numerics
|
19
|
+
return 0 if nums.empty?
|
20
|
+
nums.inject(:+)
|
10
21
|
end
|
11
22
|
|
12
|
-
# Gets the product of the numbers in the array. The product of an
|
13
|
-
# is 1.
|
23
|
+
# Gets the product of the numbers in the array. The product of an array with
|
24
|
+
# no numbers is 1.
|
14
25
|
#
|
15
26
|
# @return [Numeric] the product of the numbers in the array
|
16
27
|
def product
|
17
|
-
|
18
|
-
|
28
|
+
nums = numerics
|
29
|
+
return 1 if nums.empty?
|
30
|
+
nums.inject(:*)
|
19
31
|
end
|
20
32
|
|
21
33
|
# Gets the range of the numbers in the array (maximum - minimum). The range of
|
22
|
-
# an
|
34
|
+
# an array with no numbers is nil.
|
23
35
|
#
|
24
36
|
# @return [Numeric] the range of the numbers in the array
|
25
37
|
def range
|
26
|
-
|
27
|
-
|
38
|
+
nums = numerics
|
39
|
+
return nil if nums.empty?
|
40
|
+
nums.max - nums.min
|
28
41
|
end
|
29
42
|
|
30
|
-
# Gets the mean (average) of the numbers in the array. The mean of an
|
31
|
-
#
|
43
|
+
# Gets the mean (average) of the numbers in the array. The mean of an array
|
44
|
+
# with no numbers is nil.
|
32
45
|
#
|
33
46
|
# @return [Float] the mean (average) of the numbers in the array
|
34
47
|
def mean
|
35
|
-
|
36
|
-
|
48
|
+
nums = numerics
|
49
|
+
return nil if nums.empty?
|
50
|
+
nums.sum.to_f / nums.size
|
37
51
|
end
|
38
52
|
|
39
53
|
# Gets the median of the numbers in the array (the value in the middle of a
|
40
|
-
# sorted version of the array). If the array has an even
|
41
|
-
# two
|
54
|
+
# sorted version of the array, numbers only). If the array has an even number
|
55
|
+
# of numbers, the middle two numbers will be averaged. The median of an array
|
56
|
+
# with no numbers is nil.
|
42
57
|
#
|
43
58
|
# @return [Numeric] the median of the numbers in the array
|
44
59
|
def median
|
45
|
-
|
46
|
-
|
60
|
+
nums = numerics
|
61
|
+
return nil if nums.empty?
|
62
|
+
sorted = nums.sort
|
47
63
|
if sorted.length.odd?
|
48
|
-
|
64
|
+
nums[nums.length/2]
|
49
65
|
else
|
50
|
-
(
|
66
|
+
(nums[nums.length/2-1] + nums[nums.length/2]) / 2.0
|
51
67
|
end
|
52
68
|
end
|
53
69
|
|
@@ -57,7 +73,7 @@ class Array
|
|
57
73
|
# @return [Array] an array of all of the items in the array that occur the
|
58
74
|
# most frequently (they must all have the same number of occurrences)
|
59
75
|
def mode
|
60
|
-
return nil if
|
76
|
+
return nil if empty?
|
61
77
|
occ = occurences
|
62
78
|
max_occ = occ.values.max
|
63
79
|
occ.select { |key, value| value == max_occ }.keys
|
@@ -72,8 +88,8 @@ class Array
|
|
72
88
|
# array
|
73
89
|
def occurences
|
74
90
|
occurences = {}
|
75
|
-
|
76
|
-
|
91
|
+
each { |item| occurences[item] = 0 }
|
92
|
+
each { |item| occurences[item] += 1 }
|
77
93
|
occurences
|
78
94
|
end
|
79
95
|
|
data/lib/magician/integer.rb
CHANGED
@@ -9,12 +9,12 @@ class Integer
|
|
9
9
|
# order, including 1 and the integer itself)
|
10
10
|
def factors
|
11
11
|
return nil if self == 0
|
12
|
-
return [1] if
|
12
|
+
return [1] if abs == 1
|
13
13
|
#first half
|
14
14
|
factors = []
|
15
|
-
for i in 1..
|
16
|
-
if
|
17
|
-
if i <
|
15
|
+
for i in 1..abs
|
16
|
+
if abs % i == 0
|
17
|
+
if i < abs/i
|
18
18
|
factors << i
|
19
19
|
else break
|
20
20
|
end
|
@@ -23,7 +23,7 @@ class Integer
|
|
23
23
|
#second half
|
24
24
|
factors_old = factors.dup
|
25
25
|
until factors_old.length == 0
|
26
|
-
factors <<
|
26
|
+
factors << abs/factors_old.pop
|
27
27
|
end
|
28
28
|
factors
|
29
29
|
end
|
@@ -52,15 +52,4 @@ class Integer
|
|
52
52
|
true
|
53
53
|
end
|
54
54
|
|
55
|
-
# Returns true if the integer is evenly divisible by n. If n is 0, it returns
|
56
|
-
# false, since numbers cannot be divided by 0 in real number arithmetic.
|
57
|
-
#
|
58
|
-
# @param [Numeric] n the number the integer should be divided by
|
59
|
-
#
|
60
|
-
# @return [Boolean] true if the integer is evenly divisible by n
|
61
|
-
def divisible? n
|
62
|
-
return false if n.zero?
|
63
|
-
(self % n).zero?
|
64
|
-
end
|
65
|
-
|
66
55
|
end
|
data/lib/magician/numeric.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
# Magician's extensions to the Numeric class (affects Integers and Floats).
|
2
2
|
class Numeric
|
3
3
|
|
4
|
-
#
|
4
|
+
# Returns true if the number is evenly divisible by n. If n is equal to 0, it
|
5
|
+
# returns false, since numbers cannot be divided by 0 in real number
|
6
|
+
# arithmetic.
|
7
|
+
#
|
8
|
+
# @param [Numeric] n the number that this number (self) should be divided by
|
9
|
+
#
|
10
|
+
# @return [Boolean] true if the number is evenly divisible by n
|
11
|
+
def divisible? n
|
12
|
+
return false if n.zero?
|
13
|
+
(self % n).zero?
|
14
|
+
end
|
15
|
+
|
16
|
+
# Performs to_s[selection].to_i on the number. Note that for floats, the
|
5
17
|
# decimal counts as a digit within the string.
|
6
18
|
# TODO: Let this intelligently convert back to an Integer or Float.
|
7
19
|
#
|
@@ -11,7 +23,7 @@ class Numeric
|
|
11
23
|
# @return [Integer] substring of the number (using []), converted to an
|
12
24
|
# Integer
|
13
25
|
def digits selection
|
14
|
-
|
26
|
+
to_s[selection].to_i
|
15
27
|
end
|
16
28
|
|
17
29
|
end
|
data/magician.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "magician"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nicolas McCurdy"]
|
12
|
-
s.date = "2012-12-
|
12
|
+
s.date = "2012-12-03"
|
13
13
|
s.description = "A suite of handy methods for doing calculations in irb."
|
14
14
|
s.email = "thenickperson@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
".document",
|
21
21
|
".rspec",
|
22
22
|
".travis.yml",
|
23
|
+
"CHANGELOG.md",
|
23
24
|
"Gemfile",
|
24
25
|
"LICENSE.txt",
|
25
26
|
"README.md",
|
data/spec/array_spec.rb
CHANGED
@@ -2,28 +2,43 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe Array do
|
4
4
|
|
5
|
+
it 'should return all of its Numerics in order' do
|
6
|
+
[1, 2.0, -3].numerics.should == [1, 2.0, -3]
|
7
|
+
['string'].numerics.should == []
|
8
|
+
[].numerics.should == []
|
9
|
+
[1, 'two', 3, 'four'].numerics.should == [1, 3]
|
10
|
+
end
|
11
|
+
|
5
12
|
it 'should calculate its sum' do
|
6
13
|
[].sum.should == 0
|
14
|
+
['string'].sum.should == 0
|
7
15
|
[1].sum.should == 1
|
16
|
+
['string', 1].sum.should == 1
|
8
17
|
[1, 2, 3, 4].sum.should == 10
|
9
18
|
[-4, 0, 5].sum.should == 1
|
10
19
|
end
|
11
20
|
|
12
21
|
it 'should calculate its product' do
|
13
22
|
[].product.should == 1
|
23
|
+
['string'].product.should == 1
|
14
24
|
[1].product.should == 1
|
25
|
+
['string', 1].product.should == 1
|
15
26
|
[5, 7, 2].product.should == 70
|
16
27
|
end
|
17
28
|
|
18
29
|
it 'should calculate its range' do
|
19
30
|
[].range.should == nil
|
31
|
+
['string'].range.should == nil
|
20
32
|
[4].range.should == 0
|
33
|
+
['string', 4].range.should == 0
|
21
34
|
[5, 1, 10].range.should == 9
|
22
35
|
end
|
23
36
|
|
24
37
|
it 'should calculate its mean' do
|
25
38
|
[].mean.should == nil
|
39
|
+
['string'].mean.should == nil
|
26
40
|
[4].mean.should == 4
|
41
|
+
['string', 4].mean.should == 4
|
27
42
|
[-3, 0, 6].mean.should == 1
|
28
43
|
[1, 2, 3, 4, 5].mean.should == 3
|
29
44
|
end
|
@@ -31,20 +46,25 @@ describe Array do
|
|
31
46
|
it 'should calculate its median' do
|
32
47
|
[].median.should == nil
|
33
48
|
[4].median.should == 4.0
|
49
|
+
['string', 4].median.should == 4.0
|
34
50
|
[2, 1, 3, 5, 4].median.should == 3.0
|
35
51
|
[1, 2, 3, 4].median.should == 2.5
|
36
52
|
end
|
37
53
|
|
38
54
|
it 'should calculate its mode' do
|
39
55
|
[].mode.should == nil
|
56
|
+
['string'].mode.should == ['string']
|
40
57
|
[4].mode.should == [4]
|
58
|
+
['string', 4].mode.should == ['string',4]
|
41
59
|
[1, 2, 1, 3, 1, 4].mode.should == [1]
|
42
60
|
[1, 1, 1, 2, 2, 2, 3].mode.should == [1, 2]
|
43
61
|
end
|
44
62
|
|
45
63
|
it 'should calculate a hash holding numbers of occurrences of its items' do
|
46
64
|
[].occurences.should == {}
|
65
|
+
['string'].occurences.should == { 'string'=>1 }
|
47
66
|
[4].occurences.should == { 4=>1 }
|
67
|
+
['string', 4].occurences.should == { 'string'=>1, 4=>1 }
|
48
68
|
[1, 2, 2, 5].occurences.should == { 1=>1, 2=>2, 5=>1 }
|
49
69
|
end
|
50
70
|
|
data/spec/integer_spec.rb
CHANGED
@@ -32,14 +32,4 @@ describe Integer do
|
|
32
32
|
-6.prime?.should be_false
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'should determine if it is divisible by another number' do
|
36
|
-
0.divisible?(5).should be_true
|
37
|
-
1.divisible?(6).should be_false
|
38
|
-
-1.divisible?(1).should be_true
|
39
|
-
12.divisible?(6).should be_true
|
40
|
-
6.divisible?(5).should be_false
|
41
|
-
9.divisible?(1.5).should be_true
|
42
|
-
10.divisible?(0).should be_false
|
43
|
-
end
|
44
|
-
|
45
35
|
end
|
data/spec/numeric_spec.rb
CHANGED
@@ -2,6 +2,19 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe Numeric do
|
4
4
|
|
5
|
+
it 'should determine if it is divisible by another number' do
|
6
|
+
0.divisible?(5).should be_true
|
7
|
+
1.divisible?(6).should be_false
|
8
|
+
-1.divisible?(1).should be_true
|
9
|
+
12.divisible?(6).should be_true
|
10
|
+
6.divisible?(5).should be_false
|
11
|
+
10.divisible?(0).should be_false
|
12
|
+
9.divisible?(1.5).should be_true
|
13
|
+
9.0.divisible?(1.5).should be_true
|
14
|
+
10.5.divisible?(1.5).should be_true
|
15
|
+
10.5.divisible?(1).should be_false
|
16
|
+
end
|
17
|
+
|
5
18
|
it 'should grab specific digits from different numbers' do
|
6
19
|
Math::PI.digits(0..-1).should == 3
|
7
20
|
12345.digits(0..2).should == 123
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magician
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- .document
|
119
119
|
- .rspec
|
120
120
|
- .travis.yml
|
121
|
+
- CHANGELOG.md
|
121
122
|
- Gemfile
|
122
123
|
- LICENSE.txt
|
123
124
|
- README.md
|
@@ -153,7 +154,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
154
|
version: '0'
|
154
155
|
segments:
|
155
156
|
- 0
|
156
|
-
hash: -
|
157
|
+
hash: -956776375334094677
|
157
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
159
|
none: false
|
159
160
|
requirements:
|