Некоторое время я играл с этим, основываясь на ответе @pierr, и закончил с этим.
a = ["al","al","lc","lc","lc","lc","ld"]
b = ["al","al","al","al","al","lc","ef"]
result=[]
h1,h2=Hash.new(0),Hash.new(0)
a.each{|x| h1[x]+=1}
b.each{|x| h2[x]+=1}
h1.each_pair{|key,val| result<<[key]*[val,h2[key]].min if h2[key]!=0}
result.flatten
=> ["al", "al", "lc"]
Это может быть своего рода многосетевое пересечение a
& b
, но не верьте мне на слово, потому что я не проверил это достаточно, чтобы быть уверенным.