昨日質問した
同じ数同士線で結んだとき、交点ができるか否かの判定について
の一般化を考えてみました。

ary1 = [1, 1, 2, 3, 3, 3, 2, 2, 1]
を考えることにします。
1と1を左から順番に飛ばさず上側で結びます。
同様に2と2を、3と3を飛ばさず上側で結びます。
(無理やり結んだ曲線を交差させないかぎり)
交点は0個です。

一方
ary2 = [1, 1, 3, 2, 3, 3, 2, 2, 1]
を考えることにします。
ary1 で行った操作を行うと
交点ができます。

このように、
ary の中に1~nまでの数字がk個ずつあり、
同じ数字同士左から順番に飛ばさず上側で結んだとき、
交点ができるか否かの判定をするには
どうすればいいでしょうか?

とりあえず、
同じ数同士線で結んだとき、交点ができるか否かの判定について
のunarist さんの回答を元に以下のようなコードを書いてみました。

def test_intersect(ary, n, k)
  c_ary = Array.new(n, 0)
  stack = []
  ary.each{|i|
    if stack.last == i && c_ary[i - 1] == k - 1
      stack.pop
    else
      c_ary[i - 1] += 1
      stack << i if stack.last != i
    end
  }
  stack == []
end

p test_intersect([1, 3, 3, 2, 2, 1], 3, 2)
p test_intersect([1, 3, 2, 3, 2, 1], 3, 2)
p test_intersect([1, 1, 2, 3, 3, 3, 2, 2, 1], 3, 3)
p test_intersect([1, 1, 3, 2, 3, 3, 2, 2, 1], 3, 3)
p test_intersect([1, 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1], 3, 4)
p test_intersect([1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 1], 3, 4)