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(

, :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.