Я столкнулся со старой проблемой, которая, вероятно, понравится вам, ребята из 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] является максимальным
Можете ли вы что-нибудь придумать лучше? Легендарный Карл Уолл придумал это для меня, и я раскрою его решение через неделю.