Well, here's mine. Not pretty, but seems to do the job, though quite slowly. 
If you pass the script '--dict' after the code string it will 
check /usr/share/dict/words for matches (so I guess it will only work on 
Unix), and display them at the top of the results. This starts to take a 
while with all non-trivial code strings. I was considering an online 
dictionary for this, but gave it up after I realised the example given in the 
quiz itself produces over 5000 combinations. 

Not much error checking here either...

The code:
############################################
code_key = { ".-" => "a", "-..." => "b", "-.-." => "c", "-.." => "d",
             "." => "e", "..-." => "f", "--." => "g", "...." => "h",
             ".." => "i", ".---" => "j", "-.-" => "k", ".-.." => "l",
             "--" => "m", "-." => "n", "---" => "o", ".--." => "p",
             "--.-" => "q", ".-." => "r", "..." => "s", "-" => "t",
             "..-" => "u", "...-" => "v", ".--" => "w", "-..-" => "x",
             "-.--" => "y", "--.." => "z" }

WORDS = []

def recurse(ck, a)
  naa = []
  a.each do |arr|
    4.times do |n|
      if parse_chars(arr[2], ck, n+1)
        na = [arr[0] + ck.fetch(arr[2][0,n+1]), arr[1] \
                     + arr[2][0,n+1] + "|", arr[2][n+1..-1]]
        if na[2] == "" or na[2] == nil
          WORDS << "#{na[0]} => #{na[1][0..-2]}" if not \
                     WORDS.include?("#{na[0]} => #{na[1][0..-2]}")
        else
          if not naa.include?(na)
            naa << na
          end
        end
      end
    end
  end
  naa
end

def main(w, ck)
  wlen = w.length - 1
  wa = []
  wa << [ck.fetch(w[0,1]), w[0,1] + "|", w[1..-1]] if parse_chars(w, ck, 1)
  wa << [ck.fetch(w[0,2]), w[0,2] + "|", w[2..-1]] if parse_chars(w, ck, 2)
  wa << [ck.fetch(w[0,3]), w[0,3] + "|", w[3..-1]] if parse_chars(w, ck, 3)
  wa << [ck.fetch(w[0,4]), w[0,4] + "|", w[4..-1]] if parse_chars(w, ck, 4)
  wlen.times do |i|
    wa = recurse(ck, wa)
  end
end

def parse_chars(w, ck, n)
  if ck.has_key?(w[0,n])
    true
  else
    false
  end
end

word_array = main(ARGV[0], code_key)

if ARGV[1] == "--dict"
  a = IO.readlines("/usr/share/dict/words")
  WORDS.each do |w|
    if a.include?(w[0, w.index(' ')] + "\n")
      puts w
      WORDS.delete(w)
    end
  end
  puts
end

puts WORDS.sort
###################################

-d
-- 
darren kirby :: Part of the problem since 1976 :: http://badcomputer.org
"...the number of UNIX installations has grown to 10, with more expected..."
- Dennis Ritchie and Ken Thompson, June 1972