Рассмотрим перестановку целочисленных значений из 1
в N
. Например, этот пример для N = 4
:
[1, 3, 4, 2]
Мы будем считать этот список циклическим, таким, что 1
и 2
рассматриваются как смежные. Одна величина, которую мы можем вычислить для такого списка - это общая квадратичная разница смежных значений:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Ваша задача - найти перестановку, которая максимизирует эту величину, учитывая положительное целое число N
. В случае N = 4
приведенного выше примера не является оптимальным (на самом деле, это минимальный). Мы можем достичь общей разности квадратов 18
при следующей перестановке (а также нескольких других):
[1, 4, 2, 3]
Ваш алгоритм должен работать за полиномиальное время (of N
). В частности, вы не можете просто вычислить общую квадратичную разницу всех перестановок.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вывод может быть в любом удобном, однозначном, плоском списке или строковом формате. Вы можете вернуть список со значениями от 0
до , N-1
а не 1
к N
.
Применяются стандартные правила игры в гольф .
Тестовые данные
Есть хорошее аналитическое решение этой проблемы. Например, все действительные решения для N = 10
эквивалентны следующему списку (до циклических сдвигов и реверсирования):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Я не хочу раскрывать слишком многое за этим (хотя, вероятно, этого достаточно, чтобы выяснить закономерность), поэтому вместо того, чтобы давать больше примеров, вы можете проверить, что ваши результаты имеют следующие общие квадратичные различия для данного N
:
N Total squared difference
1 0
2 2
3 6
4 18
5 36
6 66
7 106
8 162
9 232
10 322
33 11936
100 333202
333 12308236
1000 333332002
Это запись OEIS A064842 (которая также содержит ссылку на статью с решением этой проблемы, если вы застряли).
источник
(i<n/2||n%2)^i%2?i+1:n-i
.Python2,
10598 байт7 байтов сохранено благодаря комментарию @Dennis
Отредактированная версия 58 байт
Я уже верил, что это можно сделать как одну строчку, но логика была слишком сложной для меня. Увидев JavaScript-ответ @ user81655 и лямбда-нотацию в @Dennis Python-answer, я дал ему новую попытку.
Условие равно
К сожалению, все усилия по преобразованию экономят только
одинбайт по сравнению с прямым переводом(i<n/2or n%2)!=i%2
JavaScript-логики.источник
int()
вводить вокруг. Кроме того, вы можете поместить тело цикла for в ту же строку, что иfor...
.Python,
5149 байтСпасибо @xnor за 2 байта!
Попробуйте это на Ideone .
Как это устроено
Если i является числом в [0, ..., n - 1] , то ~ i% n = - (i + 1)% n = - (i + 1) + n = (n - 1) - i , это означает, что он отображает от 0 до n - 1 , от 1 до n - 2 и, в общем, от j- го элемента слева до j- го справа.
Как объяснено в моем ответе Jelly , мы можем построить вывод, посмотрев на более низкое значение среди i и ~ i% n , и выбрать i, если он четный, и ~ i% n, если он нечетный. Мы достигаем этого следующим образом.
Если минимум является четным,
min(i,~i%n)%-2
даст 0 , поэтому XOR результата с i даст i , а вычисление его остатка по модулю n вернет i .Если минимум нечетный,
min(i,~i%n)%-2
даст -1 , поэтому XOR результата с i даст ~ i , так что все выражение оценивается как ~ i% n по желанию.источник
(i^min(i,n+~i)%-2)%n
.PHP,
7776515049 байтИспользует кодировку ISO 8859-1.
Сборка первой половины массива выглядит так:
N+1-index
(9, 7, 5)1, 9, 3, 7, 5
Что касается второй половины массива, то к сумме добавляются внешние значения
N+1
, что означает, что вы можете получить соответствующее правильное значение, изN-[left value]
которого левое значение уже известно.Выполните так (это также показывает общую разницу в квадратах) (
-d
добавлено только для эстетики):echo
~ß
для получения пробела.источник
Python 2, 100
Я знаю, что уже есть ответ Python, но я думаю, что я мог бы сделать это по-другому.
И в качестве дополнения, чтобы проверить общий балл:
источник
def t(x,n):return sum((x[i]-x[i-1])**2for i in range(n))
использует неявный перенос отрицательных индексов и сохраняет 4 байта. Я знаю, не был частью конкурса. ;)CJam,
171514 байтовЭто функция, которая извлекает целое число n из стека и возвращает взамен перестановку [0… n-1] . Код использует тот же подход, что и мой ответ Jelly .
Попробуйте онлайн!
Как это устроено
источник
LISP, 86 байт
Входы функции позволяют выбрать начальное (m) и конечное (n) значения последовательности.
Для тестирования функции в соответствии с предоставленными образцами n фиксируется на N, а m на 1.
Вот код для проверки функции:
Попробуйте это на Ideone !
источник
Юлия, 39 байт
Это печатает перестановку 1: n . Перестановка 0: n-1 не требует ни стоимости, ни сохранения байтов:
Эта последняя версия является прямым портом моего ответа на Python .
источник
ES6, 77 байт
Эти
i&1
образцы цифры от крайних к середине.i&2
Добавляет их в начале или в конце результата в пар.источник
Р,
11786 байтредактировать заменил длинную версию с ошибкой реализацией алгоритма @Dennis 'Jelly
источник