2015-04-11 1 views
1

J'essaie de résoudre le problème 5 sur Project Euler. J'utilise la méthode .reduce(:+) et il semble fonctionner pour des tableaux jusqu'à 16 longs. Puis quand j'essaye de lui passer quelque chose de plus grand (20) pour la réponse il ne calcule jamais ma valeur finale.Limite de réduction en Ruby numérisable?

require 'pp' 
pp factors = (1..20).to_a 
n = 1 

result = [] 
loop do 
    factors.each { |x| result << n % x } 
    if result.reduce(:+) == 0 
     break 
    else 
     result = [] 
    end 
    n += 1 
end 
pp n 
+0

Peut-être que vous nous parlez du problème 5 du projet euler? – Meier

+0

La question est "Quel est le plus petit nombre positif même divisible par tous les nombres de 1 à 20"? –

Répondre

0

Il s'avère que vous pouvez résoudre ce problème avec Integer # lcm. Oui. Dans une ligne aussi.

(1..20).to_a.reduce(:lcm) 
+1

Il est utile de suggérer un meilleur moyen, mais seulement après que vous ou quelqu'un d'autre a répondu à la question du PO. –

+0

Noté. Je vous remercie! –

0

J'utilise array.inject (: +) et ne jamais courir dans des problèmes avec la longueur du tableau. Sera très utile pour le reste d'Euler! Il travaille également directement sur les plages de sorte que vous n'avez pas besoin d'appeler .to_a:

(1..20) .inject (: +) -> 210

http://ruby-doc.org/core-2.2.1/Enumerable.html

0

Pour la question de la titre, y at-il une limitation pour réduire?

Aucune limitation directe, elle est seulement limitée par la quantité de mémoire informatique dont vous avez besoin pour la baie. Il utilisera automatiquement la classe BigNum lorsque les entiers normaux débordent.

Par exemple,

(1..10000000).to_a.reduce(:+) 
=> 50000005000000 
50000005000000.class 
=> Bignum 

Donc, il faut être un autre problème, ou est parce que les chiffres et les runtimes et ainsi deviennent vraiment grand jusqu'à ce que votre boucle se termine.