numb 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +10 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/lib/numb/abundant.rb +20 -0
  8. data/lib/numb/achilles.rb +15 -0
  9. data/lib/numb/automorphic.rb +24 -0
  10. data/lib/numb/carol.rb +21 -0
  11. data/lib/numb/deficient.rb +19 -0
  12. data/lib/numb/dihedral_prime.rb +25 -0
  13. data/lib/numb/dudeney.rb +15 -0
  14. data/lib/numb/economical.rb +16 -0
  15. data/lib/numb/emrip.rb +17 -0
  16. data/lib/numb/equidigital.rb +18 -0
  17. data/lib/numb/extravagant.rb +18 -0
  18. data/lib/numb/factorion.rb +15 -0
  19. data/lib/numb/frugal.rb +16 -0
  20. data/lib/numb/happy.rb +15 -0
  21. data/lib/numb/harshad.rb +8 -0
  22. data/lib/numb/hilbert.rb +7 -0
  23. data/lib/numb/hyperperfect.rb +7 -0
  24. data/lib/numb/impolite.rb +6 -0
  25. data/lib/numb/kaprekar.rb +14 -0
  26. data/lib/numb/keith.rb +15 -0
  27. data/lib/numb/kynea.rb +9 -0
  28. data/lib/numb/mms_pair.rb +11 -0
  29. data/lib/numb/mobius.rb +11 -0
  30. data/lib/numb/narcissistic.rb +8 -0
  31. data/lib/numb/nivenmorphic.rb +9 -0
  32. data/lib/numb/ordinal.rb +11 -0
  33. data/lib/numb/parasitic.rb +10 -0
  34. data/lib/numb/perfect.rb +10 -0
  35. data/lib/numb/perfect_power.rb +9 -0
  36. data/lib/numb/polite.rb +7 -0
  37. data/lib/numb/polydivisible.rb +10 -0
  38. data/lib/numb/powerful.rb +8 -0
  39. data/lib/numb/practical.rb +26 -0
  40. data/lib/numb/prime.rb +495 -0
  41. data/lib/numb/ruby1.8.rb +9 -0
  42. data/lib/numb/ruby1.9.rb +8 -0
  43. data/lib/numb/self.rb +13 -0
  44. data/lib/numb/self_descriptive.rb +9 -0
  45. data/lib/numb/semi_perfect.rb +15 -0
  46. data/lib/numb/semiprime.rb +6 -0
  47. data/lib/numb/smarandache_wellin.rb +11 -0
  48. data/lib/numb/smith.rb +7 -0
  49. data/lib/numb/sphenic.rb +8 -0
  50. data/lib/numb/square.rb +8 -0
  51. data/lib/numb/square_free.rb +6 -0
  52. data/lib/numb/triangular.rb +8 -0
  53. data/lib/numb/trimorphic.rb +6 -0
  54. data/lib/numb/undulating.rb +11 -0
  55. data/lib/numb/vampire.rb +11 -0
  56. data/lib/numb/weird.rb +8 -0
  57. data/lib/numb.rb +80 -0
  58. data/numb.gemspec +201 -0
  59. data/spec/abundant_spec.rb +24 -0
  60. data/spec/achilles_spec.rb +24 -0
  61. data/spec/automorphic_spec.rb +208 -0
  62. data/spec/carol_spec.rb +18 -0
  63. data/spec/deficient_spec.rb +23 -0
  64. data/spec/digital_sum_spec.rb +8 -0
  65. data/spec/dihedral_prime_spec.rb +38 -0
  66. data/spec/dudeney_spec.rb +14 -0
  67. data/spec/economical_spec.rb +28 -0
  68. data/spec/emrip_spec.rb +26 -0
  69. data/spec/equidigital_spec.rb +27 -0
  70. data/spec/extravagant_spec.rb +20 -0
  71. data/spec/factor_spec.rb +22 -0
  72. data/spec/factorion_spec.rb +13 -0
  73. data/spec/frugal_spec.rb +20 -0
  74. data/spec/happy_spec.rb +24 -0
  75. data/spec/harshad_spec.rb +25 -0
  76. data/spec/hilbert_spec.rb +24 -0
  77. data/spec/hyperperfect_spec.rb +59 -0
  78. data/spec/kaprekar_spec.rb +25 -0
  79. data/spec/keith_spec.rb +21 -0
  80. data/spec/kynea_spec.rb +19 -0
  81. data/spec/maris_mcgwire_sosa_pair_spec.rb +20 -0
  82. data/spec/mobius_spec.rb +52 -0
  83. data/spec/narcissistic_spec.rb +18 -0
  84. data/spec/nivenmorphic_spec.rb +24 -0
  85. data/spec/number_of_distinct_prime_factors_spec.rb +35 -0
  86. data/spec/number_of_prime_factors_spec.rb +32 -0
  87. data/spec/ordinal_spec.rb +64 -0
  88. data/spec/parasitic_spec.rb +29 -0
  89. data/spec/perfect_power_spec.rb +24 -0
  90. data/spec/perfect_spec.rb +103 -0
  91. data/spec/polite_spec.rb +14 -0
  92. data/spec/politeness_spec.rb +11 -0
  93. data/spec/polydivisible_spec.rb +19 -0
  94. data/spec/powerful_spec.rb +25 -0
  95. data/spec/practical_spec.rb +30 -0
  96. data/spec/self_descriptive_spec.rb +19 -0
  97. data/spec/self_spec.rb +20 -0
  98. data/spec/semi_perfect_spec.rb +24 -0
  99. data/spec/semiprime_spec.rb +21 -0
  100. data/spec/smarandache_wellin_spec.rb +26 -0
  101. data/spec/smith_spec.rb +19 -0
  102. data/spec/spec_helper.rb +9 -0
  103. data/spec/sphenic_spec.rb +20 -0
  104. data/spec/square_free_spec.rb +19 -0
  105. data/spec/square_spec.rb +24 -0
  106. data/spec/triangular_spec.rb +19 -0
  107. data/spec/trimorphic_spec.rb +25 -0
  108. data/spec/undulating_spec.rb +20 -0
  109. data/spec/vampire_spec.rb +19 -0
  110. data/spec/weird_spec.rb +24 -0
  111. metadata +216 -0
@@ -0,0 +1,103 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Integer, "#perfect?" do
4
+ it "returns true for the first 7 perfect numbers" do
5
+ [6, 28, 496, 8128, 33550336, 8589869056, 137438691328].each do |n|
6
+ n.perfect?.should be_true
7
+ end
8
+ end
9
+
10
+ it "returns false for the neighbours of the first 7 perfect numbers" do
11
+ [6, 28, 496, 8128, 33550336, 8589869056, 137438691328].each do |n|
12
+ (n+1).perfect?.should be_false
13
+ (n-1).perfect?.should be_false
14
+ end
15
+ end
16
+
17
+ it "returns false for odd integers" do
18
+ [29,31,33,35].each do |n|
19
+ n.perfect?.should be_false
20
+ end
21
+ end
22
+
23
+ it "returns false for 1" do
24
+ 1.perfect?.should be_false
25
+ end
26
+
27
+ it "returns false for 0" do
28
+ 0.perfect?.should be_false
29
+ end
30
+
31
+ it "returns false for -1" do
32
+ -1.perfect?.should be_false
33
+ end
34
+
35
+ it "returns false for non-perfect positive integers" do
36
+ [8, 66, 3478].each do |n|
37
+ n.perfect?.should be_false
38
+ end
39
+ end
40
+
41
+ it "returns false for negative integers" do
42
+ -6.perfect?.should be_false
43
+ end
44
+ end
45
+
46
+ describe Integer, "#proper_positive_divisors" do
47
+ it "returns an Array" do
48
+ 6.proper_positive_divisors.should be_an_instance_of(Array)
49
+ end
50
+
51
+ it "returns integers that divide into self with no remainder" do
52
+ 6.proper_positive_divisors.should include(2, 3)
53
+ end
54
+
55
+ it "doesn't return integers that divide into self with a remainder" do
56
+ 6.proper_positive_divisors.should_not include(4, 5)
57
+ end
58
+
59
+ it "doesn't return itself as a divisor" do
60
+ 9.proper_positive_divisors.should_not include(9)
61
+ end
62
+
63
+ it "returns all of the proper divisors of self" do
64
+ 33.proper_positive_divisors.sort.should == [1, 3, 11]
65
+ end
66
+
67
+ it "returns [] for 1" do
68
+ 1.proper_positive_divisors.should == []
69
+ end
70
+
71
+ it "returns [] for 0" do
72
+ 0.proper_positive_divisors.should == []
73
+ end
74
+
75
+ it "returns [] for -1" do
76
+ -1.proper_positive_divisors.should == []
77
+ end
78
+
79
+ it "returns [] when self is negative" do
80
+ -32.proper_positive_divisors.should == []
81
+ end
82
+ end
83
+
84
+ describe Integer, "#digital_root" do
85
+ it "returns each single-digit number as is" do
86
+ (0..9).each do |n|
87
+ n.digital_root.should == n
88
+ end
89
+ end
90
+
91
+ it "returns the sum of the digits of multi-digit numbers" do
92
+ 18.digital_root.should == 9
93
+ end
94
+
95
+ it "returns a single digit even when the sum of the digits is greater than 9" do
96
+ 65536.digital_root.should == 7
97
+ end
98
+
99
+ it "works for negative numbers" do
100
+ -4.digital_root.should == 5
101
+ -99.digital_root.should == 9
102
+ end
103
+ end
@@ -0,0 +1,14 @@
1
+ describe Integer, "#polite?" do
2
+ it "returns true for polite numbers" do
3
+ [1,3,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,
4
+ 23,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40].each do |polite|
5
+ polite.should be_polite
6
+ end
7
+ end
8
+
9
+ it "returns false for impolite numbers" do
10
+ [2,4,8,16,32].each do |impolite|
11
+ impolite.should_not be_polite
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ describe Integer, "#politeness" do
2
+ it "returns number of non-trivial ways to write n as the sum of >= 2 consecutive integers" do
3
+ [0,0,0,1,0,1,1,1,0,2,1,1,1,1,1,3,0,1,2,1,1,3,1,1,
4
+ 1,2,1,3,1,1,3,1,0,3,1,3,2,1,1,3,1,1,3,1,1,5,1,1,1,
5
+ 2,2,3,1,1,3,3,1,3,1,1,3,1,1,5,0,3,3,1,1,3,3,1,2,1,
6
+ 1,5,1,3,3,1,1,4,1,1,3,3,1,3,1,1,5,3,1,3,1,3,1,1,2,
7
+ 5,2].each_with_index do |politeness, number|
8
+ number.politeness.should == politeness
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#polydivisible?" do
2
+ # http://www.research.att.com/~njas/sequences/A078282
3
+ POLYDIVISIBLE = [1,10,102,1020,10200,102000,1020005,10200056,
4
+ 102000564,1020005640,10200056405,3608528850368400786036725,
5
+ 48000688208466084040,30000600003, 381654729]
6
+
7
+ it "returns true for polydivisible numbers" do
8
+ POLYDIVISIBLE.each do |number|
9
+ number.should be_polydivisible
10
+ end
11
+ end
12
+
13
+ it "returns false for non-polydivisible numbers" do
14
+ [123456, 2020, 102001].each do |number|
15
+ number.should_not be_polydivisible
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,25 @@
1
+ describe Integer, "#powerful?" do
2
+ POWERFUL = [1,4,8,9,16,25,27,32,36,49,64,72,81,100,108,121,
3
+ 125,128,144,169,196,200,216,225,243,256,288,289,
4
+ 324,343,361,392,400,432,441,484,500,512,529,576,
5
+ 625,648,675,676,729,784,800,841,864,900,961,968,
6
+ 972,1000]
7
+ it "returns true for a powerful number" do
8
+ POWERFUL.each do |number|
9
+ number.should be_powerful
10
+ end
11
+ end
12
+
13
+ it "returns false for a non-powerful number" do
14
+ ((1..999).to_a - POWERFUL).sample(10).each do |number|
15
+ number.should_not be_powerful
16
+ end
17
+ end
18
+
19
+ it "returns false for a negative number" do
20
+ (1..999).each do |number|
21
+ (-number).should_not be_powerful
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,30 @@
1
+ describe Integer, "#practical?" do
2
+ PRACTICAL =[1,2,4,6,8,12,16,18,20,24,28,30,32,36,40,42,48,54,
3
+ 56,60,64,66,72,78,80,84,88,90,96,100,104,108,112,
4
+ 120,126,128,132,140,144,150,156,160,162,168,176,
5
+ 180,192,196,198,200,204,208,210,216,220,224,228,
6
+ 234,240,252]
7
+ it "returns true for any practical number" do
8
+ PRACTICAL.each do |number|
9
+ number.should be_practical
10
+ end
11
+ end
12
+
13
+ it "returns false for any non-practical number" do
14
+ ((1..252).to_a - PRACTICAL).each do |number|
15
+ number.should_not be_practical
16
+ end
17
+ end
18
+
19
+ it "returns true for powers of two" do
20
+ [38, 41, 2, 5].each do |pow|
21
+ (2 ** pow).should be_practical
22
+ end
23
+ end
24
+
25
+ it "returns true for perfect numbers" do
26
+ [6, 28, 496, 8128, 33550336, 8589869056, 137438691328].each do |n|
27
+ n.should be_practical
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#self_descriptive?" do
2
+ SELF_DESCRIPTIVE = [nil,nil,nil,nil,1210,21200,nil,
3
+ 3211000,42101000,521001000,6210001000]
4
+
5
+ SELF_DESCRIPTIVE.each_with_index do |number, base|
6
+ next if number.nil?
7
+ it "returns true if the number is self-descriptive in base #{base}" do
8
+ number.self_descriptive?(base).should be_true
9
+ end
10
+ end
11
+
12
+ [21,101,2345,26871,112200,1723492,
13
+ 66287620,112276826,2386520171].each do |number|
14
+ base = number.digits.size
15
+ it "returns false if the number isn't self-descriptive in base #{base}" do
16
+ number.to_s(base).to_i.self_descriptive?(base).should be_false
17
+ end
18
+ end
19
+ end
data/spec/self_spec.rb ADDED
@@ -0,0 +1,20 @@
1
+ describe Integer, "#self?" do
2
+ SELF = [1,3,5,7,9,20,31,42,53,64,75,86,97,108,110,121,
3
+ 132,143,154,165,176,187,198,209,211,222,233,244,
4
+ 255,266,277,288,299,310,312,323,334,345,356,367,
5
+ 378,389,400,411,413,424,435,446,457,468,479,490,
6
+ 501,512,514,525]
7
+
8
+ it "returns true for self numbers" do
9
+ SELF.each do |number|
10
+ number.should be_self
11
+ end
12
+ end
13
+
14
+ it "returns false for non-self numbers" do
15
+ ((1..200).to_a - SELF).each do |number|
16
+ number.should_not be_self
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,24 @@
1
+ describe Integer, "#semi_perfect?" do
2
+ SEMI_PERFECT = [6,12,18,20,24,28,30,36,40,42,48,54,56,60,66,72,
3
+ 78,80,84,88,90,96,100,102,104,108,112,114,120,126,
4
+ 132,138,140,144,150,156,160,162,168,174,176,180,
5
+ 186,192,196,198,200,204,208,210,216,220,222,224,
6
+ 228,234,240,246,252,258,260,264]
7
+ it "returns true if the number is semi-perfect" do
8
+ SEMI_PERFECT.each do |number|
9
+ number.should be_semi_perfect
10
+ end
11
+ end
12
+
13
+ it "returns false if the number is not semi-perfect" do
14
+ ((1..263).to_a - SEMI_PERFECT).each do |number|
15
+ number.should_not be_semi_perfect
16
+ end
17
+ end
18
+
19
+ it "returns false if the number is negative" do
20
+ (1..263).each do |number|
21
+ (-number).should_not be_semi_perfect
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ describe Integer, "#semiprime?" do
2
+ # http://www.research.att.com/~njas/sequences/A001358
3
+ SEMI_PRIME = [4,6,9,10,14,15,21,22,25,26,33,34,35,38,39,46,49,
4
+ 51,55,57,58,62,65,69,74,77,82,85,86,87,91,93,94,
5
+ 95,106,111,115,118,119,121,122,123,129,133,134,
6
+ 141,142,143,145,146,155,158,159,161,166,169,177,
7
+ 178,183,185,187]
8
+
9
+ it "returns true for semi-prime numbers" do
10
+ SEMI_PRIME.each do |number|
11
+ number.should be_semiprime
12
+ end
13
+ end
14
+
15
+ it "returns false for non-semi-prime numbers" do
16
+ ((1..187).to_a - SEMI_PRIME).each do |number|
17
+ number.should_not be_semiprime
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,26 @@
1
+ describe Integer, "#smarandache-wellin?" do
2
+ # http://www.research.att.com/~njas/sequences/A019518
3
+ SMARANDACHE_WELLIN = [2,23,235,2357,235711,23571113,2357111317,
4
+ 235711131719,23571113171923,2357111317192329,
5
+ 235711131719232931,23571113171923293137,
6
+ 2357111317192329313741,235711131719232931374143,
7
+ 23571113171923293137414347]
8
+
9
+ it "returns true for Smarandache-Wellin numbers" do
10
+ SMARANDACHE_WELLIN.each do |number|
11
+ number.should be_smarandache_wellin
12
+ end
13
+ end
14
+
15
+ it "returns false for non-Smarandache-Wellin numbers" do
16
+ [3,5757490, 99].each do |number|
17
+ number.should_not be_smarandache_wellin
18
+ end
19
+ end
20
+
21
+ it "returns false for numbers which merely contain Smarandache-Wellin numbers" do
22
+ [234, 82357].each do |number|
23
+ number.should_not be_smarandache_wellin
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#smith?" do
2
+ # http://www.research.att.com/~njas/sequences/A006753
3
+ SMITH = [4,22,27,58,85,94,121,166,202,265,274,319,346,355,
4
+ 378,382,391,438,454,483,517,526,535,562,576,588,
5
+ 627,634,636,645,648,654,663,666,690,706,728,729,
6
+ 762,778,825,852,861,895,913,915,922,958,985,1086]
7
+
8
+ it "returns true for Smith numbers" do
9
+ SMITH.each do |number|
10
+ number.should be_smith
11
+ end
12
+ end
13
+
14
+ it "returns false for non-Smith numbers" do
15
+ ((1..1086).to_a - SMITH).each do |number|
16
+ number.should_not be_smith
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'numb'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
@@ -0,0 +1,20 @@
1
+ describe Integer, "#sphenic?" do
2
+ # http://www.research.att.com/~njas/sequences/A007304
3
+ SPHENIC = [30,42,66,70,78,102,105,110,114,130,138,154,165,
4
+ 170,174,182,186,190,195,222,230,231,238,246,255,
5
+ 258,266,273,282,285,286,290,310,318,322,345,354,
6
+ 357,366,370,374,385,399,402,406,410,418,426,429,
7
+ 430,434,435,438]
8
+
9
+ it "returns true for sphenic numbers" do
10
+ SPHENIC.each do |number|
11
+ number.should be_sphenic
12
+ end
13
+ end
14
+
15
+ it "returns false for non-sphenic numbers" do
16
+ ((1..438).to_a - SPHENIC).each do |number|
17
+ number.should_not be_sphenic
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#square_free?" do
2
+ # http://www.research.att.com/~njas/sequences/A005117
3
+ SQUARE_FREE = [1,2,3,5,6,7,10,11,13,14,15,17,19,21,22,23,26,29,
4
+ 30,31,33,34,35,37,38,39,41,42,43,46,47,51,53,55,
5
+ 57,58,59,61,62,65,66,67,69,70,71,73,74,77,78,79,
6
+ 82,83,85,86,87,89,91,93,94,95,97,101,102,103,105,
7
+ 106,107,109,110,111,113]
8
+ it "returns true for square-free numbers" do
9
+ SQUARE_FREE.each do |number|
10
+ number.should be_square_free
11
+ end
12
+ end
13
+
14
+ it "returns false for non-square-free numbers" do
15
+ ((1..113).to_a - SQUARE_FREE).each do |number|
16
+ number.should_not be_square_free
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#square?" do
2
+ SQUARES = [0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,
3
+ 225,256,289,324,361,400,441,484,529,576,625,676,
4
+ 729,784,841,900,961,1024,1089,1156,1225,1296,1369,
5
+ 1444,1521,1600,1681,1764,1849]
6
+
7
+ it "returns true if the number is square" do
8
+ SQUARES.each do |number|
9
+ number.should be_square
10
+ end
11
+ end
12
+
13
+ it "returns false if the number isn't square" do
14
+ ((1..1850).to_a - SQUARES).each do |number|
15
+ number.should_not be_square
16
+ end
17
+ end
18
+
19
+ it "returns false for negative numbers" do
20
+ [-1, -378, -9].each do |number|
21
+ number.should_not be_square
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#triangular?" do
2
+ TRIANGULAR = [0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,
3
+ 136,153,171,190,210,231,253,276,300,325,351,378,
4
+ 406,435,465,496,528,561,595,630,666,703,741,780,
5
+ 820,861,903,946,990,1035,1081,1128,1176,1225,1275,
6
+ 1326,1378,1431]
7
+
8
+ it "returns true for triangular numbers" do
9
+ TRIANGULAR.each do |number|
10
+ number.should be_triangular
11
+ end
12
+ end
13
+
14
+ it "returns false for non-triangular numbers" do
15
+ ((1..1431).to_a - TRIANGULAR).each do |number|
16
+ number.should_not be_triangular
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ describe Integer, "#trimorphic?" do
2
+ TRIMORPHIC = [0,1,4,5,6,9,24,25,49,51,75,76,99,125,249,251,375,
3
+ 376,499,501,624,625,749,751,875,999,1249,3751,
4
+ 4375,4999,5001,5625,6249,8751,9375,9376,9999,
5
+ 18751,31249,40625,49999,50001,59375,68751,81249,
6
+ 90624,90625]
7
+
8
+ it "returns true for trimorphic numbers" do
9
+ TRIMORPHIC.each do |number|
10
+ number.should be_trimorphic
11
+ end
12
+ end
13
+
14
+ it "returns false for non-trimorphic numbers" do
15
+ [2,3,7, 8752, 906266, 33333].each do |number|
16
+ number.should_not be_trimorphic
17
+ end
18
+ end
19
+
20
+ it "returns false for negative numbers" do
21
+ [2,3,4,7,9,8752, 906266, 33333].each do |number|
22
+ (-number).should_not be_trimorphic
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ describe Integer, "#undulating?" do
2
+ # http://www.research.att.com/~njas/sequences/A046075
3
+ UNDULATING = [101,121,131,141,151,161,171,181,191,202,212,232,
4
+ 242,252,262,272,282,292,303,313,323,343,353,363,
5
+ 373,383,393,404,414,424,434,454,464,474,484,494,
6
+ 505,515,525,535,545,565,575,585,595,606,616,626,
7
+ 636,646,656]
8
+
9
+ it "requires true for undulating numbers" do
10
+ UNDULATING.each do |number|
11
+ number.should be_undulating
12
+ end
13
+ end
14
+
15
+ it "requires false for non-undulating numbers" do
16
+ ((1..300).to_a - UNDULATING).each do |number|
17
+ number.should_not be_undulating
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ describe Integer, "#vampire?" do
2
+ # http://www.research.att.com/~njas/sequences/A014575
3
+ VAMPIRE = [1260,1395,1435,1530,1827,2187,6880,102510,104260,
4
+ 105210,105264,105750,108135,110758,115672,116725,
5
+ 117067,118440,120600,123354,124483,125248,125433,
6
+ 125460,125500,126027,126846,129640]
7
+
8
+ it "returns true for vampire numbers" do
9
+ VAMPIRE.each do |number|
10
+ number.should be_vampire
11
+ end
12
+ end
13
+
14
+ it "returns false for non-vampire numbers" do
15
+ [1259,22,1396].each do |number|
16
+ number.should_not be_vampire
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#weird?" do
2
+ WEIRD = [70,836,4030,5830,7192,7912,9272,10430,10570,
3
+ 10792,10990,11410,11690,12110,12530,12670,13370,
4
+ 13510,13790,13930,14770,15610,15890,16030,16310,
5
+ 16730,16870,17272,17570,17990,18410,18830,18970,
6
+ 19390,19670]
7
+ it "returns true if the number is weird" do
8
+ WEIRD.sample(10).each do |number|
9
+ number.should be_weird
10
+ end
11
+ end
12
+
13
+ it "returns false if the number is not weird" do
14
+ [1, 39, 69, 13791].each do |number|
15
+ number.should_not be_weird
16
+ end
17
+ end
18
+
19
+ it "returns false if the number is negative" do
20
+ [-1, -70, -39, -19390].each do |number|
21
+ number.should_not be_weird
22
+ end
23
+ end
24
+ end