Я столкнулся с старой проблемой, с которой вам, по-видимому, нравятся пользователи 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[[email protected][#]&, Tuples[x]]
где argMax такой, как описано здесь:
posmax: как argmax, но дает позицию (позиции) элемента x, для которого f [x] является максимальным
Можете ли вы придумать что-то лучше? Легендарный Карл Волл прибил это для меня, и я раскрою его решение через неделю.