最終更新: 2011-02-09T01:05+0900
昨日よりちょっとはマシになったかと。アホすぎた素数判定を、素因数の数を数える処理と一体化した。でも 10秒以上かかります。
primes = [2] have4primefactors = [] num_of_factors = lambda{|x| prime_factors = 0 primes.each{|prime| quotient, remainder = x.divmod(prime) if quotient < prime prime_factors += 1 break end if remainder == 0 prime_factors += 1 break if 4 < prime_factors x /= prime while x % prime == 0 break if x == 1 end } return prime_factors } x = 2 loop { x += 1 print "#{x}\r" case num_of_factors.call(x) when 1 primes.push x have4primefactors.clear when 4 have4primefactors.push x p have4primefactors.first if have4primefactors.length == 4 else have4primefactors.clear end }
恥ずかしいほどまっすぐで乱暴なスクリプトだけど、コンソールの表示も待てないくらいノーウェイトで答えが出るんだから仕方がない。
p (1..1000).inject(0){|sum,x| sum + x**x }
10秒くらいかかります。
primes = [] is_prime = lambda{|x| result = true primes.each{|prime| quotient, remainder = x.divmod(prime) if remainder == 0 result = false break end break if quotient < prime } return result } 2.upto(9999){|x| primes.push x if is_prime.call x } primes_4digit = primes.last(primes.length - primes.rindex{|x| x < 1000 } - 1) 0.upto(primes_4digit.size-1){|i| p = primes_4digit[i] # next if p == 1487 (i+1).upto(primes_4digit.size-1){|j| q = primes_4digit[j] r = q + q - p next if p.to_s.split(//).sort != q.to_s.split(//).sort or q.to_s.split(//).sort != r.to_s.split(//).sort k = nil (j+1).upto(primes_4digit.size-1){|_k| if r == primes_4digit[_k] k = _k break elsif r < primes_4digit[_k] break end } if k puts "#{p} #{q} #{r}" # exit end } }