Assuming I have to (small-to-medium) arrays:
tokens = ["aaa", "ccc", "xxx", "bbb", "ccc", "yyy", "zzz"]
template = ["aaa", "bbb", "ccc"]
How can I determine whether tokens
contains all entries of template
, in that same order?
(Note that in the example above, the first "ccc" should be ignored, resulting in a match due to the last "ccc".)
This works for your sample data.
tokens = ["aaa", "ccc", "xxx", "bbb", "ccc", "yyy", "zzz"]
template = ["aaa", "bbb", "ccc"]
pos = 0
condition_met = true
template.each do |temp|
if (tpos = tokens[pos..-1].index temp) == nil then
break condition_met = false
else
pos = tpos
end
end
puts condition_met
Cleanest, I think, to do this via recursion:
class Array
def align(other)
if pos = index(other.first)
other.size == 1 || slice(pos..-1).align(other.drop(1))
end
end
end
so:
[1,2,3,4,3,2,1].align([1,2,3])
=> true
[1,2,3,4,3,2,1].align([1,4,1])
=> true
[1,2,3,4,3,2,1].align([1,4,2,3])
=> nil
Solution provided by manatwork is good, but here is one that seems more ruby-ish to me:
tokens = ["aaa", "ccc", "xxx", "bbb", "ccc", "yyy", "zzz"]
template = ["aaa", "bbb", "ccc"]
def tokens_include_template(tokens, template)
tokens = tokens.to_enum
template.each do |t|
return false unless loop { break true if t == tokens.next }
end
true
end
puts tokens_include_template(tokens, template)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With