Here is a method that removes substrings as they are found.
a = ['1', '1 1', '1 1 1', '1 1 1 2', '1 2 3 1', '1 2', '2 3'] b = a.dup b.size.times do first, *rest = b (rest.any? { |t| t.include? first }) ? b.shift : b.rotate! end b
To find out what is going on, insert
puts "first=\"#{first}\n, rest=#{rest}"
after first,*rest = b . This prints the following (before I reformatted).
first="1", rest=["1 1", "1 1 1", "1 1 1 2", "1 2 3 1", "1 2", "2 3"] first="1 1", rest=["1 1 1", "1 1 1 2", "1 2 3 1", "1 2", "2 3"] first="1 1 1", rest=["1 1 1 2", "1 2 3 1", "1 2", "2 3"] first="1 1 1 2", rest=["1 2 3 1", "1 2", "2 3"] first="1 2 3 1", rest=["1 2", "2 3", "1 1 1 2"] first="1 2", rest=["2 3", "1 1 1 2", "1 2 3 1"] first="2 3", rest=["1 1 1 2", "1 2 3 1"]