RosettaCodeData/Task/Duffinian-numbers/Ruby/duffinian-numbers.rb

31 lines
781 B
Ruby

require "prime"
class Integer
def proper_divisors(prim_div = prime_division)
return [] if self == 1
primes = prim_div.flat_map{|prime, freq| [prime] * freq}
(1...primes.size).each_with_object([1]) do |n, res|
primes.combination(n).map{|combi| res << combi.inject(:*)}
end.flatten.uniq
end
def duffinian?
pd = prime_division
return false if pd.sum(&:last) < 2
gcd(proper_divisors(pd).sum + self) == 1
end
end
n = 50
puts "The first #{n} Duffinian numbers:"
(1..).lazy.select(&:duffinian?).first(n).each_slice(10) do |slice|
puts "%4d" * slice.size % slice
end
puts "\nThe first #{n} Duffinian triplets:"
(1..).each_cons(3).lazy.select{|slice| slice.all?(&:duffinian?)}.first(n).each do |group|
puts "%8d" * group.size % group
end