Skip to content

Instantly share code, notes, and snippets.

@headius
Forked from funny-falcon/not_ugly_test.rb
Created April 10, 2012 04:18
Show Gist options
  • Save headius/2348282 to your computer and use it in GitHub Desktop.
Save headius/2348282 to your computer and use it in GitHub Desktop.
uglier is sometimes faster
#!/usr/bin/env ruby
require 'yaml'
y=[]
(1..10000).each{|x|
#next unless x/2==(1.0*x)/2
z=x
divisors=[1]
_continue=true
while _continue
_continue=false
((divisors.last+1)..z).each{|w|
r=z/w
if (1.0*z)/w==r && w<x
divisors<<w
_continue=true
break
end
}
end
if divisors.inject(&:+)>x and (3..(divisors.count)).find{|w| divisors.combination(w).find{|w2| w2.inject(&:+)==x } }
y<<x
end
}
puts "amount: #{y.count}"
#!/usr/bin/env ruby
require 'yaml'
class Test
attr_reader :y
def initialize(up)
@up = up
@y = []
end
def perform
for x in 1..@up
divisors, w = [1], 1
while (w = get_next(w+1, x))
divisors << w
end
y << x if sum(divisors) > x && check(divisors, x)
end
self
end
def get_next(from, z)
w = from
while w < z
return w if z/w == (1.0*z)/w
w += 1
end
nil
end
def sum(ar)
s = ar[0]
i, up = 1, ar.size
while i < up
s += ar[i]
i += 1
end
s
end
def check(divisors, x)
(3..(divisors.count)).find{|w|
divisors.combination(w).find{|w2|
sum(w2) == x
}
}
end
end
puts "amount: #{Test.new(10000).perform.y.count}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment