Ваш i
равен order1.length
после вашего цикла, поэтому последняя строка вашего метода в основном
order1[order1.length] * order1[order1.length] == order2[order1.length]
что (при условии, что ваши массивы одинаковой длины):
nil * nil == nil
который выдает ошибку. Не уверен, зачем вам последняя строка, если вы удалите ее и просто вернете счетчик, ваш метод будет работать как положено, если вы используете выделенный счетчик для элементов, которые соответствуют вашему условию, вместо использования индекса для этого (ваш индекс должен увеличиваться всегда):
def comp(array1, array2)
order1 = array1.sort
order2 = array2.sort
i = 0
counter = 0
while i < order1.length
if order1[i] * order1[i] == order2[i]
counter += 1
end
i += 1
end
counter
end
В Ruby довольно часто используются правильные перечислители для перебора коллекций, поэтому ваш while
может быть заменен на Enumerable # each_with_index :
def comp(array1, array2)
order1 = array1.sort
order2 = array2.sort
counter = 0
order1.each_with_index do |el, i|
if el * el == order2[i]
counter += 1
end
end
counter
end
И в качестве последнего шага мы также можем Array # count сколько элементов в массиве соответствует определенному условию без необходимости указывать локальную переменную, например:
def comp(array1, array2)
order2 = array2.sort
array1.sort.each_with_index.count { |el, i| el ** 2 == order2[i] }
end