примеры свидетельствуют о том, что не все буквы 'и', ' r ',' l ',' d 'должны присутствовать. Я предположил, что строка может содержать любое количество каждой из этих четырех букв (в дополнение к другим допустимым символам). Я также предположил, что «любая комбинация« urld », разделенная на строку, означает, что каждая пара этих четырех символов должна быть разделена одним или несколькими другими разрешенными символами. Это один из способов достижения этой цели:
def check_it(s)
(s.chars.chunk {|c| c =~ /[urld]/}.to_a.size == s.count('urld') &&
s =~ /^[(),\durld]*$/) ? true : false
end
check_it('(0,3),u,r,u,l,u') #=> true
check_it('(0,3),u,r,u,l u') #=> false
check_it('(0,3),u,r,u,lu') #=> false
Пусть выполнено
s = '(0,3),u,r,u,lu'
Тогда
a = s.chars.chunk {|c| c =~ /[urld]/}.to_a
#=> [[0, ["u"]], [0, ["r"]], [0, ["u"]], [0, ["l", "u"]]]
a.size #=> 4
s.count('urld') #=> 5
Как a.size < s.count('urld')
, count_it()
возвращает false
Если вместо этого:
s = '(0,3),u,r,u,l u'
затем
s.chars.chunk {|c| c =~ /[urld]/}.to_a.size
#=> a = [[0, ["u"]], [0, ["r"]], [0, ["u"]], [0, ["l"]], [0, ["u"]]]
# a.size => 5
# 5 == s.count('urld') => true
но
s =~ /^[(),\durld]*$/ #=> nil
так check_it() => false
.
Так близко! Вам просто нужно избегать круглых скобок. – Max
Я не думаю, что вы намеревались, чтобы первые два примера были одинаковыми. Пожалуйста, добавьте '(0,3), u, r, u, lu' к вашим примерам. Я предполагаю, что это «ложь», потому что между двумя последними символами нет промежуточного символа, кроме '[urld]'. –