From: Thomas Wieczorek Date: 2007-07-12T04:10:18+09:00 Subject: Re: [QUIZ][SOLUTION] Hangman (#130) ------=_Part_7791_32033177.1184181018598 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline 2007/7/11, James Edward Gray II : > Not many people solved this one, so I wanted to see if it was too > tough. Didn't seem so: > I was busy until today. Here's my solution and my first quiz solution since I learn Ruby. It wasn't that hard. I learned a lot about Ruby with it. >ruby hangman.rb [-w=word] [-l=lifes] If you don't pass a word it will choose a random word from the dictionary. Lifes is set to 6 if you don't provide it. #Ruby Quiz 130 #solution by Thomas Wieczorek #11.07.2007 require 'yaml' $debug = true class Player public def initialize(word) @word = word @dictionary = YAML.load_file(DICTIONARYFILE) @letters = ('a'..'z').to_a @guessed = [] scan_dictionary(word) end def guess() return @dictionary[0] if @dictionary.length == 1 while (true) letter = @probabilities.pop next if @guessed.include?(letter[0]) @guessed << letter[0] break end return letter[0] end def word=(value) if not value.include?(".") then #lost #unknown word if not @dictionary.include?(value) then @dictionary = load_dictionary() @dictionary << value File.open("dictionary.yaml", "w") { |f| YAML.dump(@dictionary, f) } end else if @word.eql?(value) then @word = value scan_dictionary(value) end end end private DICTIONARYFILE = "dictionary.yaml" def scan_dictionary(masked) @dictionary = @dictionary or load_dictionary() @dictionary = @dictionary.grep(Regexp.new("^#{@word}$")) set_probability() end def set_probability alphabet = ('a'..'z').to_a @probabilities = {} alphabet.each { |l| @probabilities[l] = 0 } @dictionary.each do |word| word.each_byte do |letter| #p letter l = letter.chr @probabilities[l] += 1 if alphabet.include?(l) end end @probabilities = @probabilities.sort {|a,b| a[1]<=>b[1]} end def load_dictionary() return YAML.load_file(DICTIONARYFILE) end end #of Player def random_word words = YAML.load_file("dictionary.yaml") return words[rand(words.length)] end def check_for_letters(word, guess, masked_word) if word.include?(guess) then #puts "#{guess} is in #{word}" word.length.times do |i| if word[i].chr == guess then masked_word[i] = guess end end end return masked_word end def play_game(word = "", lifes = 6, give_output = false) #user given word word = random_word if word == "" masked_word = word.gsub(/\w/, ".") guess = "" player = Player.new(masked_word) while(lifes > 0) #AI guesses a letter or word puts "AI is looking for >#{masked_word}<" if give_output guess = player.guess() new_word = "" won = false puts "AI guessed '#{guess}'" if give_output if guess.length == 1 then masked_word = check_for_letters(word, guess, masked_word) else if guess.length > 1 then break if guess == word lifes -= 1 next else #nil end end #wrong guess if not masked_word.include?(guess) then lifes -= 1 puts "AI lost a life. #{lifes} lifes left." else #found word if masked_word == word then break else #found a letter player.word = masked_word next end end end if lifes > 0 then won = true else #give word to player to extend dictionary player.word = word won = false end return won, word, lifes end #of play_game won = false word = "" lifes = 6 if ARGV.length > 0 ARGV.each do |arg| option = arg.split("=") case option[0] when "-w" word = option[1] when "-l" lifes = option[1].to_i end end end won, word, lifes = play_game(word, lifes, true) if won then puts "AI won! It guessed \"#{word}\" with #{lifes} lifes left." else puts "Awww! Lost! AI couldn't guess \"#{word}\"." end ------=_Part_7791_32033177.1184181018598 Content-Type: application/octet-stream; name=hangman.rb Content-Transfer-Encoding: base64 X-Attachment-Id: f_f406se2t Content-Disposition: attachment; filename="hangman.rb" I1J1YnkgUXVpeiAxMzANCiNzb2x1dGlvbiBieSBUaG9tYXMgV2llY3pvcmVrIDx3aWVjem8ueW9A Z29vZ2xlbWFpbC5jb20+DQojdGhlIGRpY3Rpb25hcnkgY29tZXMgZnJvbSBodHRwOi8vd3d3Lmp1 bmUyOS5jb20vSURQL2ZpbGVzL0dlcm1hbi50eHQgSSByZW1vdmVkIHRoZSBkdXBsaWNhdGVzIGFu ZCB0aGUgR2VybWFuIHdvcmRzDQojMTEuMDcuMjAwNw0KcmVxdWlyZSAneWFtbCcNCiRkZWJ1ZyA9 IHRydWUNCg0KY2xhc3MgUGxheWVyDQoNCnB1YmxpYw0KDQogIGRlZiBpbml0aWFsaXplKHdvcmQp DQogICAgQHdvcmQgPSB3b3JkDQogICAgQGRpY3Rpb25hcnkgPSBZQU1MLmxvYWRfZmlsZShESUNU SU9OQVJZRklMRSkNCiAgICBAbGV0dGVycyA9ICgnYScuLid6JykudG9fYQ0KICAgIEBndWVzc2Vk ID0gW10NCiAgICBzY2FuX2RpY3Rpb25hcnkod29yZCkNCiAgZW5kDQogIA0KICBkZWYgZ3Vlc3Mo KQ0KICAgIHJldHVybiBAZGljdGlvbmFyeVswXSBpZiBAZGljdGlvbmFyeS5sZW5ndGggPT0gMQ0K ICAgIHdoaWxlICh0cnVlKQ0KICAgICAgbGV0dGVyID0gQHByb2JhYmlsaXRpZXMucG9wDQogICAg ICBuZXh0IGlmIEBndWVzc2VkLmluY2x1ZGU/KGxldHRlclswXSkNCiAgICAgIEBndWVzc2VkIDw8 IGxldHRlclswXQ0KICAgICAgYnJlYWsNCiAgICBlbmQNCiAgICByZXR1cm4gbGV0dGVyWzBdDQog IGVuZA0KDQogIGRlZiB3b3JkPSh2YWx1ZSkNCiAgICANCiAgICBpZiBub3QgdmFsdWUuaW5jbHVk ZT8oIi4iKSB0aGVuDQogICAgICAjbG9zdA0KICAgICAgI3Vua25vd24gd29yZA0KICAgICAgaWYg bm90IEBkaWN0aW9uYXJ5LmluY2x1ZGU/KHZhbHVlKSB0aGVuDQogICAgICAgIEBkaWN0aW9uYXJ5 ID0gbG9hZF9kaWN0aW9uYXJ5KCkNCiAgICAgICAgQGRpY3Rpb25hcnkgPDwgdmFsdWUNCiAgICAg ICAgRmlsZS5vcGVuKCJkaWN0aW9uYXJ5LnlhbWwiLCAidyIpIHsgfGZ8IFlBTUwuZHVtcChAZGlj dGlvbmFyeSwgZikgfQ0KICAgICAgZW5kDQogICAgZWxzZQ0KICAgICAgaWYgQHdvcmQuZXFsPyh2 YWx1ZSkgdGhlbg0KICAgICAgICBAd29yZCA9IHZhbHVlDQogICAgICAgIHNjYW5fZGljdGlvbmFy eSh2YWx1ZSkNCiAgICAgIGVuZA0KICAgIGVuZA0KICBlbmQNCiAgDQpwcml2YXRlIA0KDQogIERJ Q1RJT05BUllGSUxFID0gImRpY3Rpb25hcnkueWFtbCINCiAgDQogIGRlZiBzY2FuX2RpY3Rpb25h cnkobWFza2VkKQ0KICAgIEBkaWN0aW9uYXJ5ID0gQGRpY3Rpb25hcnkgb3IgbG9hZF9kaWN0aW9u YXJ5KCkNCiAgICBAZGljdGlvbmFyeSA9IEBkaWN0aW9uYXJ5LmdyZXAoUmVnZXhwLm5ldygiXiN7 QHdvcmR9JCIpKQ0KICAgIHNldF9wcm9iYWJpbGl0eSgpDQogIGVuZA0KICANCiAgZGVmIHNldF9w cm9iYWJpbGl0eQ0KICAgIGFscGhhYmV0ID0gKCdhJy4uJ3onKS50b19hDQogICAgQHByb2JhYmls aXRpZXMgPSB7fQ0KICAgIGFscGhhYmV0LmVhY2ggeyB8bHwgQHByb2JhYmlsaXRpZXNbbF0gPSAw IH0NCiAgICBAZGljdGlvbmFyeS5lYWNoIGRvIHx3b3JkfA0KICAgICAgd29yZC5lYWNoX2J5dGUg ZG8gfGxldHRlcnwNCiAgICAgICAgI3AgbGV0dGVyDQogICAgICAgIGwgPSBsZXR0ZXIuY2hyDQog ICAgICAgIEBwcm9iYWJpbGl0aWVzW2xdICs9IDEgaWYgYWxwaGFiZXQuaW5jbHVkZT8obCkNCiAg ICAgIGVuZA0KICAgIGVuZA0KICAgIA0KICAgIEBwcm9iYWJpbGl0aWVzID0gQHByb2JhYmlsaXRp ZXMuc29ydCB7fGEsYnwgYVsxXTw9PmJbMV19DQogIGVuZA0KICANCiAgZGVmIGxvYWRfZGljdGlv bmFyeSgpDQogICAgcmV0dXJuIFlBTUwubG9hZF9maWxlKERJQ1RJT05BUllGSUxFKQ0KICBlbmQN CmVuZCAjb2YgUGxheWVyDQoNCmRlZiByYW5kb21fd29yZA0KICB3b3JkcyA9IFlBTUwubG9hZF9m aWxlKCJkaWN0aW9uYXJ5LnlhbWwiKQ0KICByZXR1cm4gd29yZHNbcmFuZCh3b3Jkcy5sZW5ndGgp XQ0KZW5kDQoNCmRlZiBjaGVja19mb3JfbGV0dGVycyh3b3JkLCBndWVzcywgbWFza2VkX3dvcmQp DQogIGlmIHdvcmQuaW5jbHVkZT8oZ3Vlc3MpIHRoZW4NCiAgICAjcHV0cyAiI3tndWVzc30gaXMg aW4gI3t3b3JkfSINCiAgICB3b3JkLmxlbmd0aC50aW1lcyBkbyB8aXwNCiAgICAgIGlmIHdvcmRb aV0uY2hyID09IGd1ZXNzIHRoZW4NCiAgICAgICAgbWFza2VkX3dvcmRbaV0gPSBndWVzcw0KICAg ICAgZW5kDQogICAgZW5kDQogIGVuZA0KICANCiAgcmV0dXJuIG1hc2tlZF93b3JkDQplbmQNCg0K ZGVmIHBsYXlfZ2FtZSh3b3JkID0gIiIsIGxpZmVzID0gNiwgZ2l2ZV9vdXRwdXQgPSBmYWxzZSkN CiAgI3VzZXIgZ2l2ZW4gd29yZA0KICB3b3JkID0gcmFuZG9tX3dvcmQgaWYgd29yZCA9PSAiIg0K ICBtYXNrZWRfd29yZCA9IHdvcmQuZ3N1YigvXHcvLCAiLiIpDQogIGd1ZXNzID0gIiINCg0KICBw bGF5ZXIgPSBQbGF5ZXIubmV3KG1hc2tlZF93b3JkKQ0KDQogIHdoaWxlKGxpZmVzID4gMCkNCiAg ICAjQUkgZ3Vlc3NlcyBhIGxldHRlciBvciB3b3JkDQogICAgcHV0cyAiQUkgaXMgbG9va2luZyBm b3IgPiN7bWFza2VkX3dvcmR9PCIgaWYgZ2l2ZV9vdXRwdXQNCiAgICBndWVzcyA9IHBsYXllci5n dWVzcygpDQogICAgbmV3X3dvcmQgPSAiIg0KICAgIHdvbiA9IGZhbHNlDQogICAgcHV0cyAiQUkg Z3Vlc3NlZCAnI3tndWVzc30nIiAgaWYgZ2l2ZV9vdXRwdXQNCiAgICBpZiBndWVzcy5sZW5ndGgg PT0gMSB0aGVuDQogICAgICBtYXNrZWRfd29yZCA9IGNoZWNrX2Zvcl9sZXR0ZXJzKHdvcmQsIGd1 ZXNzLCBtYXNrZWRfd29yZCkNCiAgICAgIA0KICAgIGVsc2UgDQogICAgICBpZiBndWVzcy5sZW5n dGggPiAxIHRoZW4NCiAgICAgICAgYnJlYWsgaWYgZ3Vlc3MgPT0gd29yZA0KICAgICAgICBsaWZl cyAtPSAxDQogICAgICAgIG5leHQNCiAgICAgIGVsc2UNCiAgICAgICAgI25pbA0KICAgICAgZW5k DQogICAgZW5kDQogICAgDQogICAgI3dyb25nIGd1ZXNzDQogICAgaWYgbm90IG1hc2tlZF93b3Jk LmluY2x1ZGU/KGd1ZXNzKSB0aGVuDQogICAgICBsaWZlcyAtPSAxDQogICAgICBwdXRzICJBSSBs b3N0IGEgbGlmZS4gI3tsaWZlc30gbGlmZXMgbGVmdC4iDQogICAgZWxzZSAgICANCiAgICAgICNm b3VuZCB3b3JkDQogICAgICBpZiBtYXNrZWRfd29yZCA9PSB3b3JkIHRoZW4NCiAgICAgICAgYnJl YWsNCiAgICAgIGVsc2UNCiAgICAgICAgI2ZvdW5kIGEgbGV0dGVyDQogICAgICAgIHBsYXllci53 b3JkID0gbWFza2VkX3dvcmQNCiAgICAgICAgbmV4dA0KICAgICAgZW5kDQogICAgZW5kDQogIGVu ZA0KDQogIGlmIGxpZmVzID4gMCB0aGVuDQogICAgd29uID0gdHJ1ZQ0KICBlbHNlDQogICAgI2dp dmUgd29yZCB0byBwbGF5ZXIgdG8gZXh0ZW5kIGRpY3Rpb25hcnkNCiAgICBwbGF5ZXIud29yZCA9 IHdvcmQNCiAgICB3b24gPSBmYWxzZQ0KICBlbmQNCiAgDQogIHJldHVybiB3b24sIHdvcmQsIGxp ZmVzDQplbmQgI29mIHBsYXlfZ2FtZQ0KDQp3b24gPSBmYWxzZQ0Kd29yZCA9ICIiDQpsaWZlcyA9 IDYNCmlmIEFSR1YubGVuZ3RoID4gMA0KICBBUkdWLmVhY2ggZG8gfGFyZ3wNCiAgICBvcHRpb24g PSBhcmcuc3BsaXQoIj0iKQ0KICAgIGNhc2Ugb3B0aW9uWzBdDQogICAgICB3aGVuICItdyINCiAg ICAgICAgd29yZCA9IG9wdGlvblsxXQ0KICAgICAgd2hlbiAiLWwiDQogICAgICAgIGxpZmVzID0g b3B0aW9uWzFdLnRvX2kNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0Kd29uLCB3b3JkLCBsaWZlcyA9 IHBsYXlfZ2FtZSh3b3JkLCBsaWZlcywgdHJ1ZSkNCg0KaWYgd29uIHRoZW4NCiAgcHV0cyAiQUkg d29uISBJdCBndWVzc2VkIFwiI3t3b3JkfVwiIHdpdGggI3tsaWZlc30gbGlmZXMgbGVmdC4iDQpl bHNlDQogIHB1dHMgIkF3d3chIExvc3QhIEFJIGNvdWxkbid0IGd1ZXNzIFwiI3t3b3JkfVwiLiIN CmVuZA0K ------=_Part_7791_32033177.1184181018598--