Как сравнить более 3 массивов, чтобы найти тот, который имеет наивысший приоритет

62
8

У меня есть следующие приоритеты хранения набора массивов,

array1 = [1, 2, 1, 2, 3]
array2 = [1, 1, 1, 2, 3]
|
|
|
arrayn = [1, 3, 1, 2, 3]

Я хочу найти самый простой способ узнать переменную массива с наивысшим приоритетом, т.е. 1

Он должен проверять следующим образом:

Если последний элемент любого массива является самым низким, который должен быть возвращен. Если последний элемент из более чем одного массива тот же, то предыдущий элемент этого массива должен быть сопоставлен. В приведенном выше примере последние 3 значения всех трех массивов одинаковы, поэтому он будет проверять второй последний элемент

array1 = 2
array2 = 1
array3 = 3

Поэтому он должен возвращать array2.

Пожалуйста, дайте мне знать, если кто-то не понимает вопрос

Другие примеры

Пример 1

arr1 = [1,1,1,1,3]
arr2 = [3,3,3,3,2]
should return arr2

Пример 2.

arr1 = [2,2,2,1,3]
arr2 = [1,2,1,3,3]
should return arr1, as arr1.last == arr2.last (i.e. 3)
but arr1[3] < arr2[3] i.e. (1 < 3)

спросил(а) 2014-12-10T15:42:00+03:00 5 лет, 2 месяца назад
1
Решение
70

tab = [array1, array2, array3, arrayn]
i = -1
while tab.count != 1 && tab.count + i >= 0
tab = tab.select { |t| t[i] == tab.map { |j| j[i] }.min }
i = i - 1
end
result = tab[0]

ответил(а) 2014-12-10T17:04:00+03:00 5 лет, 2 месяца назад
69

Для массивов одинакового размера (и если я правильно понимаю вопрос), это должно работать:

arrays = [
[1, 2, 1, 1, 3],
[1, 3, 1, 2, 3],
[1, 1, 1, 2, 3],
[1, 3, 1, 1, 3]
]

p arrays[arrays.transpose.reverse.map{|el|
next if el.count(el.min) != 1
el.rindex(el.min)
}.compact[0]]

Результат:

#=> [1, 1, 1, 2, 3]

Шаг за шагом: транспонировать массивы и начинать проверять с последнего фрагмента. Если нет ни одного минимального приоритета, пропустите этот фрагмент (поместите нуль на выходе), если только один - получите его индекс. Удалите все элементы nil и используйте найденный индекс для печати нужного массива.

ОБНОВЛЕНО

Если вы хотите обработать случай, когда исходный массив массивов не имеет ответа, вы можете изменить код следующим образом:

idx = arrays.transpose.reverse.map{|el|
next if el.count(el.min) != 1
el.rindex(el.min)
}.compact[0]

p idx ? arrays[idx] : "no answer"

Результат для [[1,1,1,1,1], [1,1,1,1,2], [2,1,1,1,1], [2,1,1,1,2]] будет:

#=> "no answer"

ответил(а) 2014-12-10T17:43:00+03:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема