Поместите числа в круг, как часы.Теперь создайте логический крест, скажем, в 12, 3, 6 и 9 часов.Поставьте 12 на первое число.Теперь найдите, какие числа будут ближайшими к 3, 6 и 9 часам, и запишите сумму расстояний этих трех чисел рядом с первым числом.
Выполните итерацию, вращая верхнюю часть вашего креста -12 часов - по часовой стрелке, пока точно не совпадет со следующим номером.Снова измерьте расстояние до ближайших чисел к каждой из трех других точек пересечения и запишите этот результат рядом с текущим 12-часовым номером.
Повторяйте, пока не достигнете того, что ваш 12-часовой поворот повернут полностью к исходным 3-м часам, после чего вы закончите.Независимо от того, какое число назначено наименьшей сумме, оно определяет конфигурацию выигрыша.
Это решение обобщает любой диапазон значений R и любого числа N конечных точек, до которого вы хотите уменьшить набор.Каждая точка на «кресте» находится на расстоянии R / N друг от друга, и вам нужно только вращать, пока вершина вашего креста не достигнет того места, где следующий рычаг находился в исходном положении.Таким образом, если вы хотите получить 6 точек, у вас будет 6-точечный крест, каждый с шагом 60 градусов, а не 4-точечный крест с углом 90 градусов.Если ваш диапазон отличается, вы все равно выполняете ту же операцию.Таким образом, вам не нужны физические часы и кросс для реализации этого алгоритма: он работает для любых R и N.
Мне не нравится этот ответ с точки зрения Perl, так как мне не удалось включитьлюбые знаки доллара в решении.:)