numb 0.96.0 → 0.99.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/numb/aban.rb +5 -0
- data/lib/numb/eban.rb +5 -0
- data/lib/numb/words.rb +37 -0
- data/spec/numb/aban_spec.rb +15 -0
- data/spec/numb/eban_spec.rb +20 -0
- data/spec/numb/words_spec.rb +60 -0
- metadata +11 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.99.0
|
data/lib/numb/aban.rb
ADDED
data/lib/numb/eban.rb
ADDED
data/lib/numb/words.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
class Integer
|
2
|
+
WORDS = {
|
3
|
+
0 => 'zero', 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four',
|
4
|
+
5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine',
|
5
|
+
10 => 'ten', 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen',
|
6
|
+
14 => 'fourteen', 15 => 'fifteen', 16 => 'sixteen', 17 => 'seventeen',
|
7
|
+
18 => 'eighteen', 19 => 'nineteen', 20 => 'twenty', 30 => 'thirty',
|
8
|
+
40 => 'forty', 50 => 'fifty', 60 => 'sixty', 70 => 'seventy',
|
9
|
+
80 => 'eighty', 90 => 'ninety'
|
10
|
+
}
|
11
|
+
|
12
|
+
def words
|
13
|
+
return WORDS[0] if zero?
|
14
|
+
str = (place = places.to_a).map do |name, v|
|
15
|
+
next if v.zero?
|
16
|
+
case name
|
17
|
+
when :units then WORDS[v]
|
18
|
+
when :tens
|
19
|
+
units = place.pop.last
|
20
|
+
v == 1 ? WORDS[10 + units]
|
21
|
+
: WORDS[10 * v] + (units.zero? ? '' : ' ' + units.words)
|
22
|
+
else
|
23
|
+
v.words + ' ' + name.to_s[0..-2]
|
24
|
+
end
|
25
|
+
end.compact.join(', ')
|
26
|
+
str.include?(',') ? str.sub(/,([^,]+)$/,' and\1') : str
|
27
|
+
end
|
28
|
+
|
29
|
+
def places
|
30
|
+
n = self
|
31
|
+
{trillions: 10e11, billions: 10e8, millions: 10e5, thousands: 10e2,
|
32
|
+
hundreds: 10e1, tens: 10, units: 1}.map do |k,v|
|
33
|
+
v, n = n.divmod(v)
|
34
|
+
[k, v]
|
35
|
+
end.tap{|a| return Hash[a] }
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
describe Integer, "#aban?" do
|
2
|
+
@seq = [*(1..999), *(1_000_000..1_000_999)]
|
3
|
+
|
4
|
+
@seq.sample(100).each do |n|
|
5
|
+
it "returns true for aban number #{n}" do
|
6
|
+
n.should be_aban
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
@seq.to_seq.invert.sample(100).each do |n|
|
11
|
+
it "returns false for non-aban number #{n}" do
|
12
|
+
n.should_not be_aban
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe Integer, "#eban?" do
|
2
|
+
# A006933
|
3
|
+
@seq = [2,4,6,30,32,34,36,40,42,44,46,50,52,54,56,60,62,
|
4
|
+
64,66,2000,2002,2004,2006,2030,2032,2034,2036,
|
5
|
+
2040,2042,2044,2046,2050,2052,2054,2056,2060,2062,
|
6
|
+
2064,2066,4000,4002,4004,4006,4030,4032,4034,4036,
|
7
|
+
4040,4042,4044,4046,4050,4052,4054,4056]
|
8
|
+
|
9
|
+
@seq.each do |n|
|
10
|
+
it "returns true for eban number #{n}" do
|
11
|
+
n.should be_eban
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@seq.to_seq.invert.sample(100).each do |n|
|
16
|
+
it "returns false for non-eban number #{n}" do
|
17
|
+
n.should_not be_eban
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
describe Integer, "#words" do
|
2
|
+
@seq = {
|
3
|
+
0 => 'zero',
|
4
|
+
1 => 'one',
|
5
|
+
2 => 'two',
|
6
|
+
3 => 'three',
|
7
|
+
4 => 'four',
|
8
|
+
5 => 'five',
|
9
|
+
6 => 'six',
|
10
|
+
7 => 'seven',
|
11
|
+
8 => 'eight',
|
12
|
+
9 => 'nine',
|
13
|
+
10 => 'ten',
|
14
|
+
11 => 'eleven',
|
15
|
+
12 => 'twelve',
|
16
|
+
13 => 'thirteen',
|
17
|
+
14 => 'fourteen',
|
18
|
+
15 => 'fifteen',
|
19
|
+
16 => 'sixteen',
|
20
|
+
17 => 'seventeen',
|
21
|
+
18 => 'eighteen',
|
22
|
+
19 => 'nineteen',
|
23
|
+
20 => 'twenty',
|
24
|
+
24 => 'twenty four',
|
25
|
+
30 => 'thirty',
|
26
|
+
39 => 'thirty nine',
|
27
|
+
40 => 'forty',
|
28
|
+
42 => 'forty two',
|
29
|
+
50 => 'fifty',
|
30
|
+
56 => 'fifty six',
|
31
|
+
60 => 'sixty',
|
32
|
+
63 => 'sixty three',
|
33
|
+
70 => 'seventy',
|
34
|
+
71 => 'seventy one',
|
35
|
+
80 => 'eighty',
|
36
|
+
88 => 'eighty eight',
|
37
|
+
90 => 'ninety',
|
38
|
+
95 => 'ninety five',
|
39
|
+
100 => 'one hundred',
|
40
|
+
103 => 'one hundred and three',
|
41
|
+
140 => 'one hundred and forty',
|
42
|
+
155 => 'one hundred and fifty five',
|
43
|
+
199 => 'one hundred and ninety nine',
|
44
|
+
300 => 'three hundred',
|
45
|
+
712 => 'seven hundred and twelve',
|
46
|
+
1_000 => 'one thousand',
|
47
|
+
1_001 => 'one thousand and one',
|
48
|
+
30_333 => 'thirty thousand, three hundred and thirty three',
|
49
|
+
900_002 => 'nine hundred thousand and two',
|
50
|
+
1_000_000 => 'one million',
|
51
|
+
34_000_006 => 'thirty four million and six',
|
52
|
+
999_999_999 => 'nine hundred and ninety nine million, nine hundred and ninety nine thousand, nine hundred and ninety nine',
|
53
|
+
40_000_000_000 => 'forty billion',
|
54
|
+
}.each_pair do |n, name|
|
55
|
+
it "returns #{name} for #{n}" do
|
56
|
+
n.words.should == name
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.99.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Run Paint Run Run
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-13 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -39,6 +39,7 @@ files:
|
|
39
39
|
- Rakefile
|
40
40
|
- VERSION
|
41
41
|
- lib/numb.rb
|
42
|
+
- lib/numb/aban.rb
|
42
43
|
- lib/numb/abundancy.rb
|
43
44
|
- lib/numb/abundant.rb
|
44
45
|
- lib/numb/achilles.rb
|
@@ -73,6 +74,7 @@ files:
|
|
73
74
|
- lib/numb/dodecagonal.rb
|
74
75
|
- lib/numb/doubly_even.rb
|
75
76
|
- lib/numb/dudeney.rb
|
77
|
+
- lib/numb/eban.rb
|
76
78
|
- lib/numb/economical.rb
|
77
79
|
- lib/numb/emrip.rb
|
78
80
|
- lib/numb/equidigital.rb
|
@@ -186,8 +188,10 @@ files:
|
|
186
188
|
- lib/numb/weird.rb
|
187
189
|
- lib/numb/wieferich.rb
|
188
190
|
- lib/numb/woodall.rb
|
191
|
+
- lib/numb/words.rb
|
189
192
|
- lib/numb/zeisel.rb
|
190
193
|
- lib/numb/zerofree.rb
|
194
|
+
- spec/numb/aban_spec.rb
|
191
195
|
- spec/numb/abundancy_spec.rb
|
192
196
|
- spec/numb/abundant_spec.rb
|
193
197
|
- spec/numb/achilles_spec.rb
|
@@ -222,6 +226,7 @@ files:
|
|
222
226
|
- spec/numb/dodecagonal_spec.rb
|
223
227
|
- spec/numb/doubly_even_spec.rb
|
224
228
|
- spec/numb/dudeney_spec.rb
|
229
|
+
- spec/numb/eban_spec.rb
|
225
230
|
- spec/numb/economical_spec.rb
|
226
231
|
- spec/numb/emrip_spec.rb
|
227
232
|
- spec/numb/equidigital_spec.rb
|
@@ -334,6 +339,7 @@ files:
|
|
334
339
|
- spec/numb/weird_spec.rb
|
335
340
|
- spec/numb/wieferich_prime_spec.rb
|
336
341
|
- spec/numb/woodall_spec.rb
|
342
|
+
- spec/numb/words_spec.rb
|
337
343
|
- spec/numb/zeisel_spec.rb
|
338
344
|
- spec/numb/zerofree_spec.rb
|
339
345
|
- spec/spec.opts
|
@@ -404,9 +410,11 @@ test_files:
|
|
404
410
|
- spec/numb/unitary_amicable_spec.rb
|
405
411
|
- spec/numb/squared_triangular_spec.rb
|
406
412
|
- spec/numb/zerofree_spec.rb
|
413
|
+
- spec/numb/eban_spec.rb
|
407
414
|
- spec/numb/automorphic_spec.rb
|
408
415
|
- spec/numb/minimal_spec.rb
|
409
416
|
- spec/numb/jacobsthal_lucas_spec.rb
|
417
|
+
- spec/numb/aban_spec.rb
|
410
418
|
- spec/numb/hyperperfect_spec.rb
|
411
419
|
- spec/numb/zeisel_spec.rb
|
412
420
|
- spec/numb/smooth_spec.rb
|
@@ -447,6 +455,7 @@ test_files:
|
|
447
455
|
- spec/numb/mersenne_prime_spec.rb
|
448
456
|
- spec/numb/composite_spec.rb
|
449
457
|
- spec/numb/practical_spec.rb
|
458
|
+
- spec/numb/words_spec.rb
|
450
459
|
- spec/numb/sophie_germain_prime_spec.rb
|
451
460
|
- spec/numb/parasitic_spec.rb
|
452
461
|
- spec/numb/friendly_spec.rb
|