25 lines
1,018 B
Ruby
25 lines
1,018 B
Ruby
def humble(digits)
|
|
h = [1]
|
|
x2, x3, x5, x7 = 2, 3, 5, 7
|
|
i, j, k, l = 0, 0, 0, 0
|
|
n = 0
|
|
while n += 1 # ruby => 2.6: (1..).each do |n|
|
|
x = [x2, x3, x5, x7].min
|
|
break if x.to_s.size > digits
|
|
h[n] = x
|
|
x2 = 2 * h[i += 1] if x2 == h[n]
|
|
x3 = 3 * h[j += 1] if x3 == h[n]
|
|
x5 = 5 * h[k += 1] if x5 == h[n]
|
|
x7 = 7 * h[l += 1] if x7 == h[n]
|
|
end
|
|
h
|
|
end
|
|
|
|
digits = 50 # max digits for humble numbers
|
|
h = humble(digits) # humble numbers <= digits size
|
|
count = h.size # the total humble numbers count
|
|
#counts = h.map { |n| n.to_s.size }.tally # hash of digits counts 1..digits: Ruby => 2.7
|
|
counts = h.map { |n| n.to_s.size }.group_by(&:itself).transform_values(&:size) # Ruby => 2.4
|
|
print "First 50 Humble Numbers: \n"; (0...50).each { |i| print "#{h[i]} " }
|
|
print "\n\nOf the first #{count} humble numbers:\n"
|
|
(1..digits).each { |num| printf("%6d have %2d digits\n", counts[num], num) }
|