William James
1/3/2007 8:37:00 PM
Ruby Quiz wrote:
> Today's quiz would've been most useful in elementary school, where over half of
> the homework assignments were word search puzzles. The concept of these puzzles
> is simple enough that an elementary school student could understand it: given a
> box of letters, find a line containing the letters of a specified word in order.
>
> For example, find the words ruby, dan, rocks, and matz in the following text:
>
> U E W R T R B H C D
> C X G Z U W R Y E R
> R O C K S B A U C U
> S F K F M T Y S G E
> Y S O O U N M Z I M
> T C G P R T I D A N
> H Z G H Q G W T U V
> H Q M N D X Z B S T
> N T C L A T N B C E
> Y B U R P Z U X M S
>
> The correct answer in the correct output format:
>
> + + + R + + + + + +
> + + + + U + + + + +
> R O C K S B + + + +
> + + + + + + Y + + +
> + + + + + + + + + M
> + + + + + + + D A N
> + + + + + + + T + +
> + + + + + + Z + + +
> + + + + + + + + + +
> + + + + + + + + + +
If you don't want snaking, put "--straight" on the command line.
def write ary
ary.each{|c,row,col| $out[row][col] = c }
end
def outside y, x
y<0 or y>=Board.size or x<0 or x>=Board.first.size
end
def snake letters, row, col, directions, placed
return if letters[0] != Board[row][col]
placed << [letters[0],row,col]
if letters.size == 1
write placed
return
end
directions.each{|dy,dx|
y = row + dy ; x = col + dx
next if outside( y, x )
snake letters[1..-1], y, x, directions, placed.dup
}
end
straight = ARGV.delete '--straight'
puts "Enter grid line by line, followed by blank line."
Board = []
while (line = gets.strip.upcase) != "" do
Board << line
end
puts "Enter words separated by commas."
words = gets.strip.upcase.split(/\s*,\s*/)
$out = Board.map{|s| "+" * s.size}
all_directions = (-1..1).inject([]){|a,m| (-1..1).each{|n|
a<<[m,n]}; a}
all_directions.delete [0,0]
Board.each_index{|row|
Board[0].size.times{|col|
words.each{|word|
if straight
all_directions.each{|direction|
snake word, row, col, [direction], []
}
else
snake word, row, col, all_directions, []
end
}
}
}
puts "", $out.map{|s| s.split('').join(' ') }