quinta-feira, 29 de janeiro de 2009

Números Primos + MMC + MDC + Ruby



Segue abaixo um exemplo de implementação de gerador de Números Primos + MMC (Mínimo Múltiplo Comum) + MDC (Máximo Divisor Comum) em ruby. É um resultado de uma prova de lógica que um amigo meu teve que fazer em java.
Colaborações prestimosas de Cirillo Ferreira.


require 'Mathn'
class Numeric
def multiplos(ate = 500)
(1..ate).to_a.map{|v| self*v}
end
def divisores(ate = 500)
(1..ate).to_a.map{|v| v if (self%v == 0)}.compact
end
end

module Math
def self.mmc(*valor)
compara( valor.inject([]){|h, i| h << i.multiplos} ).first
end

def self.mdc(*valor)
compara( valor.inject([]){|h, i| h << i.divisores } ).last
end

def self.nmr_primos
numeros_primos = []
(2..501).each{|i| numeros_primos << (2..i).detect{|j| j%j ==0 && i%j==0} }
numeros_primos.uniq!
end

private
def self.compara(arr)
arr.inject(arr[0]){|ac, i| ac & i}
end
end

Math::mmc(3,5,8)
=> 120

Math::mmc(3,5,8,9)
=> 360




Os métodos mmc e mdc são métodos que aceitam parâmetros indeterminado graças a uma coisa, da linguagem ruby, chamada operador splat, que é aquele asterisco na assinatura do método. Tem a finalidade de compactar os parâmetros num única array.

Este programa é um pequeno incremento da classe Numeric. Onde é adicionado dois métodos necessários para a resolução dos métodos mmc e mdc que são: multiplos e divisores.
Após é adicionado no módulo Math (por isso a chamada inicial require 'Mathn'), como métodos de classe, o mmc e o mdc.
O método comparar é um método usado localmente (private) para retornar de um array de arrays os valores comuns.
obs.: O método gerar_nmr_primos não é usado. Foi criado apenas para ilustração e fertilização das mentes.

Mais informações sobre a linguagem acesse: O que é Ruby...

-Depois desse pragmatismo todo dá até para tomar um café com mais calma...

Abraço,
e até a próxima.