require 'test/unit'
class Array
def sex_partition
m, f, g, i = 0, size - 1, size - 2, 0
while i <= f && (g > m && g < f) do
if self[i] == 'm'
m+=1
i+=1
elsif self[i] == 'f'
swap(i, f)
f-=1
if f == g
swap(g, g-1)
g-=1
end
else
swap(i, g)
g-=1
end
end
self
end
def swap(s, d)
self[s], self[d] = self[d], self[s]
end
end
class TestPartitioning < Test::Unit::TestCase
def test_solution
pool = %w(m m f g f m f g m m g f)
assert_equal %w(m m m m m g g g f f f f), pool.sex_partition
end
def test_another_solution
pool = %w(g m f g f g f g f m g f)
assert_equal %w(m m g g g g g f f f f f), pool.sex_partition
end
end