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} enddef 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
enddef 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)
enddef 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
···
Begin forwarded message: