Here is my solution to the current quiz. While implementing this I learned more about the power of gsub, which I don't think I've ever used so much in one program as small as this one 
I output the result in either text or PDF if given the proper command-line options. To use the PDF feature you will need to install PDF::Writer, available from here: http://rubyforge.org/projects/ruby-pdf/
What a fun quiz this was, especially using the program to create some Madlibs. I also decided to create an additional madlib file for testing/having fun with. This is below following the code. The source for this was http://www.geocities.com/pezheadpaul/madlibs/prints/printprojects.htm and all credit goes to the author of that site. This is a good test because it has multiple paragraphs.
I hereby decree than an additional rule for this quiz would be that every solution include a new madlib file 
Ryan Leavengood
CODE (beware of wrapping):
def do_madlib(madlib_file, output_pdf, underline)
substitutions = {}
# Put paragraphs all on one line (there has got to be a better way!)
madlib = IO.readlines(madlib_file).join('').split(/\n\n/).collect{|l|l.gsub(/\n/,' ')}.join("\n\n")
madlib_result = madlib.gsub(/\(\([^)]*\)\)/) do |match|
match.gsub!(/\(|\)/,'') # Bye bye parens
if substitutions[match]
substitution = substitutions[match]
else
if match =~ /(.*):(.*)/
key = $1
match = $2
end
print "Please enter #{match}: "
substitution = $stdin.gets.chomp
if key
substitutions[key] = substitution
end
end
if output_pdf and underline
"<u>#{substitution}</u>"
else
substitution
end
end
if output_pdf
filename = madlib_file+".pdf"
print "Outputting PDF file #{filename}..."
require 'pdf/ezwriter'
pdf = PDF::EZWriter.new
pdf.select_font("pdf/fonts/Helvetica")
pdf.ez_text(madlib_result, 14)
File.open(filename, File::RDWR|File::CREAT|File::TRUNC) do |file|
file.print(pdf.ez_output)
end
puts "done."
else
puts "\n Your MadLib:\n\n"
madlib_result.split("\n").each do |paragraph|
# Lazy man's wrapping
puts paragraph.gsub(/.{72}[^ ]* /){|l|"#{l}\n"}
end
end
end
if $0 == __FILE__
if ARGV.length < 1
puts "Usage: #$0 [-pdf] [-u] <madlib file>"
puts " -pdf Output a PDF file."
puts " -u Underline the replaced words in the PDF output file."
exit(1)
end
output_pdf = false
underline = false
filename = nil
while ARGV.length > 0
arg = ARGV.shift
case arg
when '-pdf': output_pdf = true
when '-u': underline = true
else filename = arg
end
end
if filename
if test(?e, filename)
do_madlib(filename, output_pdf, underline)
else
puts "Provided madlib file does not exist!"
end
else
puts "No madlib filename provided!"
end
end
Science_Fair.madlib:
According to ((principal:a school principal's name)), the school science fair this year was 'very educational.' At the same time, ((principal)) announced plans to quit the school system and become a ((a dangerous job)). 'It sounds like a safer job,' the principal said.
Several ((an adjective)) projects were disqualified this year. The experiment on 'Animal Magnetism' by ((a girl's name)) was canceled before she could plug in her ((an animal)).
The project by ((a male bully's name)) on 'Gravity's Effect on First Graders' was canceled when the custodians wouldn't let him borrow a ladder.
And the Nuclear Powered ((a noun)) built by ((name:a proper noun)) was taken away by the police, who said ((name)) will be back in school 'any day now.'
((your name)) won second prize with an experiment that asked, 'Can ((animals:a plural animal)) Learn Karate?' The answer was 'yes.' The ((animals)) tossed ((principal)) over a ((a noun)) and left the science fair. Anyone who sees them should call the main office.
((a girl's name)) won first prize with her TNT ((veggies:a plural vegetable)). By planting seeds in gunpowder and watering them with nitroglycerin, ((veggies)) grew that explode when you drop them. 'What a dynamite idea,' the principal joked ((an adverb)).
So far, nobody has figured out how the prize-winning ((veggies)) got into the salad served to ((principal)) at lunchtime. Just to be safe, though, the 'Vegetable Surprise' has been taken off tomorrow's lunch menu.
