Я только обратиться к первой части вашего вопроса, поскольку я не понимаю, что вы подразумеваете под «Еще лучше было бы, если бы он мог переходить через обе колонки к как можно больше предотвратите два числа подряд ... ». Предложение «как можно больше» особенно хлопотно, поскольку оно относится к неопределенному критерию.
Позвольте arr
быть вашим массивом. Элементы сортируются в вашем примере, но если они не были, то первым шагом будет:
arr.sort!
См Array#sort! и Array#<=> для объяснения того, как рубин сортирует массивы, элементы которых являются массивы.
Существует множество способов получения желаемого заказа.Вот один, который использует Enumerable#chunk:
arr.chunk(&:first).flat_map {|_,a| a.map.with_index {|i,b| [b,i]}}.sort.map(&:last)
#=> [[1, 2], [2, 3], [3, 4], [1, 3], [2, 4], [1, 4]]
меры заключаются в следующем:
e = arr.chunk(&:first)
#=> #<Enumerator: #<Enumerator::Generator:0x007fa01a8141d0>:each>
Мы можем увидеть элементы этого интервьюером, которые передаются в блок с помощью Enumerator#each (который вызывает Array#each), путем преобразования его в массив:
e.to_a
#=> [[1, [[1, 2], [1, 3], [1, 4]]], [2, [[2, 3], [2, 4]]], [3, [[3, 4]]]]
Дальнейшего:
f = e.flat_map { |_,a| a.map.with_index { |i,b| [b,i] } }
#=> [[0, [1, 2]], [1, [1, 3]], [2, [1, 4]], [0, [2, 3]], [1, [2, 4]], [0, [3, 4]]]
g = f.sort
#=> [[0, 1, 2], [0, 2, 3], [0, 3, 4], [1, 1, 3], [1, 2, 4], [2, 1, 4]]
g.map(&:last)
#=> [[1, 2], [2, 3], [3, 4], [1, 3], [2, 4], [1, 4]]
Давайте более внимательно посмотреть на расчет f
:
h = e.flat_map
#=> #<Enumerator: #<Enumerator: #<Enumerator::Generator:0x007fa01a8141d0>:each>:flat_map>
h.to_a
#=> [[1, [[1, 2], [1, 3], [1, 4]]], [2, [[2, 3], [2, 4]]], [3, [[3, 4]]]]
Вы можете думать о h
как «соединение» переписчиком.
Первое значение h
, [1, [[1, 2], [1, 3], [1, 4]]]
, передается в блок и захвачен блоками переменных с помощью параллельных (или кратного) назначения:
i, a = h.next
#=> [1, [[1, 2], [1, 3], [1, 4]]]
i #=> 1
a #=> [[1, 2], [1, 3], [1, 4]]
В i
не используются в вычисление блока, принято заменять эту переменную блока локальной переменной _
.
Теперь мы можем выполнить расчет блока:
a.map.with_index { |i,b| [b,i] }
#=> [[0, [1, 2]], [1, [1, 3]], [2, [1, 4]]]
Остальные расчеты выполняются аналогично.
Я не понимаю, как ездить на велосипеде через обе колонки, поэтому не может написать решение для этого. –
Имеет ли значение расстояние между соседними предметами, или это просто, что для них лучше быть другим? – sawa
Велоспорт не обеспечивает и не увеличивает чередование. Например, '[1, 1, 1, 1, 2, 3, 4]' приведет к '[1, 2, 3, 4, 1, 1, 1]' (три 1 в конце), хотя вы может упорядочить числа без повторения: '[1, 2, 1, 3, 1, 4, 1]' – Stefan