Начиная с исправления вашей программы.Прежде всего, вы говорите, что принимаете массивы строк, но if a1 == '' || a2 == ''
проверяет, передали ли вы пустые строки.Ввод -1
, а не return -1
, по сути, ничего не делает.
Я предполагаю, что ошибка находится в этой строке (у вас есть строка в stacktrace, поэтому main.rb:10:in 'mxdiflg'
, поэтому строка 10 для вас):
a_total = a1_order.reverse[0].length - a2_order[0].length
Как будто ваш массив пуст, ваш array[0]
будет nil
, поэтому вы не можете вызвать .length
(как подсказывает вставленная вами ошибка).
Что касается отладки, в какой-то момент вам придется освоиться с использованием Pry , но пока этого должно быть достаточно, чтобы вы проверили номер строки и сообщение об ошибке.В этом случае совершенно ясно, что вы вызываете .length
для nil
, поэтому ваш a1_order[0]
должен быть nil
, поэтому ваш массив должен быть пустым.Вы также можете добавить сообщения о простом размещении, например:
puts "a1_order: #{a1_order}"
puts "a2_order: #{a2_order}"
a_total = a1_order.reverse[0].length - a2_order[0].length
b_total = a2_order.reverse[0].length - a1_order[0].length
Теперь при запуске вашей программы вы можете просматривать отсортированные массивы, и должно быть совершенно ясно, что вы пытаетесь вызывать методы на nil
s.
Теперь, когда это будет рассмотрено, мы можем попытаться сделать вашу программу немного лучше.Прежде всего, как я уже говорил, ваша первая проверка не имеет особого смысла.Давайте превратим его в:
return -1 if [a1,a2].any?(&:empty)
, который фактически вернется из вашего метода с -1
, если какой-либо из массивов пуст.
Идем дальше:
a1_order = a1.sort{|left, right| left.length <=> right.length}
можно записать как:
a1_order.sort_by(&:length)
Вызов
a1_order.reverse[0]
немного неэффективен, так как он создаст копию вашего массива в обратном порядке, вы можете просто сделать a1_order.last
вместо этого.
Если вы ищете максимальные / минимальные значения, вы можете использовать Enumerable # max_by / Enumerable # min_by примерно так:
a_total = a1.max_by(&:length).length - a2.min_by(&:length).length
b_total = a2.max_by(&:length).length - a1.min_by(&:length).length
И получить более высокое значение можно с помощью Array # max :
[a_total, b_total].max
Обернув все это вместе, ваш метод может выглядеть так:
def mxdiflg(a1, a2)
return -1 if [a1, a2].any?(&:empty?)
a_total = a1.max_by(&:length).length - a2.min_by(&:length).length
b_total = a2.max_by(&:length).length - a1.min_by(&:length).length
[a_total, b_total].max
end