From: Alex Watt Date: 2007-01-03T09:59:12+09:00 Subject: [QUIZ] Solution #2 This is probably a better solution than my first, but you can be the judge of that. class Wordsearch DIRECTIONS = [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,-1],[-1,1]] def initialize(wordsearch,words) @words = words @rows = wordsearch.split(/\s+/).delete_if { |row| row == "" } @points = {} @letterPositions = [] @rows.each_with_index do |row,y| row.split(//).each_with_index do |letter,x| @points[[x,y]] = letter end end end def solve @words.each { |word| search(word) } end def printWordsearch @rows.each_with_index do |row,y| row.split(//).each_with_index do |letter,x| print @letterPositions.include?([x,y]) ? letter : "+" end puts end end private def search(word) points(word[0].chr).each do |point| DIRECTIONS.each do |direction| possiblePoints = [point] point2 = point for i in (1...word.length) if checkNext(point2,word[i].chr,direction) or word[i].chr == "*" or @points[(point2.to_p + direction.to_p).to_a] == "*" # wildcard character = * possiblePoints.push((point2 = (point2.to_p + direction.to_p).to_a)) end end @letterPositions += possiblePoints if possiblePoints.length == word.length end end end def points(aLetter) points = [] @points.each do |point,letter| points.push(point) if aLetter == letter end points end def checkNext(point,letter,direction) @points[(point.to_p + direction.to_p).to_a] == letter end end class Array def to_p Point.new(self[0].to_i,self[1].to_i) end end class Point attr_reader :x,:y def initialize(x,y) @x,@y = x,y end def +(point) Point.new(@x + point.x,@y + point.y) end def to_a [@x,@y] end end wordsearch = "" loop do row = gets.chomp wordsearch += row + "\n" break if row == "" end words = gets.chomp.split(/\s*,\s*/).map { |word| word.upcase.gsub(/\s/,"") } w = Wordsearch.new(wordsearch.upcase,words) w.solve w.printWordsearch _________________________________________________________________ Find sales, coupons, and free shipping, all in one place! �MSN Shopping Sales & Deals http://shopping.msn.com/content/shp/?ctid=198,ptnrid=176,ptnrdata=200639