My solution...
def find_knot letters #returns first and last index which become a
"knot"
letters.each_with_index do |letter1, ind1|
(ind1+4).upto(letters.length - 1) do |ind2|
if (ind2 - ind1) % 2 == 0
if letters[ind2].casecmp(letter1) == 0
return [ind1, ind2]
end
end
end
end
return nil
end
def loop word
letters = word.split(//)
first, last = find_knot letters
if first.nil?
puts "No loop"
else
(letters.length-1).downto(last+1) { |i|
print " "*first
puts letters[i]
}
print letters[0..first+(last-first)/2-1]
puts " "*first
first.times {print " "}
(last-1).downto(first+(last-first)/2) { |i| print letters[i] }
puts
end
end
loop "Mississippi"
puts
loop "Markham"
puts
loop "Yummy"
puts
loop "Dana"
Ruby Quiz wrote:
> The three rules of Ruby Quiz:
>
> 1. Please do not post any solutions or spoiler discussion for this quiz until
> 48 hours have passed from the time on this message.
>
> 2. Support Ruby Quiz by submitting ideas as often as you can:
>
> http://www.rubyquiz.com/
>
> 3. Enjoy!
>
> Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone
> on Ruby Talk follow the discussion. Please reply to the original quiz message,
> if you can.
>
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
> Here's a fun little challenge from the Educational Computing Organization of
> Ontario.
>
> Given a single word as input try to find a repeated letter inside of it such
> that you can loop the text around and reuse that letter. For example:
>
> $ ruby word_loop.rb Mississippi
> i
> p
> p
> Mis
> ss
> si
>
> or:
>
> $ ruby word_loop.rb Markham
> Ma
> ar
> hk
>
> or:
>
> $ ruby word_loop.rb yummy
> yu
> mm
>
> If a loop cannot be made, your code can just print an error message:
>
> $ ruby word_loop.rb Dana
> No loop.
>
>
>