В рубине, как я тестирую тот один массив не только, имеет элементы другого массива, но и содержите их в том особом порядке?
correct_combination = [1, 2, 3, 4, 5]
[1, 5, 8, 2, 3, 4, 5].function_name(correct_combination) # => false
[8, 10, 1, 2, 3, 4, 5, 9].function_name(correct_combination) # => true
Я пытался использовать include
, но это используется, чтобы протестировать ли [1,2,3].include?(2)
верно или нет.
Вы можете использовать метод each_cons:
arr = [1, 2, 3, 4, 5]
[1, 5, 8, 2, 3, 4, 5].each_cons(arr.size).include? arr
В этом случае он будет работать для любых элементов.
Возможно, <=> - это то, что вы ищете.
Comparison-Returns an integer (-1, 0, or +1) if this array is less than, equal to, or greater than other_array
a = [1, 2, 3, 4, 5]
b = [1, 5, 8, 2, 3, 4, 5]
c = [8, 10, 1, 2, 3, 4, 5, 9]
puts a <=> b # => -1
puts a <=> c # => -1
puts a <=> a # => 0
Update: неважно, просто отметил, что ему не важна позиция.
puts a <=> a.reverse # => -1
Вы можете просто сравнить массивы как строки:
correct_combination = [1, 2, 3, 4, 5]
yep = [8, 10, 1, 2, 3, 4, 5, 9]
nope = [1, 5, 8, 2, 3, 4, 5]
if yep.to_s.include?(correct_combination.to_s)
puts "yep"
end
if nope.to_s.include?(correct_combination.to_s)
puts "nope"
end
Это лучшее, что я мог придумать. Все вызовы return
немного уродливы, но это должно быть быстрее, чем сравнение строк, если это большие массивы.
class Array
def same?(o)
if self.size == o.size
(0..self.size).each {|i| return false if self[i] != o[i] }
else
return false
end
return true
end
end
a = [1,2,3,4,5]
b = [1, 5, 8, 2, 3, 4, 5]
c = [1, 2, 6, 4, 5]
puts a.same?(a.reverse) # => false
puts a.same?(a) # => true
puts a.same?(b) # => false
puts a.same?(c) # => false
Не совсем лучшее возможное решение, но, по крайней мере, оно краткое
(',' + [1, 5, 8, 2, 3, 4, 5].join(',') + ',').include?(',' + correct_combination.join(',') + ',')
Лучшим возможным решением было бы использовать один из алгоритмов поиска строк в массиве, но вам придется кодировать его самостоятельно, я не понимаю не думаю, что есть стандартное решение.
Если вы хотите игнорировать порядок (как я сделал, когда наткнулся на этот пост), вы можете использовать Array.sort и <=> http://ruby-doc.org/core-1.8.7/classes/Array.html#M000316
a = [1, 2, 3, 4, 5]
b = [2, 1, 5, 4, 3]
a.sort <=> b.sort
Затем вам нужно проверить, что выходное значение равно 0.