Оптимальный выбор одного элемента из каждого списка

Я столкнулся со старой проблемой, которая, вероятно, понравится вам, ребята из Mathematica / StackOverflow, и которая кажется ценной для будущих поколений в StackOverflow.

Предположим, у вас есть список. списков, и вы хотите выбрать по одному элементу из каждого и поместить их в новый список, чтобы количество элементов, идентичных их следующему соседу, было максимальным. Другими словами, для полученного списка l минимизируйте Length @ Split [l]. Другими словами, нам нужен список с наименьшим количеством прерываний идентичных смежных элементов.

Например:

pick[{ {1,2,3}, {2,3}, {1}, {1,3,4}, {4,1} }]
 --> {    2,      2,    1,     1,      1   }

(Или {3,3,1,1,1} одинаково хорошо.)

Вот абсурдное решение грубой силы:

pick[x_] := argMax[-Length@Split[#]&, Tuples[x]]

где argMax описан здесь:
posmax: как argmax, но дает позицию (я) элемента x, для которого f [x] является максимальным

Можете ли вы что-нибудь придумать лучше? Легендарный Карл Уолл придумал это для меня, и я раскрою его решение через неделю.

14
задан Community 23 May 2017 в 11:47
поделиться