From: Daniel Finnie Date: 2007-01-08T08:11:47+09:00 Subject: Re: [QUIZ] Word Blender (#108) --Boundary_(ID_i946CdvW4ezDb6K6qusHxA) Content-type: text/plain; charset=ISO-8859-1; format=flowed Content-transfer-encoding: 7BIT I made two this time. One plays a game and one just picks the word. Here's the one that just picks a word. It runs very quickly, about .155 or .2 seconds. #! /usr/bin/ruby -w class Array def rand_elem self[rand(size)] end end # Open and read the dictionary. dict = IO.read("/usr/share/dict/words") # Pick a random word with 6 letters. baseWord = dict.scan(/^[a-z]{6}$/).rand_elem # Find words that use the same letters selectedWords = dict.scan(/^[#{baseWord}]{3,6}$/) # Display the words. puts baseWord + ":\n\t" + selectedWords.join("\n\t") And here's the one that plays a game. Basically, it gives you the letters and you enter the 5 best words you can think of. The score is the length of the word ** 3 added to a running total, but subtracted if the word isn't valid (already said or not in the list). #! /usr/bin/ruby -w class Array def rand_elem self[rand(size)] end def english_join self[0...-1].join(', ') + ', and ' + self[-1] end end class String def letters unless $DEBUG split(//).uniq.sort_by{rand} else split(//) end end end class Game @@dict = nil def initialize # Open and read the dictionary. @@dict ||= IO.read("/usr/share/dict/words") @points = 0 @round = 1 end def play # Pick a random word with 6 letters. baseWord = @@dict.scan(/^[a-z]{6}$/).rand_elem # Find words that use the same letters selectedWords = @@dict.scan(/^[#{baseWord}]{3,6}$/) # Initialize word list & continue var. guessed = [] continue = false # Display banner puts "", "Round #{@round}:", "Enter the 5 longest words you can make from the letters #{baseWord.letters.english_join}.", "Invalid and repeated words count towards the 5 words but subtract points.", "" # Gather all the points, calculate the score, and see if the player should go to the next round. 5.times do print "#{@points}\t" word = gets.chomp.downcase if !guessed.include?(word) && selectedWords.include?(word) @points += word.length ** 3 guessed << word continue = true if word.length == 6 else @points -= word.length ** 3 end end # Go on to the next round or lose. if continue @round += 1 play else puts "Sorry, you didn't get a 6 letter word. You got #{@points} points, however." end end end Game.new.play Ruby Quiz wrote: > This is a riff on the Jumble puzzle found in many (US) newspapers. More > specifically, it's based on the game TextTwist[1], made by GameHouse[2] and > published in various places around the web. --Boundary_(ID_i946CdvW4ezDb6K6qusHxA) Content-type: application/x-ruby; name=wordjumblefast.rb Content-transfer-encoding: base64 Content-disposition: inline; filename=wordjumblefast.rb IyEgL3Vzci9iaW4vcnVieSAtdwoKY2xhc3MgQXJyYXkKCWRlZiByYW5kX2VsZW0KCQlzZWxm W3JhbmQoc2l6ZSldCgllbmQKZW5kCgojIE9wZW4gYW5kIHJlYWQgdGhlIGRpY3Rpb25hcnku CmRpY3QgPSBJTy5yZWFkKCIvdXNyL3NoYXJlL2RpY3Qvd29yZHMiKQoKIyBQaWNrIGEgcmFu ZG9tIHdvcmQgd2l0aCA2IGxldHRlcnMuCmJhc2VXb3JkID0gZGljdC5zY2FuKC9eW2Etel17 Nn0kLykucmFuZF9lbGVtCgojIEZpbmQgd29yZHMgdGhhdCB1c2UgdGhlIHNhbWUgbGV0dGVy cwpzZWxlY3RlZFdvcmRzID0gZGljdC5zY2FuKC9eWyN7YmFzZVdvcmR9XXszLDZ9JC8pCgoj IERpc3BsYXkgdGhlIHdvcmRzLgpwdXRzIGJhc2VXb3JkICsgIjpcblx0IiArIHNlbGVjdGVk V29yZHMuam9pbigiXG5cdCIp --Boundary_(ID_i946CdvW4ezDb6K6qusHxA) Content-type: application/x-ruby; name=wordjumblegame.rb Content-transfer-encoding: base64 Content-disposition: inline; filename=wordjumblegame.rb IyEgL3Vzci9iaW4vcnVieSAtdwoKY2xhc3MgQXJyYXkKCWRlZiByYW5kX2VsZW0KCQlzZWxm W3JhbmQoc2l6ZSldCgllbmQKCQoJZGVmIGVuZ2xpc2hfam9pbgoJCXNlbGZbMC4uLi0xXS5q b2luKCcsICcpICsgJywgYW5kICcgKyBzZWxmWy0xXQoJZW5kCmVuZAoKY2xhc3MgU3RyaW5n CglkZWYgbGV0dGVycwoJCXVubGVzcyAkREVCVUcKCQkJc3BsaXQoLy8pLnVuaXEuc29ydF9i eXtyYW5kfQoJCWVsc2UKCQkJc3BsaXQoLy8pCgkJZW5kCgllbmQKZW5kCgpjbGFzcyBHYW1l CglAQGRpY3QgPSBuaWwKCQoJZGVmIGluaXRpYWxpemUKCQkjIE9wZW4gYW5kIHJlYWQgdGhl IGRpY3Rpb25hcnkuCgkJQEBkaWN0IHx8PSBJTy5yZWFkKCIvdXNyL3NoYXJlL2RpY3Qvd29y ZHMiKQoJCQoJCUBwb2ludHMgPSAwCgkJQHJvdW5kID0gMQoJZW5kCgoJZGVmIHBsYXkKCQkj IFBpY2sgYSByYW5kb20gd29yZCB3aXRoIDYgbGV0dGVycy4KCQliYXNlV29yZCA9IEBAZGlj dC5zY2FuKC9eW2Etel17Nn0kLykucmFuZF9lbGVtCgoJCSMgRmluZCB3b3JkcyB0aGF0IHVz ZSB0aGUgc2FtZSBsZXR0ZXJzCgkJc2VsZWN0ZWRXb3JkcyA9IEBAZGljdC5zY2FuKC9eWyN7 YmFzZVdvcmR9XXszLDZ9JC8pCgkJCgkJIyBJbml0aWFsaXplIHdvcmQgbGlzdCAmIGNvbnRp bnVlIHZhci4KCQlndWVzc2VkID0gW10KCQljb250aW51ZSA9IGZhbHNlCgkJCgkJIyBEaXNw bGF5IGJhbm5lcgoJCXB1dHMgIiIsCgkJCSJSb3VuZCAje0Byb3VuZH06IiwKCQkJIkVudGVy IHRoZSA1IGxvbmdlc3Qgd29yZHMgeW91IGNhbiBtYWtlIGZyb20gdGhlIGxldHRlcnMgI3ti YXNlV29yZC5sZXR0ZXJzLmVuZ2xpc2hfam9pbn0uIiwKCQkJIkludmFsaWQgYW5kIHJlcGVh dGVkIHdvcmRzIGNvdW50IHRvd2FyZHMgdGhlIDUgd29yZHMgYnV0IHN1YnRyYWN0IHBvaW50 cy4iLAoJCQkiIgoJCQoJCSMgR2F0aGVyIGFsbCB0aGUgcG9pbnRzLCBjYWxjdWxhdGUgdGhl IHNjb3JlLCBhbmQgc2VlIGlmIHRoZSBwbGF5ZXIgc2hvdWxkIGdvIHRvIHRoZSBuZXh0IHJv dW5kLgoJCTUudGltZXMgZG8KCQkJcHJpbnQgIiN7QHBvaW50c31cdCIKCQkJd29yZCA9IGdl dHMuY2hvbXAuZG93bmNhc2UKCQkJaWYgIWd1ZXNzZWQuaW5jbHVkZT8od29yZCkgJiYgc2Vs ZWN0ZWRXb3Jkcy5pbmNsdWRlPyh3b3JkKQoJCQkJQHBvaW50cyArPSB3b3JkLmxlbmd0aCAq KiAzCgkJCQlndWVzc2VkIDw8IHdvcmQKCQkJCWNvbnRpbnVlID0gdHJ1ZSBpZiB3b3JkLmxl bmd0aCA9PSA2CgkJCWVsc2UKCQkJCUBwb2ludHMgLT0gd29yZC5sZW5ndGggKiogMwoJCQll bmQKCQllbmQKCQkKCQkjIEdvIG9uIHRvIHRoZSBuZXh0IHJvdW5kIG9yIGxvc2UuCgkJaWYg Y29udGludWUKCQkJQHJvdW5kICs9IDEKCQkJcGxheQoJCWVsc2UKCQkJcHV0cyAiU29ycnks IHlvdSBkaWRuJ3QgZ2V0IGEgNiBsZXR0ZXIgd29yZC4gIFlvdSBnb3QgI3tAcG9pbnRzfSBw b2ludHMsIGhvd2V2ZXIuIgoJCWVuZAoJZW5kCmVuZAoKR2FtZS5uZXcucGxheQ== --Boundary_(ID_i946CdvW4ezDb6K6qusHxA)--