# Re: Weird Numbers (#57) Solution

**URL:** <https://www.ruby-forum.com/t/re-weird-numbers-57-solution/49504>\
**Category:** Ruby\
**Created:** [December 5, 2005, 2:03pm UTC](https://www.ruby-forum.com/t/re-weird-numbers-57-solution/49504 "2005-12-05T14:03:55Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![simon.kroeger.ext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/da6949/32.png) [@simon.kroeger.ext](https://www.ruby-forum.com/u/simon.kroeger.ext)\
**Post date:** [December 5, 2005, 2:03pm UTC](https://www.ruby-forum.com/t/re-weird-numbers-57-solution/49504/1 "2005-12-05T14:03:55Z")

</div>

Hi,

I aimed for a fast yet elegant solution:  
(Its way faster than my first try, way slower than my  
fastest, but the one I liked the most)

* * *

require ‘set’

class Fixnum  
def weird?  
divisors = (1…1+self/2).select{|i| (self % i).zero?}  
return false if divisors.inject{|s, x| s + x} \<= self  
!divisors.inject([0].to\_set) do |sums, d|  
sums.merge(sums.map{|s| s + d})  
end.include?(self)  
end  
end

## $stdout.sync = true 1.upto((ARGV.shift || 1000).to\_i){|i| puts i if i.weird?}

cheers

Simon
