The three rules of Ruby Quiz 2:

1.  Please do not post any solutions or spoiler discussion for this  
quiz until 48 hours have passed from the time on this message.

2.  Support Ruby Quiz 2 by submitting ideas as often as you can! (A  
permanent, new website is in the works for Ruby Quiz 2. Until then,  
please visit the temporary website at <http:// 
matthew.moss.googlepages.com/home>.

3.  Enjoy!

Suggestion:  A [QUIZ] in the subject of emails about the problem  
helps everyone
on Ruby Talk follow the discussion.  Please reply to the original  
quiz message,
if you can.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
=-=-=-

The Smallest Circle
by Matthew Moss

Your task this week sounds simple enough, but may be more difficult  
than it first appears. Given a set of points on a plane, your goal is  
to find the smallest circle that encloses those points.

You are to provide a function, *encircle*, that takes an array of  
points and returns the smallest circle surrounding those points.  
Start with the following base code and extend as needed to solve the  
problem:

     class Point < Struct.new(:x, :y)
         def self.random
             Point.new(rand, rand)
         end

         def to_s
             "(#{x}, #{y})"
         end
     end

     class Circle < Struct.new(:center, :radius)
         def to_s
             "{center:#{center}, radius:#{radius}}"
         end
     end

     def encircle(points)        # takes array of Point objects
         # returns a Circle object
     end


I will be running several tests on the submitted solutions, with  
various point sets, to see how well they perform at this task. I  
recommend you you test your algorithm with a variety of sample sets,  
from small sets consisting of just 1-5 points, up to medium and  
larger sets, containing a few thousand points.

To generate an array of random points, start with the above code and  
add:

     def generate_samples(n)
         (1..n).map { Point.random }
     end


And then you may test your implementation like this:

     # encircle 10 random points
     puts encircle( generate_samples(10) )


As mentioned, this one may be more difficult than it seems. Feel free  
to estimate the smallest circle, if you get stuck on getting the  
exact solution.