Из-за перекрывающихся терминов вам нужно сделать грубую силу, насколько я могу сказать:
def matched(find, list)
list.flat_map { |e| find.flat_map { |f| e.scan(f) } }.uniq
end
На практике:
matched(%w[ fire tree worm rest ], %w[ firestorm peanut earthworm ])
# => ["fire", "rest", "worm"]
Где здесь %w
используется какболее быстрый способ выражения списков.
Приближенное использование scan
и flat_map
:
def matched(find, list)
rx = Regexp.union(find)
list.flat_map { |e| e.scan(rx) }.uniq
end
При использовании Rexexp.union
вы можете создать регулярное выражение, которое выполняется довольно быстро по сравнениюк отдельным тестам.
Где это не так точно:
matched(%w[ fire tree worm rest ], %w[ firestorm peanut earthworm ])
# => ["fire", "worm"]