```On 09/12/2007, Ken Bloom <kbloom / gmail.com> wrote:
>
> def loopword word
>   matchinfo=
>     word.match(/(.*?)(.)(.(?:..)+?)\2(.*)/i)
>   if matchinfo
>     _,before,letter,looplets,after=matchinfo.to_a
>     looplets=looplets.split(//)
>     puts before+letter+looplets.shift
>     until looplets.empty?
>     end
>   else
>     puts "No loop."
>   end
> end
>
> loopword "Mississippi"
> puts
> loopword "Markham"
> puts
> loopword "yummy"
> puts
> loopword "Dana"
> puts
> loopword "Organization"
>
>
> outputs:
>
>  i
>  p
>  p
> Mis
>  ss
>  si
>
> Ma
> ar
> hk
>
> yu
> mm
>
> No loop.
>
> n
> Or
> ig
> ta
> an
> zi
>
> (The last is a testcase which makes sure that I get the #shifts and #pops
> right)
>

I thought this one is too easy once you understand what it is about
but people always come up with difficult solutions. I wish I knew what
the regexp does :S

For those who cannot understand it either:

def indexes l, i
res = []
ptr = 0
while (ptr = l.index i, ptr)
res << ptr
ptr+=1
end
res
end
# .
#.c1=c5..c2
# .       .
# c4.....c3
def draw_loop word, c1, c5
length = (c5 - c1) -4
width = length/4
height = length/2 - width
word = word[0..0].upcase + word[1..-1]
c2 = c1 + width +1
c3 = c2 + height +1
c4 = c3 + width +1
word[(c5+1)..-1].reverse.scan(/./).map{|c| " "*c1 + c + "\n"}.join +
word[0..c2] + "\n" +
(1..height).map{|i| " "*c1 + word[c5 - i].chr + " "*width +
word[c2 + i].chr + "\n"}.join +
" "*c1 + word[c3..c4].reverse + "\n"
end
def wloop word
word=word.downcase
tried=[]
ptr=0
while ptr < word.length
if tried.include? word[ptr]
ptr+=1
next
end
char = word[ptr]
tried << char
pos = indexes word, char
next unless pos.length > 1
i, j = 0
while i < pos.length - 1
j=pos.length - 1
while j > i
diff = pos[j] - pos[i]
if (diff)>=4 && (diff) % 2 == 0
return draw_loop word, pos[i], pos[j]
end
j-=1
end
i+=1
end
ptr += 1
end
"No loop \n"
end

```