From: Eric Torreborre <etorreborre@yahoo.com>
Date: September 5, 2006 3:44:14 PM CDT
To: submission@rubyquiz.com
Subject: Ruby quiz n.93
Reply-To: Eric Torreborre <etorreborre@yahoo.com>Hi,
Here is my solution to this week quiz:
-I used rspec (the more I use it, the more I like it)
-I created an EmotiveNumber class, knowing if he's happy or sad (to add some feelings to this rational world)I haven't found drastic improvements on my laptop by using knowledge such as the cyclic numbers ([4, 16, 37, 58, 89, 145, 42, 20]) or caching suites for existing happy numbers (around 220 s. for the 1.000.000 "happiest number" search ). Anyway, this quiz was really fun, thank you.
===============================
The spec.require "spec"
require "happy_numbers"context "A happy number method" do
specify "should say 1 is a happy number" do
1.happy_number?.should_be true
endspecify "should say 2 and 3 are not happy numbers" do
[2, 3].each{|n| n.happy_number?.should_be false}
endspecify "should say 7, 10 are happy numbers" do
[7, 10].each{|n| n.happy_number?.should_be true}
endend
context "A find happy numbers function" do
specify "should find the correct happy numbers from 1 to 10" do
find_happy_numbers(10).should_equal([1, 7, 10])
end
endcontext "A find happiest number function" do
specify "should find the happiest number from 1 to 10" do
find_happiest_number(10).should_equal(7)
endspecify "should find the happiest number from 1 to 1000000" do
find_happiest_number(1000000).should_equal(78999)
end
endThe code: happy_numbers.rb
require "emotive_number"
class Fixnum
def happy_number?
EmotiveNumber.new(self).happy?
end
enddef find_happy_numbers(n)
(1..n).select{|seed| seed.happy_number?}
enddef find_happiest_number(n)
happiest, max_size = 1, 1
(1..n).each do |seed|
emotive = EmotiveNumber.new(seed)
happiest, max_size = seed, emotive.size if (emotive.happy? && emotive.size > max_size)
end
return happiest
endThe code: emotive_number.rb
class EmotiveNumber
CYCLIC_NUMBERS = [4, 16, 37, 58, 89, 145, 42, 20]
attr_reader :suitedef initialize(seed)
@suite =
compute_suite(seed)
enddef happy?
suite.last == 1
enddef size
suite.size
endprivate
def compute_suite(seed)
next_element = seed
while (!happy? && !CYCLIC_NUMBERS.include?(next_element))
@suite << next_element
next_element = square_sum(@suite.last)
end
@suite += CYCLIC_NUMBERS if !happy?
enddef square_sum(num)
num.to_s.split(//).inject(0){|result, i| result += i.to_i*i.to_i}
end
end===============================
--------------------------------------------------
Eric Torreborre
LTG - Product Manager
LEIRIOS
tel: 33(0)6.61.48.57.65/33(0)3.81.88.62.02
e-mail: etorreborre@yahoo.com
blog: http://etorreborre.blogspot.com
--------------------------------------------------
···
Begin forwarded message: