From: James Edward Gray II Date: 2007-07-11T11:41:23+09:00 Subject: Re: [QUIZ][SOLUTION] Hangman (#130) Not many people solved this one, so I wanted to see if it was too tough. Didn't seem so: #!/usr/bin/env ruby -wKU puts "One moment..." puts words = File.open(ARGV.shift || "/usr/share/dict/words") do |dict| dict.inject(Hash.new) do |all, word| all.update(word.delete("^A-Za-z").downcase => true) end.keys end guesses = Array.new loop do puts guesses.empty? ? "Please enter a word pattern (_ _ _ _ for example):" : "Please update your pattern according to my guess (_ i _ _ for example):" pattern = $stdin.gets.to_s.delete("^A-Za-z_") if pattern.include? "_" if (guesses - pattern.delete("_").split("")).size > 6 puts "I'm out of guesses. You win." puts exit end else puts "I guessed your word. Pretty smart, huh?" puts exit end choices = words.grep(/\A#{pattern.tr("_", ".")}\Z/i) odds = Hash.new(0) choices.each do |word| word.split("").each do |l| next if guesses.include? l odds[l] += word.count(l) end end guess = odds.max { |(_, c1), (_, c2)| c1 <=> c2 }.first rescue nil guesses << guess puts "I guess the letter '#{guess}'." puts end __END__ James Edward Gray II