Чтобы определить проблему с вашим кодом, полезно сначала отформатировать его должным образом.
def sequence_search(word, key)
arr = []
i = 0
while i < word.length
word[i].include?(key)
arr >> word[i]
end
i += 1
end
if arr.join == key # line raising exception
return true
else
false
end
end
Как видите, метод не заканчивается там, где вы думали, и есть лишний end
. Вот некоторые из проблем:
-
while
l oop никогда не закончится, потому что i
не увеличивается в пределах цикла; arr >> word[i]
должно быть arr << word[i]
word[i].include?(key)
не имеет эффекта, так как возвращаемое значение не используется (вы можете захотеть arr << word[i] if word[i].include?(key)
); - logi c неверен: после исправления кода если
word = "acat"
(который содержит "cat"
), вы пытаетесь построить массив arr #=> ["a", "c", "a", "t"]
, к которому вы присоединитесь (чтобы получить "acat"
) и сравнить с "cat"
(if arr.join == key
), что (ошибочно) потерпеть поражение.
Вот два способа написать метод.
Используйте String#index
для перехода по word
для поиска каждого символа key
def sequence_search(word, key)
i = -1
key.each_char.all? { |c| i = word.index(c,i+1) }
end
sequence_search("arcata", "cat") #=> true
sequence_search("c1a2t3", "cat") #=> true
sequence_search("cta", "cat") #=> false
sequence_search("coat", "cat") #=> true
См. String # index , уделяя особое внимание необязательному второму аргументу, смещению в строке, в котором поиск должен начаться.
Используйте регулярное выражение
def sequence_search(word, key)
word.match?(/#{key.chars.join(".*")}/)
end
sequence_search("arcata", "cat") #=> true
sequence_search("c1a2t3", "cat") #=> true
sequence_search("cta", "cat") #=> false
sequence_search("coat", "cat") #=> true
Когда key = "cat"
,
/#{key.chars.join(".*")}/
#=> /c.*a.*t/
Регулярное выражение гласит: «соответствует 'c', за которым следует ноль или более символов, за которыми следует 'a', за которым следует ноль или более символов, за которыми следует 't'.