Begin forwarded message:

> From: NILSSON Christer <christer.nilsson / nordicsolution.com>
> Date: December 4, 2005 6:03:20 AM CST
> To: submission / rubyquiz.com
> Subject: [SOLUTION]
> Reply-To: NILSSON Christer <christer.nilsson / nordicsolution.com>
>
> def divisors(n) (1..n.div(2)).collect {|i| i if n.modulo(i) 
> ==0}.compact end
> def sum(arr) arr.inject(0) {|sum,element| sum+element} end
>
> def subset?(n, divisors)
>   arr=[]
>   divisors.each do |i|
>     arr.concat arr.collect {|j| i+j}
>     arr << i
>     arr.uniq!
>     return true if arr.member?(n)
>   end
>   false
> end
>
> def weird(n)
>   return if n.modulo(2)==1
>   coll = divisors(n)
>   diff = sum(coll)-n
>   return if diff <= 0
>   return n unless subset?(diff,coll)
> end
>
> def all_weird(n) (1..n).collect {|i| weird(i)}.compact end
>
> require 'test/unit'
> class TestWeird < Test::Unit::TestCase
>   def test_all
>     assert_equal [1,2,3,4,6], divisors(12)
>     assert_equal [1,2,5,7,10,14,35], divisors(70)
>     assert_equal 16, sum(divisors(12))
>     assert_equal 74, sum(divisors(70))
>     assert_equal true, subset?(12,divisors(12))
>     assert_equal false, subset?(70,divisors(70))
>     assert_equal false, subset?(4,divisors(70))
>     assert_equal nil, weird(2)
>     assert_equal nil, weird(12)
>     assert_equal nil, weird(20)
>     assert_equal 70, weird(70)
>     assert_equal [70], all_weird(70) # 0.821 sec
>     #assert_equal [70,836], all_weird(836) # 225 secs
>   end
> end
>