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.

3 comentários:

  1. Aosssssssssssssssssssssss pião dá hora d+++

    Ficou bem menor...
    E vc já tem mais de um tópico... uahauhua... ta forte hem... rs... já adicionei aqui nos meus favoritos, vou visitar de vez em qdo agora... continue escrevendo... com groovy acho que ficaria ainda menor!

    []s
    até mais

    ResponderExcluir
  2. Bem legal suas soluções. Esses dias precisei de um gerador de primos, fiz um, não ficou tão elegante quanto o seu, mas está um pouco mais rápido. De uma olhada:
    '

    def primos(inicio,fim)
    primos = []
    inicio.upto(fim) do |num|
    if num == 1
    primos << 1
    else
    next if num % 2 == 0
    teste = num/2
    num.times do
    break if num % teste == 0
    teste -= 1
    end
    primos << num if teste <= 1
    end
    end
    return primos
    end

    '

    Tá, ai.
    Falou, até mais!

    ResponderExcluir
  3. Legal Mateus, muito bom!!!

    Quem diria que poderiamos juntar as palvras 'programação' e 'elegância' no mesmo contexto, hein...

    Um abraço.

    ResponderExcluir