From: tho_mica_l Date: 2007-12-10T05:35:07+09:00 Subject: Re: Word Loop (#149) [SOLUTION] Here is my first solution. By default, it finds the smallest circle. If you remove one line, it will find all simple loops. Thomas. #!/usr/bin/env ruby # Author:: Thomas Link (micathom AT gmail com) # Created:: 2007-12-08. class Quiz149 Solution = Struct.new(:idx, :width, :height) def initialize(word) @word = word @wordic = word.downcase @wordsize = word.size @solutions = [] end def find_solutions for height in 1 .. (@wordsize - 4) for width in 1 .. (@wordsize - 2 * height - 2) for idx in 0 .. (@wordsize - 2 * height - 2 * width - 1) if @wordic[idx] == @wordic[idx + width * 2 + height * 2] @solutions << Solution.new(idx, width, height) return self # Remove this line to find all solutions end end end end self end def print_solutions if @solutions.empty? puts 'No loop.' puts else @solutions.each_with_index do |sol, sol_idx| canvas_x = sol.idx + sol.width + 1 canvas_y = @wordsize - sol.idx - sol.height - 2 * sol.width canvas = Array.new(canvas_y) {' ' * canvas_x} pos_x = -1 pos_y = canvas_y - sol.height - 1 @word.scan(/./).each_with_index do |char, i| if i <= sol.idx + sol.width pos_x += 1 elsif i <= sol.idx + sol.width + sol.height pos_y += 1 elsif i <= sol.idx + 2 * sol.width + sol.height pos_x -= 1 else pos_y -= 1 end if canvas[pos_y][pos_x] == 32 canvas[pos_y][pos_x] = char end end puts canvas.join("\n") puts end end self end end if __FILE__ == $0 if ARGV.empty? Quiz149.new('Mississippi').find_solutions.print_solutions Quiz149.new('Markham').find_solutions.print_solutions Quiz149.new('yummy').find_solutions.print_solutions Quiz149.new('Dana').find_solutions.print_solutions else ARGV.each {|w| Quiz149.new(w).find_solutions.print_solutions} end end